Docs resource
CHANGELOG
GunjoUI のバージョンごとの変更履歴と公開前マイルストーンの記録です。
GunjoUI の変更履歴。フォーマットは Keep a Changelog に概ね準拠し、バージョニングは docs/versioning.md のポリシーに従う。
採用先影響度の表記:
- none — 既存採用先のコードに変更不要
- minor —
git grepで機械的に置換可能 - breaking — 構造変更が必要
[Unreleased]
採用先向けの要約(見た目が変わるもの)
コードを直さなくても、依存を上げると部品の余白とアイコンの大きさが変わる(部品のファイル 120 個)。公開 API(部品・props・export・トークン名)は変わらない。
- 余白・並びの間・大きさを 4px の倍数にそろえた:6px の間は 8px に、2px の間は 4px になる。題と説明の間や、ラベルと入力の間で、縦が 2〜4px 伸びる。1行の行とバッジの高さは保った(メニューの項目は 32px、バッジは 20px のまま)。
- 14px のアイコンを 16px にした:text-xs のバッジの中だけは 12px にした。
- 4つの部品は大きさが変わる:
MapControlButtonのsm、Tooltip、PlacePanelの閉じる釦、SegmentedControlのsm。 - outline の部品に背景と濃い枠が付く:前の枠は、どの面の上でもほぼ見えなかった。
- 入力欄に背景が付き、使えない状態の見せ方が変わる:使える欄は白い面(dark はカードの色)になる。使えない欄は灰の面・薄い枠・薄い字になる。
Added
- 4px グリッドの検査
npm run design:verify:grid4(影響: none):部品のクラスと、アイコンのsize={N}を読む。gap・space・padding・margin・位置・大きさが 4 の倍数でなければ落とす。例外は、12px 未満の線・点・目盛りと、4px 未満の位置ずらし(中心合わせ)だけ。design:verifyに含まれる。(#1057)
Changed
-
outline の部品に背景と濃い枠を付けた(影響: none・見た目が変わる)(#1067)
- 対象:
Button・Toggle・ToggleGroup・Badge・Tagの outline。 - 背景を透明から
bg-cardに、枠を--borderから--inputにした。 - 枠と面の比は、light 1.03〜1.24:1 から 3.05〜3.99:1 に、dark 1.00〜1.37:1 から 2.81〜4.80:1 になる。dark の
--secondaryの上だけ 3:1 に届かない。
- 対象:
-
入力欄に背景を付け、使えない状態の見せ方をそろえた(影響: none・見た目が変わる)(#1067)
- 対象:
Input・Textarea・Select・SearchInput・PasswordInput・NumberInput・CurrencyInput・PhoneInput・PostalCodeInput・ScanInput・TagInput・Mention・TimePicker・InputOTP・ChatInput・Checkbox・RadioGroupの外枠。 - 使える状態:背景を透明から
bg-cardにした。枠--inputは変えていない。 - 使えない状態:
bg-muted、枠は--inputの 40%、字はtext-muted-foreground。部品ごとに違っていた全体の不透明度(50%・40%・70%)は下げない。
- 対象:
-
部品を 4px グリッドにそろえた(影響: none・見た目が変わる)(#1057)
- 大きさが変わる4部品:
MapControlButtonのsm:34px から 40px(アイコンは 17px から 16px)Tooltip:上下の余白が 6px から 4px になり、高さが 32px から 28px になるPlacePanelの閉じる釦:44px から 48px(見出しの行の高さは変わらない)SegmentedControlのsm:区分が 28px から 24px(溝は 32px のまま)
- 地図の部品:
MapStatusCornerの外余白:横 14px・上 10px から、どちらも 12pxLayerMenu:行の間が 10px から 8px、外枠の余白が 6px から 4pxTimeTransport・DayBandの間:6px から 8pxTimelineScrubberの針の上端:18px から 20px
- メニューの項目:高さ 32px を
min-h-8で決め、上下の余白を 6px から 4px にした。アイコンの箱は 14px から 16px にした。- 対象:
DropdownMenu・ContextMenu・Menubar・Command・Mention・TreeView
- 対象:
-
Badge・Kbd・Tagの横の余白:Badge:10px から 8pxKbd:6px から 4pxTagのsm:6px から 8pxTagのlg:10px から 12px
-
ToolPill:余白を 6/10/14px から 8/8/12px にした。アイコンは 14/18/22px から 16/20/24px。 -
Code:インラインのコードの余白を、横 6.4px・上下 2.4px から、横 4px・上下なしにした。Markdown の中のコードと同じ形。 -
NumberInputの増減の釦:前は 18px+罫 1px+18px で、入力の 36px から 1px はみ出していた。いまは入力の高さを半分ずつ分ける。 - アイコンを1行目の字の中心に置く部品:
mt-0.5で 2px ずらす作りをやめ、1行目の高さの箱に置く作りにした。- 対象:
SafetyBanner・CheckboxCard・RadioCard・Itinerary・MetadataList・Timeline・PasswordRequirementListなど
- 対象:
- 大きさが変わる4部品:
-
--space-0-5・--space-1-5・--space-2-5・--space-3-5・--space-pxに「細部専用」と注記した(影響: none):線・点・中心合わせに使い、余白には使わない。public/tokens.cssの行末と/docs/spacingの表に出る。(#1057)
Fixed
- 改行できない長い語が、狭い画面でページを横に押し広げていた(影響: none):
MarkdownRendererはbreak-wordsをインラインのコードから外側の要素に移した。地の文の中で/でつないだ英字(List/Item/Trigger/Contentなど)も折り返す。Codeにも同じbreak-wordsを付けた(Markdown の中のコードと同じ形)。どちらも1行に入りきらない語のときだけ効くので、ふだんの見た目は変わらない。/docs/changelogは 375px で 86px はみ出していた。(#1065)
[0.2.0-beta.1] — 2026-10-11
0.1.0-beta.4以降の変更。破壊的変更が2件(どちらも影響 minor=import の書き換えと依存の追加で済む)あるので、真ん中の数字を上げた。見た目の変更は無い。
採用先向けの要約(書き換えが要るもの)
- 表・カレンダー・ドロワー・カルーセル・Markdown・
FloatingPanelを@gunjo/uiから読んでいる場合は、それぞれの入口(@gunjo/ui/tableなど)に書き換え、その依存を自分で入れる。下の「Removed」の表のとおり。書き換え忘れは型検査、依存の入れ忘れはバンドラが止める。 -
AIChatInput・AIChatMessageを使っている場合は、ChatInput・ChatMessageに名前を書き換える。 - どちらも使っていなければ、書き換えは要らない。root の入口だけを使う採用先は、入る依存が減る(空のプロジェクトで 202 → 146 パッケージ)。
Removed
-
⚠️ 破壊的変更:重いライブラリを使う9部品を root(
@gunjo/ui)の入口から外し、その依存8つを optional peer にした(影響: minor)—Buttonだけを使う採用先にも@tanstack/react-tableなどが入っていた(#492)。9部品は0.1.0-beta.2から出していた subpath(@gunjo/ui/tableなど)からだけ import できる。root から import しても重い依存を解決しに行かないので、使わない部品の依存は入れなくてよくなる(空のプロジェクトに root だけ入れた実測で、入るパッケージ 202 → 146・node_modules188.6MB → 146.7MB。2026-10-11)。-
移行手順:⑴ 下の表のとおり import の入口を書き換える。⑵ 使う入口の依存を
npm installする(optional peer は自動では入らない)。部品の props・見た目は変わらない。部品・型 書き換え先 入れる依存 DataTable・ActionDataTable・型ColumnDef・DataTablePropsなど@gunjo/ui/table@tanstack/react-tableCalendar・DatePicker・DateRangePicker@gunjo/ui/calendarreact-day-picker・date-fnsDrawer・DrawerContentなどのDrawer*@gunjo/ui/drawervaulCarousel・CarouselContentなどのCarousel*@gunjo/ui/carouselembla-carousel-reactMarkdownRenderer@gunjo/ui/markdownreact-markdown・remark-gfmFloatingPanel@gunjo/ui/motionframer-motion// 前 import { Button, DataTable, type ColumnDef } from "@gunjo/ui"; // 後 import { Button } from "@gunjo/ui"; import { DataTable, type ColumnDef } from "@gunjo/ui/table";書き換え忘れは型検査で
Module '"@gunjo/ui"' has no exported member 'DataTable'として出る。依存の入れ忘れはバンドラがCan't resolve '@tanstack/react-table'で止める。 -
採用先3つ(2026-10-11 に既定の枝を読んで確認):4px-hq-dashboard は
DataTableと型DataTablePropsの2つを書き換え、@tanstack/react-tableを入れる。design-qa(TooltipProviderだけ)と uixhero(npm から読んでいない)は書き換え不要。
-
-
⚠️ 破壊的変更:
AIChatInput・AIChatMessageを export から外した(影響: minor)— 中身はChatInput・ChatMessageの別名の再 export だけで、デザインソース・metadata・docs を持たない部品だった。採用先3つ(4px-hq-dashboard・design-qa・uixhero)では使われていない(2026-10-11 に各リポの既定の枝を読んで確認)。-
移行手順:名前を書き換えるだけ。props も見た目も同じ。
外した名前 書き換え先 AIChatInputChatInputAIChatInputProps(型)ChatInputPropsAIChatInputLabels(型)ChatInputLabelsAIChatMessageChatMessageAIChatMessageProps(型)ChatMessagePropsAIChatMessageRole(型)ChatMessageRoleAIChatMessageLabels(型)ChatMessageLabelsgit grep -lE 'AIChat(Input|Message)' | xargs sed -i '' -E 's/AIChat(Input|Message)/Chat\1/g'(macOS の sed。GNU sed は-i ''を-iに)で置き換えられる。
-
Fixed
- Server Component からの root の import で
next buildが落ちるという報告(#684)に、毎回の確かめ方を作った(影響: none)— 報告は0.1.0-beta.1・Next.js 16.2.10(Turbopack)でapp/layout.tsxからimport { TooltipProvider } from "@gunjo/ui"するとTypeError: createContext is not a functionになる、というものだった。2026-09-22 と 2026-10-11 に試したが、報告された版でも再現しなかった。CI で変更のたびに、npm packした tarball を空の Next.js アプリ(重い部品の依存は入れない)に入れ、その形で Turbopack と webpack の両方でnext buildする検査(npm run lib:check:rsc-consumer)を回す。/docs/installation・/docs/adoptionの「未解消」の注意書きを、この検査の説明に書き換えた(回避シムは「それでも出たら」として残した)。(#684) - 素の Node(バンドラを通さない読み込み)で
import("@gunjo/ui")がERR_MODULE_NOT_FOUNDになっていた(影響: none)—dist/の相対 import に拡張子が無かった(./components/inputs/Buttonなど)。ビルドの最後に.jsを付けるようにした(.d.tsも同じ)。Vitest・Jest を Node の解決で動かすテスト、自前の SSR、TypeScript のmoduleResolution: "nodenext"から読めるようになる。バンドラ(Next.js・Vite・esbuild など)経由の採用先はコードも出力も変わらない(esbuild で束ねた結果は前後でバイト単位で同じ)。CI でdist/の全 subpath を素の Node で読み込む検査(npm run lib:check:node-esm)を回す。(#717)
[0.1.0-beta.4] — 2026-10-10
0.1.0-beta.3以降の変更。破壊的変更(breaking)なし。公開 API(部品・props・export・トークン名)の削除・改名もない。全3項目とも影響 none。
採用先向けの要約(見た目が変わるもの)
コードを直さなくても、依存を上げると次の2点で画面の見た目が変わる。
- dark の地・文字・薄い面・枠・控えめな文字が、わずかに群青寄りになる — 地が少し青く、文字の白が少し落ち着く。light は変わらない。前の値に戻したい場合は、採用先の CSS で
.dark { … }の変数を上書きすれば戻る(下の「Changed」に前後の値)。 - 数字を並べる部品(
Table・DataTable・Badgeとグラフのカード)の数字が等幅になる — 表の数値・日付・件数の桁が上下でそろう。数字の幅が少し変わるので、狭い列で数字が折り返していないかを一度確かめてほしい。
Changed
-
npm の説明文の状態の言葉を beta に(影響: none)—
package.jsonのdescriptionのEarly alpha: API may change.をBeta: API may change before 1.0.にした。版の名乗り(0.1.0-beta.x)と食い違っていたため。(#1048) -
数字を並べて見せる部品の数字を等幅に(影響: none・見た目が変わる)—
Table・DataTable・Badge・AnalyticsCard・HeatmapChart・DonutChart・GaugeChart・RadialBarChart・MiniDistributionBarCard・LabeledDonutCard・ConcentricProgressCard・SegmentedGaugeCard・SegmentTimelineCardの根の要素にtabular-numsを付けた。表の数値・日付・件数・バッジの数の桁が上下でそろう(数字の幅が少し変わる。文字には効かない)。npm run design:verify:tabular-numsが見張る。(#1040) -
dark の中立色5つを群青寄りに(影響: none・見た目が変わる)—
--background222.2 84% 4.9%→230 88% 6.5%、--foreground(と--card-foreground・--popover-foreground・--secondary-foreground)210 40% 98%→230 30% 90.5%、--mutedと--border217.2 32.6% 17.5%→230 20% 18%、--muted-foreground215 20.2% 65.1%→230 16% 67%。もとは shadcn/ui v3 slate の既定と同じ値だった。shadcn と Tailwind の既製の色から CIEDE2000 で 3.3 以上離した。面の段差はほぼ同じ。文字は白の近くに既製の色が密集しているので少し暗くなる(地の上で 19.09:1 → 15.45:1)。前の値に戻したい場合は、採用先の CSS で.dark { … }の変数を上書きすれば戻る(トークン名は変えていない)。(#1040)
[0.1.0-beta.3] — 2026-09-25
0.1.0-beta.2以降の変更。構造変更を要する破壊的変更(breaking)なし。公開 API(部品・props・export・トークン名)の削除・改名もない。新しい部品と props はすべて opt-in(影響: none)。影響 minor は左端の色帯をやめた4部品(公開 API は不変)。
採用先向けの要約(見た目が変わるもの)
コードを直さなくても、依存を上げると画面の見た目が変わる。上げたあとに一度目で確かめてほしい点は次の4つ。
- 枠線をやめて面で区切った(#1024 / #1027 / #1030 / #1033)—
Card・Dialog・Popover・Badge・Sidebarなど、塗りのある部品の 1px の枠を透明にし、区切りは親の面との濃淡だけにした(枠の幅は残すのでレイアウトはずれない)。ハイコントラスト(prefers-contrast: more・Windows のforced-colors)では枠が戻る。表の罫線・outlineの Badge など、枠そのものが意味の部品は据え置き。 - light の地が白から淡い灰青に(#1024)—
--backgroundが0 0% 100%→210 40% 96%(#f1f5f9)。--cardは白のままなので、カードが地から浮いて見える。あわせて--muted・--secondary・淡色5つ(--*-subtle)を濃くした。dark は--card・--popover・--secondary・--info-subtle・--destructive-subtleを明るくした(#1022 / #1027 / #1034)。 - 入力欄の縁
--inputを、どの面の上でも 3:1 に(#1034)— light214 32% 91%→215 20% 52%・dark217.2 32.6% 17.5%→215 20% 51%。入力欄の縁がはっきり濃くなる。border-input/bg-inputを入力欄以外(飾りの線・溝など)に流用している採用先の画面は、線が濃く見えるので確かめてほしい(Slider/RangeSliderの溝は--mutedに移した)。 - 自前の画面で
bg-backgroundと枠線だけで区切っていた箇所は、地の色が変わるので段差を確かめてほしい。前の値に戻したい場合は、採用先の CSS で:root { --background: 0 0% 100%; }のように変数を上書きすれば戻る(トークン名は変えていない)。
Added
-
portalContainerを5部品に追加(影響: none)—NotificationCenter・ChatInput(選択肢のポップオーバーとモデルのメニュー)・Combobox・DatePicker・DateRangePickerが、ポップアップを出す先の要素を受け取れるようになった(既定は従来どおりdocument.body)。枠のあるプレビューの中にポップアップを収めたいときに使う。(#1005) -
ハイコントラスト時の枠線と、面で区切るクラス
.gunjo-surface(影響: none)—@media (prefers-contrast: more)のとき--borderと--inputを 3:1 以上へ上げる(light215 20% 40%・dark215 20% 55%)。新しいトークン名は足さず、既存の2つを差し替えるだけ。public/tokens.css(@gunjo/ui/tokens.css)にも同じブロックを入れた。.gunjo-surface(bg-card+透明な 1px の枠・ハイコントラストで--border・forced-colorsでCanvasTextに戻る)は@gunjo/ui/stylesに入っているが、部品の中では使っていない(部品は要素ごとにborder-transparent contrast-more:border-border forced-colors:border-[CanvasText]を書く形)。(#1022 / #1024 / #1034) -
RangeBar(影響: none)— 全体の幅(min〜max)の中で、区間(low〜high)がどこにあるかを1本の帯で見せる Display 部品。週間予報の最低〜最高気温、プランごとの価格帯、拠点ごとの営業時間など、並べる行が同じmin/maxを持つことで位置で比べられる。数字は帯の外に呼び出し側が置く。variant="gradient"は全体に1本の色の段(primary → info → warning)を敷いて区間の部分だけを見せる=同じ値はどの行でも同じ色(区間ごとにやり直すと行ごとに色が変わるため)。solidは主色。両端が同じでも帯の高さぶんの点を出し、nullのあいだは下地だけ。role="img"で「気温: 20°–28°」と読む。HTML/CSS(SVG なし)。Meter(0から1つの値)・DistributionBar(構成比)・RangeSlider(入力)では描けない形のため新設。(#998) -
MapStatusCorner(影響: none)— 地図の右上に、いま何を見ているか(視点・昼夜・雲の時刻・地形の出どころ・倍率)を短い行で重ねる Display 部品。左上の字(lead)を float で浮かせ、行は1行ずつ折らない塊にする=細い画面では、入りきらない行が左の字の下へ回り、左の字と並ぶのは頭の1〜2行だけになる(左右2列の flex だと、行ごと押し出されたり語の最後の1字が落ちたりする)。startInsetで左に方位磁針などの場所を空ける。字は地図の上の字の段text-canvas-2xs(特例のページ/docs/exceptions・canvas-text-allowlist.jsonに追加)に縁取り。ポインタを受けず、下の地図はそのまま動かせる。(#998) -
TimelineScrubber(影響: none)— 過去(実測)から未来(予測)までを1本の目盛りで行き来する Inputs 部品。中央の印は動かず、目盛りのほうが動く(ドラッグは相対・touch-action: pan-y・目盛りを押すとそのコマへ・両端はぼかす)。lastObservedIndexで実況と予報を分け、札の語(Badge)・境目の点線・色の3つで示す(色だけにしない)。再生はstepIntervalごとに1コマ進み、最後で止まる(playingは制御・非制御の両方)。時計は持たず、持つのは再生のタイマーだけ=「いま」は呼び出し側が決める(TimeTransport と同じ決まり)。role="slider"で矢印・PageUp / PageDown・Home / End、読み上げは「11:05 · 予報」。まだ届いていないコマ(pending)は薄く描く。(#998) -
待ちの表示を3つ追加:
ProgressDialog・ActionProgress/FormActionProgress・RouteProgress(影響: none)。3つとも、本当の進み具合が分からないときは%を出さない(Progressのindeterminateを使う)。prefers-reduced-motion: reduce(または祖先のdata-motion="reduce")では流れが止まり、淡い色の帯になる。ダイアログの2つは、portalContainerを渡すとその中に並べて描く。(#996)ProgressDialog(Overlay):数十秒以上かかる処理の待機画面(Dialogを合成)。16:9 の差し替えできる絵(media)、いまの状態を伝える一文(status)、自由に中身を入れられる補助の枠(aside)、キャンセルのボタン(onCancel)を持つ。variant="overlay"で札(badge)と題を絵の上に重ねる。Esc・外側のクリック・閉じるボタンでは閉じず、閉じるのは呼び出し側のコード。value/maxを渡したときだけ割合でバーが伸びる。ActionProgress(Feedback):保存や送信のような短い処理のあいだ、画面を塞ぐ小さなダイアログ。既定で 350ms 待ってから出し、出たら 500ms は消さない(delayMs/minVisibleMs)。FormActionProgressは、置かれた form の送信中を React 19 のuseFormStatusで読む。RouteProgress(Feedback):ページの移動中に画面の上端へ出す細いバー。フレームワークに依存しない。placement="container"で、位置指定した親要素の上端にも置ける。LocaleProviderの翻訳文字列にcancel/loadingを追加した。
-
Progressにindeterminateを追加(影響: none)。本当の進み具合が分からないとき、短い帯が流れる表示にする。aria-valuenow/aria-valuemaxを出さないので、スクリーンリーダーが架空の割合を読まない。スタイルは@gunjo/ui/styles(globals.css)に入っている。(#996) -
地図・canvas の上に重ねる字の段
text-canvas-sm/text-canvas-xs/text-canvas-2xs(11 / 10 / 9.5px・影響: none)—text-xs(12px)より小さい3段。地図・canvas・画像の上に重ねる字だけに使う(縮尺バーの「20 km」、地図の上のボタンの印、レイヤーのメニューの組の見出し)。ほかの画面の字の段は変えない(2026-09-19 KeEem 決定)。本文の段を下に伸ばすのではなく、用途を名前に載せた別の段にした=text-2xsのような名前だと本文の下に使われてしまうため。値は rem(読み手の文字サイズ設定に追従)。宣言元はscripts/design-sync/token-scales.mjsのCANVAS_TEXT_STEPSで、Tailwind へはtailwind-theme-extend.cjsのfontSize(preset 経由で採用先にもユーティリティが出る)、標準版シートtokens.cssへは--text-canvas-*。⚠️src/globals.cssには入れていない(#969 と同じ理由)。使ってよいファイルはdesign/policy/canvas-text-allowlist.jsonに理由つきで列挙し、それ以外で使うとdesign:verify:scale-tokensが落ちる。Typography の段には載せず、新設の 特例のページ/docs/exceptions(Tokens の下)の1件目として載せた=通常の段とは別に、使う面を限って認めたものを並べる置き場。/docs/typographyには「12px 未満は特例のページに載せたものだけ」と1行だけ書いた。(#994 / #976) -
MapControlButton(影響: none)— 地図や canvas の上に浮かせる、アイコンだけの丸いボタンの Inputs 部品。寄る・引く・選んだ地点へ・現在地へ。後ろが紙面ではなく写真なので、半透明の地・背景のぼかし・細い縁を自分で持つ(Button の変種にしない理由)。状態はpressed(aria-pressed)・disabledとdisabledReason(キーボードでも理由に届く)・status="busy"(アイコンが明滅・aria-busy・動きを減らす設定では止まる)・status="error"(注意の縁と!の印)。どれも色だけに載せない。失敗の印を消す時計は持たない(呼び出し側が戻す)。大きさはdefault44px・sm34px(下限)・lg48px。labelが読み上げ名とツールチップを兼ねる。(#994) -
ScaleBar(影響: none)— いまの縮尺を「20 km」の字と、その長さの線で見せる Display 部品。倍率(×250)は出さない。距離は 1・2・5 × 10ⁿ に丸め、端数は線の長さが引き受ける。丸めは純粋な関数niceScale()として公開。metersPerPixelがnullのあいだは「—」だけで線は出さない(推測しない)。字はtext-canvas-2xsにページの地の色の縁取り。role="img"で「Scale: 20 km」と読まれる。(#994) -
LayerMenu(影響: none)— 地図に重ねるものを組に分けて表示・非表示にする Inputs 部品。タップで開き、長押し(既定 450ms)でまとめて消す/もう一度で元の組み合わせに戻す=画面が大きく変わる操作をタップに乗せない。同じ働きを先頭の「すべて」の行に置く(長押しを知らない人・キーボードのため)。「すべて」は3態(すべて表示・すべて非表示・一部だけ=横棒・aria-pressed="mixed")で、ほかの行と同じ印を持つ。いま切り替えられないもの(disabledReason)は行と状態を残して理由を一言出し、「すべて」も触らない。行を押しても閉じない。inlineでボタンなしの一覧だけ(広い画面の横の欄に)。引き金はMapControlButton。(#994) -
PlacePanel(影響: none)— 地図で選んだ1か所の詳細を、画面の下から出す Overlay 部品。行は最初から全部出し、値だけを骨組みにして待つ(値が届くたびに行を足すと欄がガタつき、地図まで動くため)。各値はundefined=読み込み中・null=取れなかった(「—」で確定し光らない)・それ以外=値、の3態を値だけで言い分ける。aria-busyつき。Sheet にしない=Sheet は後ろを止める面で、地図を動かせなくなる。置き場所は呼び出し側。2列にするかは欄自身の幅で決める(container query)。(#994) -
LiveBadge(影響: none)— 「これはいまの値です」を示す小さな札の Display 部品。枠と言葉(既定LIVE)と、ゆっくり明滅する点。実時間から外れているときは札を引っ込め、その場所で「いつの値か」(detached)を答える。detachedが渡されていなければ何も描かない(いつの値か分からないのに札を残すと、古い値が現在の値に見えるため)。⭐ 時計を持たず、何も比較しない=「いまの値か」は締切・再接続・バッファなど画面ごとの事情で決まるので、判断は呼び出し側(TimeTransportと同じ決まり)。⚠️ 状態を色と点だけに載せない(札には必ず言葉が乗り、点は飾り)。⚠️ 動きを減らす設定(prefers-reduced-motion: reduce)では明滅しない(点は残し、明滅だけを止める)。既定では読み上げ領域にしない=role="status"を既定で付けると再接続のたびに読み上げへ割り込むため、必要な画面でだけ呼び出し側が付ける(#858 / #936 と同じ判断)。Badgeを組んで作っているので枠・色・大きさの段は共通。TimeTransportの実時間の札をこの部品に差し替えた(同じ形の作り置きを2か所に残さないため。TimeTransportの公開 API は不変で、札に点が付くぶんだけ見た目が変わる)。鮮度の話でない状態はBadge、締切までの残りはExpiryBadge、値を動かすならTimeTransport。(#981) -
DayBand(影響: none)— 1日を1本の帯にして「1日の中の位置を、面で見せる」ための Inputs 部品。時間帯(phases[])を面で敷き、節目(marks[])を線と文字で置き、「いま」(now)とつまみ(value)を重ねる。⭐ 1日について何も計算しない(日の出・日の入も「いま」も呼び出し側が渡す数)ので、天文にも暦にも縛られず、当番表・稼働時間帯・営業時間に同じ形が使える。時計も持たない(TimeTransport/Stringlineと同じ決まり)。TimeTransportのscrubberスロットに入る面はこれ。時間帯の色はトーン名を 面のトークン(--*-subtle)へ解決する=時間帯は下地で、その上に印とつまみが乗るため。空のような絵としての色は任意の CSS 色で渡せる。掴んで動かす作法は2つ(scrub="absolute"は触った位置がそのまま時刻/"relative"は掴んだ距離ぶんだけ動き、0時をまたいで帯の外の値も返す)。指で触ったときは押した瞬間には確定せず、動かしたときか離したときに確定する(縦スクロールの誤爆を防ぐ・touch-action: pan-y)。role="slider"で矢印・Shift+矢印・PageUp / PageDown・Home / End が効き、読み上げには時刻と時間帯の名前が乗る(「10:40 · 昼」)ので、色だけに意味が載らない。印のラベルは帯の上、時刻の数字は帯の下の別の行に置き、ぶつかるラベルは後から宣言されたほうが文字を落とす(線は残る)。触れる帯の高さは 44px(size="sm"は 24px の見せるだけ用)。任意の区間ならSegmentTimelineCard、複数の日ならWeekView/ScheduleGrid、ただ値を選ぶだけならSlider。(#979) -
TimeTransport(影響: none)— 連続した値を「段階つきで動かし、いまへ戻る」ための Inputs 部品。大きい表示・再生と一時停止・名前をつけた速さの段(speeds[])・符号つきの飛ばし(jumps[])・実時間かどうかの札・ひと押しの「いまへ戻る」を1枚にまとめる。⭐ 時計を内側に持たない(valueを受け取りonValueChangeで返すだけ)ので、サーバと最初のクライアント描画が一致し、試験で時間を止められる(Stringlineと同じ決まり)。速さは倍率の連続値ではなく呼び出し側が名前をつけた段=「1× が1秒なのか1日なのか」は部品には決められないため。実時間かどうかはnowから導き(liveで上書き可)、色だけには載せず必ず文字の札で言う。nowもliveも無いときは札も「いまへ戻る」も出さない(推測しない)。触れるところは 44px。掴んで動かす面はscrubberスロットで受ける。ログの再生・監視画面の巻き戻し・シミュレーションの時刻送りに使う。値を選ぶだけならSlider、絶対の時刻ならTimePicker/DatePicker、時間を見せるだけならTimeline/Stringline/Gantt。(#977) -
tokens.cssに余白と字の段階(影響: none)— npm も CDN も使えない環境向けの標準版シートpublic/tokens.css(@gunjo/ui/tokens.css/ https://www.gunjo.jp/tokens.css)に、これまで入っていなかった余白--space-*・字--text-*/--leading-*/--font-weight-*・文字種--font-sans/--font-mono/--font-mincho・密度の決まり--control-h/--text-ui/--text-proseを追加。Tailwind を使わない採用先が docs の数値を手で写す必要がなくなる。段階名は Tailwind と同じで--space-2は 8px(gap-2と同じ 2 段目)= 2px ではない。小数の段はハイフン(--space-0-5= 2px・カスタムプロパティ名に素の.は置けないため)。値は rem なので読み手のブラウザの文字サイズ設定に追従する(px は行末コメントで併記)。⚠️ これらの名前は Tailwind v4 が所有する名前空間なので src/globals.cssには入れていない(globals.css はbase層=Tailwind のtheme層に後勝ちするため、書くと全採用先のユーティリティを書き換えてしまう。実測:html{font-size:20px}で.text-smが 17.5px から 14px 固定に変わる)。既存の採用先の見た目は変わらない。段階はscripts/design-sync/token-scales.mjsが唯一の宣言元で、新しいdesign:verify:scale-tokensが Tailwind 本体のtheme.cssと突き合わせる(上流がスケールを変えたら CI が落ちる)。/docs/spacingと/docs/typographyの手写し配列も同じ生成表からの読み出しに変更。(#969) -
StatusLevel(影響: none)— 順序のある段(平常運転<遅延<迂回<運休、空いています<やや混雑<混雑、低<中<高<緊急、good<watch<bad)を表す Display 部品。段はlevels[]に軽い順で1回だけ書き、同じ配列がピルと並べ替え(compareStatusLevel)と全体の導出(highestStatusLevel)を動かすので、順序の書き写しが1か所に減る。段バーは意味トーンではなく前景色と枠線色の濃淡で描くため色を落としても段を数えられ(明色 13 対 230・実測)、読み上げには「4段階中 3段目」が乗る。順序のない状態は従来どおりBadge、工程の位置はStepper/ApprovalSteps/RouteStops。純関数statusLevelIndex/statusLevelStep/compareStatusLevel/highestStatusLevelを同梱。Badgeの挙動と公開 API は不変。(#376) -
StickyNoticeBar(影響: none)— サイト告知を body portal +fixedで上端または下端へ追従表示する Feedback 部品。edgeは必須で既定値なし。同一 document の単一スロットに限定し、複数 mount 時は先着1件だけを表示して開発エラーを記録する。長文折り返し、アクション、44px の閉じるボタン、上下セーフエリア、ライト/ダークに対応。(#810)
Changed
-
SparklineChartに「いまの位置」と両端の札を追加(影響: none)—currentIndexで時間の軸の上の1点に点と細い縦線を置く(前後15日の線で今日がどこかを示す。referenceValueは値の高さの横線なので別物)。currentLabelはその点の読み上げ名。startLabel/endLabelで両端の下に小さな札(「15日前」「15日後」)を、線とは別の段に出す(線を縮めない)。点と縦線は HTML で重ねる。AnalyticsCardの中に入れれば、値+一言+小さな推移のカードになる。描画の土台を線の箱と札の段に分けたが、札を渡さなければ見た目は従来どおり。(#998) -
StickyNoticeBarに字の見送り釦と、語の途中で折らない指定を追加(影響: none)—dismissTextを渡すと × の代わりに字の釦(「見送る」)を出す=時刻が迫ったときの知らせのように、見送ることも選択肢の1つである場合に使う(字がそのまま読み上げ名)。textWrap="phrase"は語の途中で折らない(word-break: keep-all+overflow-wrap: anywhere)=日本語は空白・句読点・<wbr>でだけ折れ、「出ま/す」にならない。既定は従来どおりanywhere。(#998) -
Skeletonが動きを減らす設定で明滅しなくなった(影響: none)—prefers-reduced-motion: reduceのときanimate-pulseを止める(motion-reduce:animate-none)。PlacePanelの骨組みで使うため、#975 の1つ目だけを先に直した(値だけを骨組みにする形・読み上げの口は #975 に残る)。(#994 / #975) -
ListCardの severity 表現を意味トークンの境界線+淡い背景に変更(影響: minor)— 左端の色帯を廃止し、Alert/Bannerと同じ意味トークンの境界線と淡い背景で重大度を補助する。状態の意味は従来どおりBadgeと文言が担い、severityのプロパティ名・受け付ける値・型の公開方法は不変。 -
ActionQueueの severity 表現から左端の太い色帯を廃止(影響: minor)— 既存の全周の意味境界線+淡い背景は維持し、Alert/Banner/ListCardと同じ面表現に統一する。重大度のアイコン・読み上げラベル・ソート順と公開 API は不変。 -
StatusBoardの tone 表現を意味トークンの境界線+淡い背景に変更(影響: minor)— 左端の色帯を廃止し、tone ありのタイルは全周の意味境界線+淡い背景、neutral / default は従来どおり素の境界線+カード背景で表す。選択は ring、状態の意味は従来どおりアイコン+ラベルが担い、公開 API は不変。 -
SidebarItemの祖先パス表現を文字の強調へ変更(影響: minor)— 左端の縦ピルを廃止し、onPathはfont-mediumと従来の文字色で示す。アクティブ項目自体の表現、階層・開閉・件数・操作と公開 API は不変。 -
枠をやめて面で区切る(影響: none・見た目が変わる)— 塗りのある面の 1px の枠を、
border-transparent contrast-more:border-border forced-colors:border-[CanvasText]に置き換えた(src/componentsの 162 か所)。枠の幅は残すので、ハイコントラストで枠が戻ってもレイアウトはずれない。枠そのものが意味の面(表・格子の罫線、outlineの Badge、Checkbox の checked、Switch など)はdesign/policy/surface-border-exclusions.jsonに理由つきで登録して据え置いた。枠を外すと親と同じ色で消える面は、先に塗りを上げた。(#1024 / #1027 / #1030 / #1033)Dialog・AlertDialog・Drawer・ShareModalの本体、Header・Footer・Menubar・RightRail・PageAside・DocumentPager・InspectorPanel・DeviceFrame・ChatPanel・PageHeader・DesktopPageHeader、各テンプレートの上・横の欄:bg-background→bg-card(dark ではダイアログの本体が自分の幕とほぼ同じ色だった)- 半透明の
bg-muted/10〜/60・bg-accent/40・bg-destructive-subtle/40(37 か所):不透明のbg-mutedなどへ。DatePicker/DateRangePickerの footer もbg-muted Sidebar:border-r+bg-muted/40→ 透明な枠 +bg-muted。Badgeの塗りのある6つの variant:border-transparent(outlineは据え置き)- チャートの内訳の行(
ConcentricProgressCard・MiniDistributionBarCard・SegmentTimelineCard・SegmentedGaugeCard・LabeledDonutCard・ChartLegend):選択を枠(border-foreground)ではなくbg-muted+shadow-smで示す。カードの中の行・小箱はbg-card→bg-background - 二重の印だった枠を外した:
CheckboxCard・RadioCard・Carousel・PricingTemplate(ring が残る)、FilterChips・SeatMap(bg-primaryが残る) - 入れ子で親と同じ色になっていた面(#1033):
ChoroplethMap・QuadrantMatrixの行はbg-muted、Tableの器はbg-cardの中では塗らない、選択中のTableRow・KanbanBoardの列の件数・FilterButtonの件数・ListCard/StatusBoard/LineageGraphの調子の面の中の Badge はbg-background、TabsTriggerの中のbg-secondaryはbg-card DocumentPager:上の罫線を外した(前後のカードの面が境目を作る)
-
トークンの値を変えた(light)(影響: none・見た目が変わる)—
--background0 0% 100%→210 40% 96%、--muted210 40% 96%→213 32% 89%、--secondary210 40% 96%→212 32% 92%、--primary-subtle220 60% 96%→220 70% 90%、--info-subtle214 100% 97%→214 95% 90%、--success-subtle138 76% 97%→141 60% 86%、--warning-subtle48 96% 89%→45 95% 80%、--destructive-subtle0 86% 97%→0 90% 92%、--input214 32% 91%→215 20% 52%。--card・--popoverは白のまま。トークン名は不変。public/tokens.cssも同じ値。(#1024 / #1034) -
トークンの値を変えた(dark)(影響: none・見た目が変わる)—
--card222.2 84% 4.9%→217 33% 13%(地と同じ色だった)、--popover222.2 84% 4.9%→217 33% 22%(地 < カード < 浮いた面 の順に)、--secondary217.2 32.6% 17.5%→217 32.6% 24%(--mutedと同じ色だった)、--info-subtle220 47% 16%→220 47% 20%、--destructive-subtle0 50% 16%→0 50% 20%、--input217.2 32.6% 17.5%→215 20% 51%。文字とのコントラストはどれも 4.5:1 以上を保つ。(#1022 / #1027 / #1034) -
Slider/RangeSliderの空の溝を--inputから--mutedへ(影響: none)—--inputを縁の色として 3:1 まで濃くしたため、溝に使い続けると埋まった部分(primary)との差が縮み、値の位置が読めなくなる。trackClassNameの受け口は不変。(#1034) -
SidebarItemの hover をbg-mutedからbg-foreground/5へ(影響: none)—Sidebar本体がbg-mutedになったので、hover が本体と同じ色で見えなかった。通常の行と、いまいる項目の親の行の2か所。(#1034) -
面で区切るのを守る検査を追加(内部・影響: none)—
design:verifyにhigh-contrast-border(ハイコントラストの--borderが全部の面の上で 3:1 以上)・input-border(--inputが入れ物の面すべての上で 3:1 以上)・slider-track(溝と埋まった部分が 3:1 以上)・surface-steps(全ページの本番ビルドで、枠を透明にした面が親と 1.05:1 未満になっていない)を足し、docs:audit:surface-borders(塗りのある面に枠が残っていない・ハイコントラストで戻す指定が欠けていない)を数えるだけの報告から落ちる門番にした。例外はdesign/policy/surface-border-exclusions.jsonに理由つきで登録する。(#1022 / #1024 / #1027 / #1030 / #1033 / #1034)
Fixed
-
MarkdownRendererのほぼ全要素にnode="[object Object]"が出ていた(影響: none)— react-markdown v10 が渡すnodeを DOM へ展開していた。既定の18部品すべてで取り除いた。(#856) -
MarkdownRendererのインライン code の長い1語で、375px 幅のページが横に溢れた(影響: none)— backtick の code にbreak-wordsを付けた(fenced の code block は従来どおり折らずに横スクロール)。(#895) -
Bannerのactionが日本語のラベルで1文字幅まで縮み、ボタンから字がはみ出た(影響: none)—actionの枠をshrink-0にし、縮むのは本文(従来どおり1行で省略)だけにした。(#874 / #1018)
[0.1.0-beta.2] — 2026-07-27
0.1.0-beta.1以降の変更。破壊的変更(構造変更を要する break)なし。新機能はすべて opt-in で既定挙動は据え置き(影響: none)。例外は下記 Changed の2件のみ、いずれも影響 minor・移行パス明記 —RouteStopsの既定ラベル変更(1プロップで復元可能)とDashboardTemplateのシェル所有化(ラッパーを外して行だけ渡す機械的変更)。
Changed
-
DashboardTemplateがダッシュボードのシェルを自前で所有(影響: minor)— 旧実装の sidebar スロットは固定hidden border-r w-64 md:blockの枠で、<Sidebar>を開いたまま固定して折りたたみ不能にし、md未満ではナビが丸ごと消えて携帯で画面遷移できなかった。テンプレート自身がSidebarProvider/Sidebar/SidebarBodyを組み、小画面では同じナビ行をSheetで開くように変更。呼び出し側はsidebarに「行」(通常はSidebarItem群)だけを渡す。新 props:sidebarHeader/sidebarFooter(ブランド行・アカウント行)・collapsible(既定true)・defaultCollapsed/collapsed/onCollapsedChange・navLabel・navOpen/onNavOpenChange。外枠はmin-h-screen→h-dvh+overflow-hidden(レールには確定高さの親が要り、ダッシュボードはページではなく main 列がスクロールするため)。移行:sidebar={<Sidebar><SidebarBody>…</SidebarBody></Sidebar>}のように完成品を渡していた場合はラッパーを外して行だけ渡す。SidebarHeader/SidebarFooterに入れていた内容はsidebarHeader/sidebarFooterへ。行だけ渡していた場合は変更不要で、折りたたみと小画面ナビが自動で付く。(#692, #697) - design-verify の arbitrary color / shadow クラスガードを復活(内部・影響: none)—
ARBITRARY_COLOR_CLASS_PATTERN/ARBITRARY_SHADOW_CLASS_PATTERNが]直後の\b(充足不能な境界)で一度もマッチしていなかったのを修正。例外リストはreason/addedOn/expiresOnを必須化し、期限切れは fail するため、ポリシーが再び静かに死ぬことはない。復活で検出された実バグは下記 Fixed の loyalty-summary-card を参照。(#698, #702) -
Statistic/StatGroup/StatusBoard/MeterがSemanticToneを直接受理(影響: none)—Statisticのpositive / negative / neutralはsuccess / destructive / muted、StatusBoardのdangerはdestructiveへ内部正規化し、0.1.x の互換 alias として維持。trend/goodWhenの方向・評価ロジックは不変。StatusBoard.problemTonesは正規化後に判定し、Meterはdefaultを muted の見た目で描画する。Badgeは presentation variant、ExpiryBadgeは domain state の公開 API を維持。旧値の撤去は次 major 以降に利用調査+codemod 付きで再判断。(#673) -
RouteStopsの既定ステータスラベルを中立語彙に(影響: minor)— ステータスキー(pending/current/completed/failed/delayed)は汎用なのに、既定ラベルだけが配送依存(未配 / 配送中 / 不在)だったのを、ドメイン中立な未着手 / 進行中 / 完了 / 失敗 / 遅延に変更。配送・介護・製造など各ドメインは従来どおりstatusLabelsで上書きする設計。移行:配送用途はstatusLabels={{ pending: "未配", current: "配送中", failed: "不在" }}の1プロップで従来表示を復元(completed/delayedは既に中立で変更なし)。マーカーの色・アイコン、aria-current、予実Deltaは不変。(#282)
Added
-
useSidebarCollapsed()(影響: none)—useSidebarの非例外版。SidebarProviderの外では throw せずnullを返すので、Sidebar 内外どちらに置かれても成立する部品(SidebarItem自身がこれを使う)が折りたたみ状態に追従できる。(#692, #697) -
LocaleProviderの文字列にnavigationを追加(影響: none)—DashboardTemplateのナビ領域・開閉ボタン・Sheet のアクセシブル名(en:Navigation/ ja:ナビゲーション)。navLabelprop で個別上書き可。(#697) - 純 CSS 資産の subpath export(影響: none)— npm 不可環境向けに gunjo.jp の固定 URL で配布している Tailwind 非依存の純 CSS 資産をパッケージにも同梱し、
@gunjo/ui/tokens.css(純 CSS トークン)・@gunjo/ui/patterns.css(gj-パターンクラス)として import できるようにした。中身は配信版と同一(同じ SSOT から生成・drift 検証つき)。固定 URL 配布(/docs/no-npm)は従来どおり併存。(#684) - subpath export の追加(影響: none)— 重い runtime を引く部品を、依存クラスタ単位の subpath から narrow に import できるようにした:
@gunjo/ui/table(DataTable / ActionDataTable +ColumnDef・@tanstack/react-table)、@gunjo/ui/calendar(DatePicker / DateRangePicker / Calendar・react-day-picker)、@gunjo/ui/drawer(vaul)、@gunjo/ui/carousel(embla-carousel-react)、@gunjo/ui/markdown(react-markdown)、@gunjo/ui/motion(FloatingPanel・framer-motion)。これらは 0.1.x では root barrel(@gunjo/ui)からも従来どおり import できる(Phase 1・純追加)。0.2.0で root barrel からの重部品 export を撤去し、該当依存を optional peer 化する予定(Phase 2・破壊枠・移行表を別途提示)。(#492) -
DesktopPageHeader(影響: none)— デスクトップ業務コンソールの各画面に置く、eyebrow・タイトル・説明・末尾アクションの軽量見出しバー。アプリ全体のクロームであるHeader、モバイル app-bar のPageHeaderと責務を分離する。(#397) -
OccupancyMeter(影響: none)—Meterの上にラベルとvalue / maxreadout をまとめた、満席率・稼働率・設備利用率向けの薄い合成。既定はdirection="neutral"で低い値を失敗色にせず、target・tone・formatValue・sizeはMeterへ転送する。(#343) -
CheckboxCard/CheckboxCardGroup(影響: none)—RadioCardの複数選択版。各カードは独立したrole="checkbox"/ Tab stop と角丸スクエアのチェックを持ち、配列の制御・非制御選択、フォーム送信用name、無効化理由ツールチップに対応。矢印キーの roving navigation は行わない。(#378) -
Meterのdirection="neutral"(影響: none)— 時間で埋まっていくゲージ(満席率・稼働率)向けの中立モード。判定色を付けず(primary 一定)、targetは参照マーカーのみ。higher-is-betterは目標未達を赤にするためサービス開始直後の低い値が誤警報になる問題(cold-test #95)を、意味論の明確な名前付きモードで回避できる。tone上書きは従来どおり優先。docs に3+1モードのトーン意味論を明記。(#343) -
SignedRecordの複数署名(影響: none)—requiredSigners(当事者一覧)を渡すと複数署名モードに。全員が署名するまで下書きのまま編集でき、最後の署名でロックする(単一署名は従来どおり1回でロック)。value.signaturesに署名を蓄積し、当事者ごとの署名状況と進捗(N/M)を表示。同一人物の二重署名と当事者外の署名は理由つきで不可。追記の author は当事者ラベルで表示。requiredSigners未指定なら従来の挙動のまま。(#259) -
Toastのdescription/action(影響: none)— 2行目の補足と操作ボタン1つを追加し、ToastActionを公開。useToast().showToastはオブジェクト形{ message, description, type, duration, action }のオーバーロードも受け付ける(従来の位置引数呼び出しはそのまま動く)。action付きでduration未指定なら、押す前に消えないよう自動クローズを延長。(#301) -
DataTableの合計 / フッター行(影響: none)— いずれかの列に TanStack のfooterを定義すると<tfoot>を描画。footer(({ table }) => …)でgetFilteredRowModel()を使えばフィルタ後の合計になる(表示中ページだけではない)。footer未定義なら従来どおり何も出ない。card モード(renderCard)には出ない。(#255) -
SheetBody/DialogBody(影響: none)— 長いフォーム用のスクロール領域。Content の直下に置いた時だけ高さ制限つき flex 列へ切り替え、ヘッダー / フッターを固定して中央だけスクロールする。Body が無い既存の Sheet / Dialog は出力不変。(#293) -
PersonCellのhref/onActivate(影響: none)— セル全体を activation target に(ルートが<a>/<button>になり chevron が affordance)。「人物行を毎回 button で包む」定型を解消。未指定なら従来どおり<div>。(#341) -
Comboboxのcreatable(影響: none)— 検索テキストがどの候補にも一致しない時に「作成」項目を表示し、onCreate(text)で自由入力の値を追加できる(options への追加と value のセットは呼び出し側が担当)。createLabelでラベル差し替え。(#200) -
BarChart/StackedBarChartのthreshold(影響: none)— 上限ラインを引いて超過を示す。BarChartは超えた棒をthresholdTone(既定destructive)で塗る。StackedBarChartはグループ合計に対する上限で、超過グループをリング+thresholdToneの合計値で示す(segment の色は一切変えない——各 segment が固有の意味を持つため)。超過はaria-labelにも出るので色だけに頼らない。両者とも縦横 variant 対応。StackedBarChartではnormalize併用時に無視(各グループが 100% になり絶対値の位置が無いため・dev 警告あり)。(#285) -
Input/TextareaのshowCount(影響: none)— 文字数表示。maxLength併用でcount / max形式になり、aria-describedbyで関連付く。制御・非制御どちらでも動作。(#314) -
AvatarのcolorSeed(影響: none)—AvatarFallbackの頭文字背景を名前から決定的に配色(ディレクトリの視認性)。opt-in。(#331) -
SwatchLegend(影響: none)—ChartLegendを単体利用できる別名として公開(カレンダー / かんばんの tone → ラベル凡例)。(#327) -
StepperのonStepClick(影響: none)— 完了済みステップへのジャンプ移動。未指定なら従来どおり非インタラクティブ。(#157) -
ReferenceValueのaffirmative(影響: none)— 正常値のうち「良い」値を肯定的に強調できる(従来は中立か異常のみ)。(#291) -
ToggleGroupの項目ごとの tone(影響: none)— 排他ステータスピル(休講 red / 補講 blue など)向けにToggleGroupItemToneを追加。(#288) -
ScheduleGridのセル単位selected+cellClassName(影響: none)— アクティブ / オープン中のセルを強調できる。(#299) -
Timelineのitemsdata-prop(影響: none)— compound API に加えてデータ駆動の形を追加(compound だけでは発見しづらかったため)。(#349)
Fixed
-
Sidebarが高さ不定の親で潰れる(影響: none)—h-fullの百分率高さは親の確定高さが無い(例:min-h-*)と解決できず、レールが自身のコンテンツ高まで潰れ、flex の stretch まで打ち消していた。self-stretchに変更(実測:min-height:500pxの flex 行で旧契約は 0px、新契約は 500px で描画)。(#692, #697) -
SidebarItemが折りたたみに追従しない(影響: none)— 60px レールでアイコンを中央寄せし、56px の末尾予約を落とし、ラベルはツールチップへ移動、可視ラベルが消えるぶんaria-labelに名前を明示。呼び出し側で行ごとに Tooltip で包む定型が不要になった。(#692, #697) -
SidebarHeader/SidebarFooterが 60px レールからはみ出す(影響: none)— 両者も折りたたみに追従するようになり、ブランド行やアカウント行がレール幅を突き破らない。(#692, #697) -
AuthTemplateの左ブランド面がダークで白へ反転(影響: none)—bg-foreground/text-backgroundはダークモードで白面+黒字になり、隣のフォームと真逆だった。デザインソースどおりテーマ不変の--pure-black/--pure-whiteに変更(CodeBlockと同じ手当て)。(#693, #697) -
IconのIconGlyph型が実態より狭い(DX・影響: none)—ForwardRefExoticComponent固定だったため、@tabler/icons-reactが公開するIcon型(FunctionComponent<IconProps>)の型付き変数・レジストリ経由で渡すとProperty '$$typeof' is missingで落ち、インラインのicon={IconChevronRight}しか通らなかった。React.ComponentTypeに拡張して両方受理(IconGlyphPropsも公開)。(#694, #697) -
Accordionの最終項目の下線がルート枠と二重(影響: none)— 最後の項目にlast:border-b-0。(#695, #697) - loyalty-summary-card デモのバーコードがダークでほぼ不可視(docs・影響: none)— デモのバーコード3枚中2枚が
#111直書きでdark:variant を持たず、ダークのカード(rgb(2,8,23))上で実質見えなかった。hsl(var(--foreground))に変更し、コピー元コードもテーマ追従に。上記 Changed のガード復活(#698)で検出。(#702) -
*VariantKey型が barrel から出ていなかった(DX・影響: none)—BadgeVariantKeyなどの variant-key union は各部品が内部でimport typeするだけで re-export しておらず、import type { BadgeVariantKey } from "@gunjo/ui"が tsc で落ちていた。採用先がRecord<Status, BadgeVariantKey>を書くのに literal union を手写しする必要があった。barrel 生成器を更新し、全カテゴリの*VariantKey型をexport type *で公開(型のみ・runtime のキー配列は非公開のまま)。純追加なので既存コードに影響なし。(#411) -
Table/DataTableの横スクロール漏れ(影響: none)— 狭い画面(375px 等)で、幅広の内側要素がoverflow-x-autoスクローラからページ全体に横スクロールを漏らすことがあった(html.scrollWidthが膨らむ・祖先のmin-w-0やsticky除去では直らない)。両コンポーネントの横スクローラに[contain:paint]を付与して封じ込め(ScheduleGrid#287 と同じ手当て)。正しくレイアウトされている場合は no-op。自前の幅広コンテンツ(チャート・カスタムグリッド)向けに Table docs へ手順も記載。(#289) -
Alertの見出し順序(a11y・影響: none)—AlertTitleの既定要素がh5で、h1 → h5 と見出しレベルが飛んでいた。既定を<p>に変更(見た目は不変。見出しにしたい場合はas="h5"を明示)。(#251)
[0.1.0-beta.1] — 2026-07-15
初の beta。
0.0.1-alpha.3以降の全変更。beta 昇格ゲート(#572・4/4 達成)をクリアし、コア 54 部品を Beta に。破壊的変更なし(採用先影響は原則 none・追加 API と a11y 修正のみ・既存コード変更不要)。この版から semver /@deprecated規律が発効(破壊はマイナーのみ・移行パスを提示)。
Added
-
SemanticTone正準スケール+変換器(影響: none)。SemanticTone(default|muted|primary|info|success|warning|destructive)とSEMANTIC_TONES/isSemanticTone/toChartTone/toMeterTone/toBadgeVariant/toDangerToneを公開。tone 系コンポーネント間で共有し、語彙が違う所は変換器で橋渡し(画面ごとの変換表を不要に)。変換器は型のみ import で RSC-safe。(#294) -
Buttonloading(影響: none)— Spinner+disabled+aria-busy。(#305) -
Alert便利 propsicon/title/description(影響: none)— compound を書かずに1行で。(#303) -
Badgesize(sm/default/lg)・Tagicon(影響: none・既定は現状維持)。(#300) -
Sheetsize(sm–xl/full)(影響: none)— サイドドロワーを広く。死んでいたw-[384px]を除去。(#328) -
Drawerdirection(影響: none)— Root のdirectionを single source of truth 化(下記 Fixed 参照)。(#335) -
DatePicker/DateRangePickerlabel+description(影響: none)—useIdで a11y 配線。(#315) -
DataTablecaption/aria-label/aria-labelledby・hidePaginationSummary(影響: none)。(#298, #311) -
MetadataListwrap(影響: none)— 長い値を折り返す(既定は truncate)。(#284) -
TreeViewonNodeActivate(影響: none)— ラベルのドリルインを展開/折りたたみと分離。(#283) -
RadioGroupdisabled(影響: none)— グループ一括無効+<fieldset disabled>継承(下記 Fixed)。(#273) - レイアウトの t-shirt gap エイリアス(
VStack/HStack/Clusterのgap="sm|md|lg"…、影響: none)+ prop 語彙規約の文書化。(#330) - 直列化可能な
valueFormat/feeFormat/timeFormat(影響: none)— 11 チャート+クライアント footgun 部品/SignedRecordに、関数 prop を使わず RSC から渡せる代替を追加。(#338 Phase 1–3)
Fixed
- RSC function-prop footgun のガード(影響: none/CI)— Server Component から関数 prop を渡すと
next buildが壊れるが tsc/dev/CI が捕まえない問題に、CI へ本番ビルドゲートを追加+直列化代替+render props の RSC 注意書き。beta ゲートの実質単一ブロッカーを解消。(#338) - overlay の Radix「Missing Description」警告(a11y・影響: none)— Dialog/Sheet/Drawer/AlertDialog で description が無いときだけ
aria-describedbyを opt-out(ある時は配線維持・回帰なし)。(#322) -
Drawer sideがポインタを飲む(機能バグ・影響: none)— vaul のdirection未設定でサイドドロワーの子がクリック不能だった。Rootdirectionを配線し、ミスマッチ時に dev 警告。(#335) -
RadioGroupが<fieldset disabled>を継承しない(a11y・影響: none)—:disabledで検出しaria-disabled反映+roving tabindex から除外。(#273) -
DataTable狭幅ヘッダ崩れ(影響: none)— <480px コンテナでサマリが1文字ずつ改行 →flex-wrap+min-w-0。(#311) -
DataTableソートヘッダの a11y(影響: none)— 冗長な英語ラベルがセル名に漏れる問題を解消、列名がアクセシブル名に。(#307) -
ReferenceValueの sr-only 二重読み上げ(a11y・影響: none)。(#306) -
MetadataList/TreeView/DatePickerほか の細部(上記 Added に対応する挙動修正)。 -
Popoverの重複クラス(影響: none・視覚不変)—w-72 w-[288px]/rounded-md rounded-lgを .pen に合わせ単一化、drift チェックのcornerRadius:8→rounded-md誤マッピングも訂正。(#140) - 不正な
ChartColorに dev 警告(DX・影響: none)— tone でも CSS 色でもない値に開発時警告。(#296)
Docs
- パッケージ版ゲート(alpha → beta → 1.0)を
/docs/stabilityに追記。(#572) - Semantic Tones ページ(正準スケール+ライブデモ+変換器表)。(#294)
- Installation:
@tabler/icons-reactを consumer 直依存として案内(pnpm/strict hoisting 対策)。(#309) - Icon
icon={Glyph}契約の可視化・Banner は1行の帯(Alert との使い分け)・DataTablerenderCard の activatable-card 契約・render props の RSC 安全性注記。(#337, #324, #333, #338)
Changed
- 安定性の昇格 第一波:54 部品を Experimental → Beta(採用先影響: none・ラベルのみ)。コールドテスト 170 画面での登場頻度(≥12 ラウンド)を「本番採用」の代理指標とし、docs Props 完全カバー(#559 監査済)と合わせて
/docs/stabilityの Beta 基準を満たすコアを昇格。Beta = 機能完成・API はフィードバックで調整されうる(パッチでは壊れない)。対象:BadgeButtonCardSeparatorSelectStatisticMetadataListAlertTabsMeterSheetEmptyStateStatGroupDataTableContainerInputPageHeaderTextareaTimelineTagDialogNumberInputActionQueueDeltaToggleGroupListCardAmountBreakdownCheckboxSignedRecordTablePersonCellIconLabelRouteStopsCoSignBannerReferenceValueSearchInputAvatarSwitchStepperFormScheduleGridProgressVStackApprovalStepsDrawerFilterChipsLineChartBottomActionBarRadioCardDatePickerEditableDataTableRadioGroup。SSOT はdesign/stability.json。(#573) - semver 規律の開始(beta ゲート③)— 本リリース以降、破壊的変更はマイナーのみ・
@deprecatedで移行パスを提示し、その内容をこの CHANGELOG に記録する(docs/versioning の作法をここから有効化)。
[0.0.1-alpha.3] — 2026-07-10
alpha.2(173 部品)以降、コールドテスト 170 画面の検証ループで見つかった欠落を埋め続けた成果をまとめた alpha リリース。部品セットは 216 に到達(+43)。API は今後変更される可能性があります(全部品 Experimental)。
Added
- コンポーネント +43 件(173 → 216)(採用先影響: none・追加のみ)。コールドテスト 170 ラウンドで「文脈ゼロの AI が手組みした=欠落」と報告された部品を、業種横断で追加(運行図 Stringline、系譜 LineageGraph、月カレンダー EventCalendar、座席 SeatMap、経路 OriginDestination / RouteStops / Itinerary ほか)。docs / SSOT / Figma を 3 軸で監査 (#559)。
- i18n
LocaleProvider(採用先影響: none・後方互換)。shadcn 由来の組み込み文字列(No results./ 検索プレースホルダ / ページャ等)を<LocaleProvider locale="ja">一箇所で切替。en 既定=プロバイダ未マウント時は従来どおり。precedence: instance prop > provider bundle > 既定。14 部品配線 (#326 / #560–562)。docs:/docs/i18n(ライブ en/ja トグル)(#567)。 -
Buttonのsize="touch"/size="icon-touch"(採用先影響: none・追加のみ)。44px タップ標的(WCAG 2.5.5)を意図で選べるサイズ。モバイル / toC 画面向け (#362 / #568)。 - 部品固有のローカライズ上書き prop(採用先影響: none・追加のみ)—
ActionQueue.severityLabels/EventCalendar.formatMonthTitle・formatDayLabel/ScanGate.stepsLabel/TicketStub.formatCodeAlt。既定は日本語のまま (#558)。
Changed
- 配布形態を「生 TS 直配布」から「コンパイル済み
dist/(ESM +.d.ts)」へ変更(採用先影響: none)。exports "."が./dist/index.jsを指すようになり、採用先はtranspilePackages: ["@gunjo/ui"]なしで Next.js / Vite からそのまま import できる。各コンポーネントの"use client"境界はtscが directive として保持。npm run build:lib(tsc -p tsconfig.build.json)で生成し、prepareでnpm install/pack/publish時に自動ビルド。既存採用先はコード変更不要(transpilePackagesは削除してよい)。 ScanGateの手順区切りをテキスト矢印(→)からアイコン(IconChevronRight)へ(採用先影響: none・視覚のみ、aria-hidden の装飾)(#570)。
Fixed
prepareが dist を自動ビルドするようになり、npm install file:../gunjoなどローカル採用でもdist/が確実に揃う(採用先影響: none)。prepareの git hooks インストールを堅牢化:書込不可環境でも失敗しない(npm pack/publishを壊さない)。gunjo リポジトリ本体でのみ動作し、file:/git+install で採用先のcore.hooksPathを書き換えない。- リポジトリに commit されていた古いビルド成果物
gunjo-ui-0.0.1-alpha.2.tgzを削除し、*.tgzを gitignore。
[0.0.1-alpha.2] — 2026-06-13
OSS 公開に合わせた alpha リリース。0.0.1-alpha.0 / alpha.1(70 components)以降に追加された全コンポーネント(Tier 1/2/3 + Templates、計 42 件)と、LICENSE / repository フィールド / public 化などの OSS 整備を配布。npm 上の README・メタデータも刷新。API は今後変更される可能性があります。
Added
LICENSEファイル追加(MIT、package.jsonのlicense: MIT宣言と整合)- git tag
v0.0.1-alpha.0バックフィル(commitdc7256d、初回 publish 時点を指す) CONTRIBUTING.md/SECURITY.md追加(OSS 整備)- 新コンポーネント:Toggle(atom) — Radix
react-toggleベース。variant(default/outline) とsize(sm/default/lg) をサポート。Tier 1 batch 1 の最初の追加 - 新コンポーネント:AspectRatio(atom) — Radix
react-aspect-ratioの薄いラッパー。ratioprop で 16/9, 4/3, 1 等の固定比率コンテナ提供 - 新コンポーネント:Code(atom) — inline
<code>の cva スタイル。variant(default/muted) とsize(sm/default/lg) をサポート - 新コンポーネント:AlertDialog(molecule) — Radix
react-alert-dialogベースの compound pattern。Trigger / Content / Header / Title / Description / Footer / Action / Cancel - 新コンポーネント:Drawer(molecule) — vaul ライブラリベースの mobile bottom-sheet。drag-to-dismiss handle 付き
- 新コンポーネント:Combobox(molecule) — Popover + Command の compound。
optionsarray で searchable select。placeholder/searchPlaceholder/emptyMessageカスタマイズ可 - 新コンポーネント:DatePicker(molecule) — Popover + Calendar + date-fns の compound。
value(Date) とonValueChangeで controlled 利用、dateFormatで表示形式指定 - 新コンポーネント:Sidebar(molecule) — Context-based provider + compound (
Sidebar/SidebarHeader/SidebarBody/SidebarFooter/SidebarSeparator)。useSidebarhook で descendant から collapsed 制御 - 新コンポーネント:DataTable(molecule) —
@tanstack/react-tableの wrapper。generic で型安全 (<TData, TValue>)。sort + filter(指定カラム)+ pagination(pageSize 設定可)統合 - 🎉 Tier 1 essentials 全 9 件完了(Toggle / AspectRatio / Code / AlertDialog / Drawer / Combobox / DatePicker / Sidebar / DataTable)
- 新コンポーネント:Container(atom) —
sizeprop(sm/md/lg/xl/2xl/full/prose)で max-width + padding wrapper - 新コンポーネント:HStack(atom) — flex 横、
gap/align/justify/wrapprops - 新コンポーネント:VStack(atom) — flex 縦、
gap/align/justifyprops - 新コンポーネント:Cluster(atom) — flex-wrap、tag list 等の自動折返し用
- 新コンポーネント:Grid(atom) —
cols固定 orminItemWidthauto-fit のレスポンシブ grid - 新コンポーネント:Spacer(atom) —
sizeで固定 or flex-grow filler - 🎉 Layout primitives 全 6 件完了
- 新コンポーネント:NumberInput(atom) — chevron stepper 付き numeric input。
value/onValueChange/min/max/stepprops - 新コンポーネント:PasswordInput(atom) — Eye / EyeOff icon の visibility toggle 付き password input
- 新コンポーネント:SearchInput(atom) — leading Search icon と clearable × button 付き search input
- 新コンポーネント:EmptyState(atom) — icon / title / description / action slot 付きのプレースホルダ
- 新コンポーネント:Tag(atom) —
onRemove付き Badge、4 variants × 3 sizes - 新コンポーネント:InputOTP(atom) —
input-otplibrary wrap、InputOTPGroup/InputOTPSlot/InputOTPSeparatorの compound - 新コンポーネント:AvatarGroup(molecule) — 重ね avatars、
maxprop で +N overflow indicator - 新コンポーネント:DateRangePicker(molecule) — Popover + Calendar (mode="range") + date-fns、
numberOfMonthsで複月表示 - 新コンポーネント:TimePicker(molecule) — hour / minute select、
hour12(AM/PM) とminuteStep(1/5/10/15/30) props - 新コンポーネント:TagInput(molecule) — Tag を内部使用、Enter/コンマでコミット、Backspace で末尾削除、
dedupe/maxTagsprops - 新コンポーネント:CodeBlock(molecule) — code 表示用、
filename/language/copyableprops - 新コンポーネント:Banner(molecule) — page 全幅 announcement、5 variants + icon / action / onDismiss
- 新コンポーネント:NavigationMenu(molecule) — Radix
react-navigation-menuの compound(List/Item/Trigger/Content/Link/Indicator/Viewport) - 🎉 Tier 2 high-frequency 全 13 件完了
- 新コンポーネント:ColorSwatch(atom) — color preview chip、
color/label/copyable/sizeprops - 新コンポーネント:Timeline(molecule) —
TimelineItem(variant/marker/connector) + Title/Description/Time の compound - 新コンポーネント:TreeView(molecule) —
TreeNode[]data driven、controlled / uncontrolled expand、selected state - 新コンポーネント:MarkdownRenderer(molecule) — react-markdown + remark-gfm、prose styling 内蔵、
disableGfmで plain markdown - 新コンポーネント:Mention(molecule) — textarea +
@trigger picker、↑↓+Enter で選択、options/trigger/maxSuggestionsprops - 新コンポーネント:Statistic(molecule) — KPI card、
label/value/change/trend(up/down/flat) で色・矢印切替 - 新コンポーネント:Header(organism) — Brand / Nav / NavLink / Actions の compound site nav bar
- 新コンポーネント:Footer(organism) — Columns / Section / Link / Brand / Copyright compound、responsive grid
- 新コンポーネント:OnboardingFlow(organism) — step indicator + content + Back/Continue、controlled/uncontrolled、
onCompletecallback - 🎉 Tier 3 specialty 全 9 件完了
- 新コンポーネント:NotFoundTemplate(template) — 404 page、
code/title/description/actionprops - 新コンポーネント:ErrorTemplate(template) — 500 page、
details(stack trace) prop 付き - 新コンポーネント:PricingTemplate(template) — 3-tier 価格表、
PricingPlan[]、featuredで highlight - 新コンポーネント:BlogTemplate(template) —
category/title/meta/heroの prose article layout - 新コンポーネント:DocsTemplate(template) — sidebar / main / toc の三分割 layout
- 新コンポーネント:OnboardingTemplate(template) — hero panel + content の二分割、OnboardingFlow と組合せ可
- 🎉🎉🎉 Templates 全 6 件完了 — 計画 42/42 components 完成
docs/component-roadmap.md追加(42 components 追加計画と引き継ぎログの SSOT)
Planned(次回以降)
- 実採用プロジェクトでのドライラン(
npm install @gunjo/uiでtranspilePackages込みの実動作確認) - CONTRIBUTING.md / SECURITY.md の整備
- CI で
npm publish --dry-runを流して配布物の差分を見える化 - GitHub リポジトリの public 化+
repositoryフィールド追加(OSS 公開準備が整い次第)
[0.0.1-alpha.1] — 2026-05-04
軽微な housekeeping リリース。コードの API 変更なし、配布物のサイズ・依存・コンポーネント構成は 0.0.1-alpha.0 と完全同一。
Changed
package.jsonの maintainer メアドがregister@4px.jp(メール転送設定不備のあった alias)→dev@4px.jpに切り替わったため、npm registry の maintainer 表記を更新- 採用先影響度:none
[0.0.1-alpha.0] — 2026-05-04
初回 npm publish。 @gunjo/ui の名前確保が主目的の alpha 公開で、API は今後の alpha / beta 期間中に変更される可能性があります。中身は L3 整備完了時点のスナップショット(70 components)。
Added
- npm レジストリへの初回 publish(
@gunjo/ui、access: public) @gunjoOrg(admin:uixhero)配下の最初のパッケージとして登録
Changed
- パッケージ名:
@gunjo(bare scope、npm 規則違反で publish 不能)→ @gunjo/ui(npm の@scope/name規則準拠) - export サブパスも追従:
@gunjo/styles→@gunjo/ui/styles@gunjo/tailwind-preset→@gunjo/ui/tailwind-preset@gunjo/tailwind-theme-extend→@gunjo/ui/tailwind-theme-extend
- 採用先側の参照箇所(
transpilePackages/tailwind.configのcontent/next.config/ globals.css の@import/@source)も@gunjo/uiへ追従要 package.json:private: true→false、publishConfig.access: "restricted"→"public"version:内部マイルストーン1.0.0を npm 公開バージョンとしては破棄、初回公開を0.0.1-alpha.0から開始(npm 上の1.0.0は将来の stable リリースに予約)
Removed
- React 18 peer サポート(peer は
^19.0.0のみ。内部実装で React 19 専用 API を採用したため)
Documentation
- adoption / migration / dependencies / versioning / component-addition / adoption-strategy 整備(PR #2)
- このファイル(CHANGELOG.md、PR #2 で bootstrap、PR #3 で本エントリ追加)
採用先影響度
- breaking:
@gunjoを import /tailwind.configの content /next.configのtranspilePackages等で参照していた場合は全て@gunjo/uiに置換必須- 移行手順:
git grep -l '@gunjo' | xargs sed -i '' 's|@gunjo|@gunjo/ui|g'のような一括置換 + 確認 - ただし alpha 段階のため、現時点の採用先は本リポジトリ内 docs サイトのみで影響範囲は限定
- 移行手順:
Pre-publish history(内部 1.0.0 期間、2026-04 以前〜2026-05-03)
npm 未公開期間の内部マイルストーン。CHANGELOG エントリではなく履歴メモ:
- L3 整備:adoption guide 一式追加(PR #2 / 2026-05-03)
- React peer 範囲を
^18 || ^19→^19のみに縮小(実装内で React 19 専用 API 使用のため、本来 MAJOR 事案だが未公開期間中の調整として CHANGELOG エントリ化せず) - コンポーネント 67 → 70 追加:
Skeleton,Stepper,Form(コミットbe127e9/ 2026-05) - L3 配布準備:
package.jsonのdescription/keywords/publishConfig/ 拡張files/ 追加exports整備(PR1f9b760) - SSOT 三軸(pen + source + docs)配備、視覚監査 70/70(コミット
8e3246e他)