@godxjp/ui 19.3.1 → 19.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/components/data-display/badge.d.ts +9 -1
  2. package/dist/components/data-display/badge.js +3 -2
  3. package/dist/components/data-display/index.d.ts +2 -0
  4. package/dist/components/data-display/index.js +2 -0
  5. package/dist/components/data-display/popover.d.ts +13 -1
  6. package/dist/components/data-display/popover.js +3 -1
  7. package/dist/components/data-display/table.d.ts +19 -2
  8. package/dist/components/data-display/table.js +4 -1
  9. package/dist/components/data-display/timeline-grid.d.ts +18 -0
  10. package/dist/components/data-display/timeline-grid.js +222 -0
  11. package/dist/components/data-entry/cascader.js +4 -6
  12. package/dist/components/data-entry/checkbox.js +1 -1
  13. package/dist/components/data-entry/search-select.js +5 -7
  14. package/dist/components/data-entry/select.js +32 -28
  15. package/dist/components/data-entry/tree-select.js +4 -6
  16. package/dist/components/general/inert-background.d.ts +5 -0
  17. package/dist/components/general/inert-background.js +48 -0
  18. package/dist/components/layout/auth-shell.d.ts +4 -2
  19. package/dist/components/layout/auth-shell.js +7 -1
  20. package/dist/components/layout/centered-shell.d.ts +2 -2
  21. package/dist/components/layout/flex.d.ts +1 -1
  22. package/dist/components/layout/flex.js +2 -1
  23. package/dist/components/layout/index.d.ts +3 -0
  24. package/dist/components/layout/index.js +2 -0
  25. package/dist/components/layout/mobile-shell.d.ts +21 -0
  26. package/dist/components/layout/mobile-shell.js +43 -0
  27. package/dist/components/layout/sidebar-link.d.ts +1 -1
  28. package/dist/components/navigation/context-menu.js +13 -9
  29. package/dist/components/navigation/dropdown-menu.js +17 -13
  30. package/dist/inertia/index.d.ts +1 -1
  31. package/dist/lib/variants.d.ts +3 -3
  32. package/dist/lib/variants.js +1 -0
  33. package/dist/props/components/data-display.prop.d.ts +65 -0
  34. package/dist/props/components/data-entry.prop.d.ts +1 -1
  35. package/dist/props/components/layout.prop.d.ts +93 -6
  36. package/dist/props/registry.d.ts +109 -2
  37. package/dist/props/registry.js +143 -0
  38. package/dist/props/vocabulary/data.prop.d.ts +6 -0
  39. package/dist/props/vocabulary/index.d.ts +3 -3
  40. package/dist/props/vocabulary/layout.prop.d.ts +17 -2
  41. package/dist/props/vocabulary/shared.prop.d.ts +7 -0
  42. package/dist/styles/control.css +18 -1
  43. package/dist/styles/data-display-layout.css +167 -0
  44. package/dist/styles/layout.css +7 -0
  45. package/dist/styles/shell-layout.css +148 -0
  46. package/dist/styles/table-layout.css +23 -4
  47. package/dist/tokens/components/control.css +1 -0
  48. package/dist/tokens/components/data-display.css +20 -0
  49. package/dist/tokens/components/shell.css +22 -0
  50. package/dist/tokens/components/table.css +2 -0
  51. package/docs/FRAME-A11Y-CI.md +99 -17
  52. package/docs/FRAME-COVERAGE-REPORT.md +4 -2
  53. package/docs/SPACING.md +19 -6
  54. package/docs/charts/compact-bar-trend.tsx +5 -6
  55. package/docs/data-display/avatar.tsx +7 -9
  56. package/docs/data-display/badge.tsx +1 -1
  57. package/docs/data-display/card/index.tsx +6 -4
  58. package/docs/data-display/data-table/examples/approval-queue.tsx +1 -1
  59. package/docs/data-display/data-table/index.tsx +1 -1
  60. package/docs/data-display/permission-matrix.tsx +2 -2
  61. package/docs/data-display/popover.tsx +4 -1
  62. package/docs/data-display/scroll-area.tsx +1 -1
  63. package/docs/data-display/table.tsx +1 -1
  64. package/docs/data-display/timeline-grid.tsx +119 -0
  65. package/docs/data-entry/branch-scope-picker.tsx +1 -1
  66. package/docs/data-entry/date-picker.tsx +2 -1
  67. package/docs/data-entry/form-field/index.tsx +2 -2
  68. package/docs/data-entry/input-otp.tsx +1 -1
  69. package/docs/data-entry/select-matrix.tsx +2 -1
  70. package/docs/data-entry/select.tsx +3 -1
  71. package/docs/data-entry/textarea.tsx +1 -1
  72. package/docs/data-entry/toggle-count.tsx +1 -1
  73. package/docs/feedback/alert.tsx +1 -1
  74. package/docs/feedback/banner.tsx +1 -1
  75. package/docs/feedback/dialog.tsx +2 -1
  76. package/docs/feedback/sheet.tsx +2 -1
  77. package/docs/foundation/email-tokens.tsx +1 -1
  78. package/docs/general/activity.tsx +1 -1
  79. package/docs/layout/app-shell.tsx +4 -4
  80. package/docs/layout/auth-account-summary.tsx +1 -1
  81. package/docs/layout/auth-recovery/examples/mobile-390.tsx +1 -1
  82. package/docs/layout/auth-recovery/examples/password-recovery.tsx +0 -2
  83. package/docs/layout/auth-shell-context.tsx +1 -1
  84. package/docs/layout/auth-shell-device.tsx +2 -2
  85. package/docs/layout/auth-shell-registration.tsx +1 -1
  86. package/docs/layout/auth-shell.tsx +1 -1
  87. package/docs/layout/master-detail.tsx +2 -2
  88. package/docs/layout/mobile-shell.tsx +101 -0
  89. package/docs/layout/page-container.tsx +6 -6
  90. package/docs/layout/responsive-grid.tsx +5 -5
  91. package/docs/layout/separator.tsx +2 -2
  92. package/docs/layout/service-role-panel.tsx +1 -1
  93. package/docs/layout/sidebar.tsx +9 -9
  94. package/docs/layout/split-pane.tsx +5 -6
  95. package/docs/layout/topbar.tsx +2 -8
  96. package/docs/navigation/context-menu.tsx +6 -1
  97. package/docs/navigation/dropdown-menu.tsx +2 -1
  98. package/docs/navigation/filter-bar.tsx +2 -2
  99. package/docs/navigation/pagination.tsx +2 -2
  100. package/docs/navigation/steps.tsx +1 -1
  101. package/docs/navigation/tabs.tsx +3 -3
  102. package/docs/showcase/acme-portal.tsx +11 -12
  103. package/docs/showcase/acme-website.tsx +7 -7
  104. package/docs/showcase/case1-warehouse-dashboard.tsx +11 -12
  105. package/docs/showcase/case2-employee-me.tsx +10 -16
  106. package/docs/showcase/case4-login.tsx +144 -156
  107. package/docs/showcase/case5-shift-calendar.tsx +181 -280
  108. package/docs/showcase/case6-agency-handy.tsx +446 -443
  109. package/docs/showcase/futurelastic-web.tsx +9 -8
  110. package/docs/showcase/org-switcher.tsx +18 -11
  111. package/docs/showcase/permission-matrix.tsx +13 -13
  112. package/docs/showcase/public-landing.tsx +1 -1
  113. package/docs/showcase/settings-account-sections.tsx +4 -4
  114. package/docs/showcase/settings-security-mfa.tsx +3 -3
  115. package/docs/showcase/table-approval-queue.tsx +1 -1
  116. package/docs/showcase/table-bulk-actions.tsx +49 -52
  117. package/docs/showcase/table-conditional-format.tsx +1 -1
  118. package/docs/showcase/table-crud-list.tsx +1 -1
  119. package/docs/showcase/table-expandable-rows.tsx +101 -98
  120. package/docs/showcase/table-filter-chips.tsx +78 -66
  121. package/docs/showcase/table-footer-totals.tsx +23 -19
  122. package/docs/showcase/table-grouped-subtotals.tsx +7 -4
  123. package/docs/showcase/table-master-detail.tsx +13 -15
  124. package/docs/showcase/table-states.tsx +34 -29
  125. package/docs/showcase/table-sticky-columns.tsx +3 -2
  126. package/docs/showcase/table-tree-rows.tsx +22 -15
  127. package/docs/showcase/table-view-tabs.tsx +12 -14
  128. package/package.json +7 -6
@@ -47,7 +47,7 @@ const TOOLBAR_CHROME_TOKENS = {
47
47
  } as CSSProperties;
48
48
 
49
49
  /**
50
- * `--page-header-min-block-size-chrome` · クロム帯の「高さ」(gh#331)。文書のヘッダーは中身なりの
50
+ * `--page-header-min-block-size-chrome` · クロム帯の「高さ」。文書のヘッダーは中身なりの
51
51
  * 高さで正しい · 見出しは見出しの高さだからです。クロムは逆で、家具には「ものが中央に収まる帯」が
52
52
  * 要ります。既定は `auto`(=rule #44 の最も静かな状態)なので、このトークンを置くまで DOM も
53
53
  * 見え方も従来どおり · 文書ページはそもそもこの規則に一致しません。
@@ -109,7 +109,7 @@ const journalColumns: ColumnDef<JournalEntry>[] = [
109
109
  * PageContainer · mandatory page shell.
110
110
  * Covers: title/subtitle/status/extra/footer/breadcrumb/linkComponent + variant
111
111
  * default/narrow/flush/ghost + density compact/default/comfortable + PageContainer.Inset.
112
- * The embedded header is the CANONICAL DXS PageHeader (gh#255) — status/meta band included.
112
+ * The embedded header is the CANONICAL DXS PageHeader — status/meta band included.
113
113
  * Each example is standalone (no AppShell) so the variant behaviour is visible in
114
114
  * isolation. Composed only from real @godxjp/ui components.
115
115
  */
@@ -165,7 +165,7 @@ export default function Demo() {
165
165
  </ResponsiveGrid>
166
166
  </PageContainer>
167
167
 
168
- {/* ── 1b. Canonical page-header contract (gh#255) · status/meta band ── */}
168
+ {/* ── 1b. Canonical page-header contract · status/meta band ── */}
169
169
  {/* PageContainer's embedded header IS the DXS PageHeader: breadcrumbs + title +
170
170
  subtitle + status/meta + actions + responsive overflow on ONE renderer. The
171
171
  `status` band shares the title line at --page-header-status-gap and wraps
@@ -405,7 +405,7 @@ export default function Demo() {
405
405
  </Card>
406
406
  </PageContainer>
407
407
 
408
- {/* ── 6. fill · body height behaviour on a tall shell (gh#103) ──
408
+ {/* ── 6. fill · body height behaviour on a tall shell ──
409
409
  Each PageContainer sits in a fixed-height framed box that stands in for the
410
410
  viewport-tall app shell, so the two behaviours are visible side by side. */}
411
411
  <ResponsiveGrid columns={{ sm: 1, md: 2 }}>
@@ -452,7 +452,7 @@ export default function Demo() {
452
452
  </div>
453
453
  </ResponsiveGrid>
454
454
 
455
- {/* ── 7. headerLayout · 390px でヘッダー extra をタイトル行に残す (gh#231) ──
455
+ {/* ── 7. headerLayout · 390px でヘッダー extra をタイトル行に残す ──
456
456
  stack (既定) は 640px 未満で extra を subtitle の下の全幅行に落とす。
457
457
  responsive-inline は --page-header-extra-measure (11rem) の測度で
458
458
  title 帯の横に残す。640px 以上では両者は同一。
@@ -505,7 +505,7 @@ export default function Demo() {
505
505
  </PageContainer>
506
506
  </ResponsiveGrid>
507
507
 
508
- {/* ── 8. measure · ヘッダーとボディを 1 つの測度で束ねる (gh#245 / gh#247) ──
508
+ {/* ── 8. measure · ヘッダーとボディを 1 つの測度で束ねる ──
509
509
  measure は variant(クローム)と直交する第 3 の軸。variant="narrow" は
510
510
  .ui-page-body しか絞らないため、ヘッダーのアクションはページ端に取り残される。
511
511
  measure はヘッダーとボディの両方を同じトークン測度で絞るので、extra の終端が
@@ -13,7 +13,7 @@ import { Flex, PageContainer, ResponsiveGrid, SplitPane } from "@godxjp/ui/layou
13
13
  * ResponsiveGrid · equal-width multi-column tile grid with automatic responsive
14
14
  * collapse (CSS container queries, not viewport). It OWNS its query container
15
15
  * (container-type: inline-size), so it responds to the width available to the grid
16
- * with no external container-type declaration (gh#165). Direct children are typically
16
+ * with no external container-type declaration. Direct children are typically
17
17
  * StatCard (self-contained bordered card · never wrap in Card/CardContent) or
18
18
  * Card+CardContent for richer tile bodies. columns accepts a number OR breakpoint
19
19
  * object { sm?, md?, lg? } — or use the named `preset` prop (e.g. "pricing-plans") for a
@@ -35,8 +35,8 @@ export default function Demo() {
35
35
  列、右の狭いサイドバー(約 20rem)は 1 列に折り返す。ビューポート幅は同一なので、
36
36
  折り返しの基準がコンテナ幅であることが分かる。ResponsiveGrid は自身のクエリコンテナ
37
37
  (container-type: inline-size)を持つため、外側に @container を用意しなくても正しく
38
- 折り返す(gh#165)。閾値はコンテナ幅 40 / 48 / 64rem。 列間の gap は
39
- var(--space-stack-md) に固定で、prop では変更できない。
38
+ 折り返す。閾値はコンテナ幅 40 / 48 / 64rem。 列間の gap は var(--space-stack-md)
39
+ に固定で、prop では変更できない。
40
40
  </CardDescription>
41
41
  </CardHeader>
42
42
  <CardContent>
@@ -45,7 +45,7 @@ export default function Demo() {
45
45
  aside={
46
46
  <Flex direction="col" gap="sm">
47
47
  <Text tone="muted">狭いコンテナ(約 20rem)→ sm=1 列</Text>
48
- {/* No wrapping `@container` needed — ResponsiveGrid OWNS its query container (gh#165). */}
48
+ {/* No wrapping `@container` needed — ResponsiveGrid OWNS its query container. */}
49
49
  <ResponsiveGrid columns={4}>
50
50
  <StatCard label="今日の入金" value="¥420,000" />
51
51
  <StatCard label="未処理" value="6 件" />
@@ -72,7 +72,7 @@ export default function Demo() {
72
72
  <CardDescription>
73
73
  固定幅の親の中でも、同じ columns=&#123;4&#125; が親幅で列数を変える。親には
74
74
  container-type を付けていない。ResponsiveGrid が自身のスコープでクエリするため、
75
- 外側にコンテナ宣言がなくても 1 列に潰れない(gh#165)。
75
+ 外側にコンテナ宣言がなくても 1 列に潰れない。
76
76
  </CardDescription>
77
77
  </CardHeader>
78
78
  <CardContent>
@@ -19,7 +19,7 @@ import { Flex, PageContainer, Separator } from "@godxjp/ui/layout";
19
19
  * defaults to true · set false only when the divider carries semantic meaning for
20
20
  * a11y.
21
21
  *
22
- * gh#308 — `label` INTERRUPTS the rule: a message stream's day divider, a "new messages"
22
+ * `label` INTERRUPTS the rule: a message stream's day divider, a "new messages"
23
23
  * watermark, an auth conjunction. A labelled rule flips `decorative` to false, so it is a real
24
24
  * role="separator" NAMED by the label (the visible node is aria-hidden, so the string is announced
25
25
  * exactly once). `labelAlign` is a controlled vocabulary value — start | center | end, logical, so
@@ -172,7 +172,7 @@ export default function Demo() {
172
172
  </CardContent>
173
173
  </Card>
174
174
 
175
- {/* ── gh#308 — the real screen the labelled rule exists for ─────────────────────────── */}
175
+ {/* ── — the real screen the labelled rule exists for ─────────────────────────── */}
176
176
  <Card>
177
177
  <CardHeader>
178
178
  <CardTitle level={2}>実画面 · チャンネルの投稿ストリーム</CardTitle>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * ServiceRolePanel — ロール一覧 ⇄ 詳細 (canonical master-detail roles surface, gh#257).
2
+ * ServiceRolePanel — ロール一覧 ⇄ 詳細 (canonical master-detail roles surface).
3
3
  *
4
4
  * MasterDetail (rail=master) underneath owns all geometry: two tracks at 1440/1024, stacked
5
5
  * list-then-detail at 390. The panel adds selection (aria-current rows), locked system roles,
@@ -127,7 +127,7 @@ const MENTION_SECTIONS: SidebarSectionProp[] = [
127
127
  ];
128
128
 
129
129
  /**
130
- * gh#228 · nav row and nav icon read SEPARATE colour tokens. A service normally sets these once in
130
+ * nav row and nav icon read SEPARATE colour tokens. A service normally sets these once in
131
131
  * its theme.css (`:root` or a scoped `[data-tenant] .app-sidebar`); here they are scoped to one
132
132
  * demo frame so the default rail can sit next to the themed one. Icons only — geometry (16px icon,
133
133
  * 32px row, 10px gap) is untouched.
@@ -138,7 +138,7 @@ const CANONICAL_NAV_TOKENS = {
138
138
  } as CSSProperties;
139
139
 
140
140
  /**
141
- * gh#213 · THE router-link contract. `createSidebarLink` adapts any router `Link` — React Router /
141
+ * THE router-link contract. `createSidebarLink` adapts any router `Link` — React Router /
142
142
  * TanStack use `to`, Inertia and Next.js use `href` (the default, and
143
143
  * `inertiaSidebarLink(Link)` from `@godxjp/ui/inertia` is the same thing pre-bound). The consumer
144
144
  * writes NO row markup: the Sidebar composes the icon slot, the label, the badge, the active state
@@ -171,7 +171,7 @@ const ROUTED_SECTIONS: SidebarSectionProp[] = [
171
171
  ];
172
172
 
173
173
  /**
174
- * renderItem · DEPRECATED (gh#213) — kept working for existing consumers. It leaves the row CONTENT
174
+ * renderItem · DEPRECATED — kept working for existing consumers. It leaves the row CONTENT
175
175
  * to the caller, which is how a `<Link>{item.label}</Link>` silently dropped every icon in
176
176
  * production. `rowProps` now carries the library-composed `children`, so spreading it (or rendering
177
177
  * `rowProps.children`) restores the canonical row; the star is a decorative, non-interactive affix.
@@ -346,7 +346,7 @@ export default function Demo() {
346
346
  </CardContent>
347
347
  </Card>
348
348
 
349
- {/* linkComponent prop · THE router-link contract (gh#213) — library composes the row. */}
349
+ {/* linkComponent prop · THE router-link contract — library composes the row. */}
350
350
  <Card>
351
351
  <CardHeader>
352
352
  <CardTitle level={2}>linkComponent プロップ(ルーターリンク)</CardTitle>
@@ -395,14 +395,14 @@ export default function Demo() {
395
395
  </CardContent>
396
396
  </Card>
397
397
 
398
- {/* renderItem prop · DEPRECATED escape hatch (gh#213) — kept for back-compat. */}
398
+ {/* renderItem prop · DEPRECATED escape hatch — kept for back-compat. */}
399
399
  <Card>
400
400
  <CardHeader>
401
401
  <CardTitle level={2}>renderItem プロップ(非推奨)</CardTitle>
402
402
  <CardDescription>
403
403
  行の中身まで利用側が書く旧エスケープハッチ。これが原因で
404
404
  <code>&lt;Link&gt;{"{item.label}"}&lt;/Link&gt;</code>
405
- がアイコンを全て落とす回帰が発生しました(gh#213)。 現在は rowProps.children
405
+ がアイコンを全て落とす回帰が発生しました。 現在は rowProps.children
406
406
  にライブラリ製の行内容が入るので、それを描画すれば 正規の行が復元されます(ここでは
407
407
  その右にお気に入りスターを添えています)。 新規コードでは linkComponent か
408
408
  SidebarItem asChild を使ってください。
@@ -436,7 +436,7 @@ export default function Demo() {
436
436
  sections を使わず SidebarSection / SidebarItem を直接組み立てて、
437
437
  ナビゲーション全体を 自前で構成します。右は同じ構成に SidebarItem の asChild
438
438
  を足したものです。子として ルーターの Link
439
- を「要素だけ」渡すと、アイコン・ラベル・バッジは ライブラリが差し込みます(gh#213。
439
+ を「要素だけ」渡すと、アイコン・ラベル・バッジは ライブラリが差し込みます(。
440
440
  children は書きません)。
441
441
  </CardDescription>
442
442
  </CardHeader>
@@ -526,7 +526,7 @@ export default function Demo() {
526
526
  </CardContent>
527
527
  </Card>
528
528
 
529
- {/* Nav colour tokens · icon and label are themed SEPARATELY (gh#228). */}
529
+ {/* Nav colour tokens · icon and label are themed SEPARATELY. */}
530
530
  <Card>
531
531
  <CardHeader>
532
532
  <CardTitle level={2}>ナビの配色トークン(アイコンとラベルを別々に)</CardTitle>
@@ -590,7 +590,7 @@ export default function Demo() {
590
590
  "badgeTone で未読(neutral)と自分宛て(destructive)を色だけで区別",
591
591
  "disabled=true で項目を非活性化(クリック不可)",
592
592
  "footer prop でスクロール外にユーザー情報を固定",
593
- "linkComponent · ルーター Link は「要素だけ」渡す。行の中身はライブラリが組み立てる(gh#213)",
593
+ "linkComponent · ルーター Link は「要素だけ」渡す。行の中身はライブラリが組み立てる",
594
594
  "linkComponent は葉・サブメニュー・折りたたみレール・フライアウトの全てに適用される",
595
595
  "グループのトリガーは aria-expanded を持つ開閉ボタンのままなので linkComponent は適用されない",
596
596
  ].map((note) => (
@@ -17,7 +17,7 @@ import { FileText, Building2, Calendar, CreditCard, ArrowRight } from "lucide-re
17
17
  * Shows: main list + detail panel, asideWidth sm/md, nested inside PageContainer.
18
18
  * It OWNS its query container (container-type: inline-size), so the two-column split
19
19
  * is chosen from the PANE's own width (≥48rem), not the viewport — a narrow embedded
20
- * pane on a large screen correctly stays single-column (gh#165).
20
+ * pane on a large screen correctly stays single-column.
21
21
  * Composed only from real @godxjp/ui components.
22
22
  *
23
23
  * NOTE: <Flex> defaults to direction="row"; vertical stacks set direction="col"
@@ -302,8 +302,8 @@ export default function Demo() {
302
302
  </Text>
303
303
  <Text as="p" tone="muted">
304
304
  パネル自身の幅が 48rem 未満になると縦積みにフォールバックします
305
- (ビューポートではなくコンテナ基準 · gh#165)。
306
- 常にサイドバイサイドが必要な場合は CSS Grid を使用してください。
305
+ (ビューポートではなくコンテナ基準)。 常にサイドバイサイドが必要な場合は CSS
306
+ Grid を使用してください。
307
307
  </Text>
308
308
  </Flex>
309
309
  </CardContent>
@@ -410,9 +410,8 @@ export default function Demo() {
410
410
  <CardHeader>
411
411
  <CardTitle level={2}>Container stress · narrow vs wide embed</CardTitle>
412
412
  <CardDescription>
413
- 大きな viewport 内でも、パネル自身の幅で分割が決まる(gh#165)。狭い埋め込み(約
414
- 28rem)は 1 カラムに潰れ、広い埋め込み(約 56rem)は 2 カラムに分割する。ビューポート
415
- 幅は同一。
413
+ 大きな viewport 内でも、パネル自身の幅で分割が決まる。狭い埋め込み(約 28rem)は 1
414
+ カラムに潰れ、広い埋め込み(約 56rem)は 2 カラムに分割する。ビューポート 幅は同一。
416
415
  </CardDescription>
417
416
  </CardHeader>
418
417
  <CardContent>
@@ -37,10 +37,7 @@ import {
37
37
 
38
38
  /**
39
39
  * Topbar · a PURE SLOT bar. The shell only positions `start` / `center` / `end`; the CONSUMER
40
- * composes every control. This demo builds the chrome the OLD baked Topbar used to force ·
41
- * sidebar toggle, brand mark (Avatar), an entity switcher, a search trigger, a notifications button, a
42
- * user menu · entirely from real primitives, so you can see there is no hidden template (and no
43
- * dead dropdown: a control exists ONLY because it's placed here).
40
+ * composes every control.
44
41
  */
45
42
  const SECTIONS: SidebarSectionProp[] = [
46
43
  {
@@ -153,10 +150,7 @@ export default function Demo() {
153
150
  // end · notifications + user menu, both consumer-composed.
154
151
  const end = (
155
152
  <>
156
- {/* The end slot is `flex: 0 0 auto` — whatever sits here is taken out of the start slot's
157
- budget before it gets a say. At 320 this environment chip alone claimed 93 of the bar's
158
- 198px, squeezing start to 25px and clipping the entity switcher inside it. An ambient
159
- status label is the first thing a compact bar drops, so it appears from sm up. */}
153
+ {}
160
154
  <Badge tone="warning" className="text-xs">
161
155
  ステージング
162
156
  </Badge>
@@ -48,7 +48,12 @@ export default function Demo() {
48
48
  <CardContent>
49
49
  <ContextMenu>
50
50
  {/* ui-audit-disable-next-line no-hand-rolled-surface — the dashed area is the right-click target the demo asks you to use */}
51
- <ContextMenuTrigger className="border-border h-36 w-full cursor-context-menu rounded-md border border-dashed">
51
+ {/* data-axe-open="contextmenu": check-frame-axe right-clicks here before its
52
+ overlay scan. */}
53
+ <ContextMenuTrigger
54
+ data-axe-open="contextmenu"
55
+ className="border-border h-36 w-full cursor-context-menu rounded-md border border-dashed"
56
+ >
52
57
  <Flex align="center" justify="center" gap="xs">
53
58
  <Text tone="muted">ここを右クリックしてください</Text>
54
59
  </Flex>
@@ -52,7 +52,8 @@ export default function Demo() {
52
52
  <Text>JE-0042 · 売上計上 ¥480,000</Text>
53
53
  <DropdownMenu>
54
54
  <DropdownMenuTrigger asChild>
55
- <Button variant="ghost" size="icon-sm" aria-label="行アクション">
55
+ {/* data-axe-open: opened by check-frame-axe before its overlay scan. */}
56
+ <Button data-axe-open variant="ghost" size="icon-sm" aria-label="行アクション">
56
57
  <MoreHorizontal />
57
58
  </Button>
58
59
  </DropdownMenuTrigger>
@@ -39,7 +39,7 @@ export default function Demo() {
39
39
  const [period, setPeriod] = useState("all");
40
40
  const hasActiveFilters = query !== "" || status !== "all";
41
41
 
42
- // Typed model (gh#258) — ALL state is consumer data; the bar only renders it.
42
+ // Typed model — ALL state is consumer data; the bar only renders it.
43
43
  const [modelQuery, setModelQuery] = useState("田中");
44
44
  const [modelStatus, setModelStatus] = useState("active");
45
45
  const [modelRole, setModelRole] = useState("");
@@ -80,7 +80,7 @@ export default function Demo() {
80
80
  subtitle="Search, labelled filters, active state, consumer-owned reset, and both responsive overflow strategies"
81
81
  >
82
82
  <Flex direction="col" gap="lg">
83
- {/* Typed model (gh#258) — search/filters/chips/reset/result-count/actions as DATA.
83
+ {/* Typed model — search/filters/chips/reset/result-count/actions as DATA.
84
84
  The bar owns layout, token widths, chip lifecycle and keyboard order; the page owns
85
85
  every piece of state. Remove a chip, reset, or pick a filter and watch the chips row
86
86
  and the localized result count follow. */}
@@ -97,7 +97,7 @@ export default function Demo() {
97
97
  onValueChange={handleChange}
98
98
  />
99
99
 
100
- {/* Regression: total=0, exactly one page, multiple pages, + the single-page opt-in (gh#153). */}
100
+ {/* Regression: total=0, exactly one page, multiple pages, + the single-page opt-in. */}
101
101
  <Card>
102
102
  <CardHeader>
103
103
  <CardTitle level={2}>境界状態 · 0 件 / 1 ページ / 複数ページ</CardTitle>
@@ -136,7 +136,7 @@ export default function Demo() {
136
136
  </CardContent>
137
137
  </Card>
138
138
 
139
- {/* Long localized total label — the row stays ONE line and never wraps on desktop (gh#153). */}
139
+ {/* Long localized total label — the row stays ONE line and never wraps on desktop. */}
140
140
  <Card>
141
141
  <CardHeader>
142
142
  <CardTitle level={2}>長いローカライズ済みラベル · 折り返さない</CardTitle>
@@ -229,7 +229,7 @@ export default function Demo() {
229
229
  </CardContent>
230
230
  </Card>
231
231
 
232
- {/* Inline row — the hosted-identity / device progression (gh#12) */}
232
+ {/* Inline row — the hosted-identity / device progression */}
233
233
  <Card>
234
234
  <CardHeader>
235
235
  <CardTitle level={2}>
@@ -67,13 +67,13 @@ export default function Demo() {
67
67
  </CardContent>
68
68
  </Card>
69
69
 
70
- {/* Disabled first item — fallback selection must skip it (gh#175) */}
70
+ {/* Disabled first item — fallback selection must skip it */}
71
71
  <Card>
72
72
  <CardHeader>
73
73
  <CardTitle level={2}>先頭タブが disabled · フォールバック選択</CardTitle>
74
74
  <CardDescription>
75
75
  defaultValue/value を渡さない場合、Tabs は先頭の ENABLED タブを自動選択する(disabled
76
- の先頭タブは選ばない)。全タブが disabled の場合は何も選択しない (gh#175)。
76
+ の先頭タブは選ばない)。全タブが disabled の場合は何も選択しない。
77
77
  </CardDescription>
78
78
  </CardHeader>
79
79
  <CardContent>
@@ -106,7 +106,7 @@ export default function Demo() {
106
106
  <CardTitle level={2}>320px stress · 長いローカライズラベル</CardTitle>
107
107
  <CardDescription>
108
108
  狭いコンテナでも長いラベルはクリップされず、水平タブリストが自身でスクロールする
109
- (gh#175)。compact navigation への変換は Tabs API に存在しないため擬似実装しない —
109
+ 。compact navigation への変換は Tabs API に存在しないため擬似実装しない —
110
110
  スクロールが意図した縮退動作。
111
111
  </CardDescription>
112
112
  </CardHeader>
@@ -50,6 +50,7 @@ import {
50
50
  CardContent,
51
51
  CardHeader,
52
52
  CardTitle,
53
+ ListRow,
53
54
  Progress,
54
55
  StatCard,
55
56
  Table,
@@ -353,27 +354,25 @@ export default function AcmePortalShowcase() {
353
354
  <CardContent flush>
354
355
  <ul className="divide-border divide-y">
355
356
  {QUEUE.map((q) => (
356
- <li key={q.title} className="px-4 py-3">
357
- <Flex align="center" gap="md">
357
+ <ListRow
358
+ as="li"
359
+ key={q.title}
360
+ leading={
358
361
  <Badge
359
362
  tone={q.tone}
360
363
  variant="outline"
361
364
  icon={q.icon}
362
365
  aria-label={q.title}
363
366
  />
364
- <div className="min-w-0 flex-1">
365
- <Text as="div" size="sm" weight="medium" truncate>
366
- {q.title}
367
- </Text>
368
- <Text as="div" size="xs" tone="muted" truncate>
369
- {q.meta}
370
- </Text>
371
- </div>
367
+ }
368
+ title={q.title}
369
+ description={q.meta}
370
+ trailing={
372
371
  <Button variant="outline" size="sm">
373
372
  {q.action}
374
373
  </Button>
375
- </Flex>
376
- </li>
374
+ }
375
+ />
377
376
  ))}
378
377
  </ul>
379
378
  </CardContent>
@@ -237,7 +237,7 @@ function SectionHead({
237
237
  center?: boolean;
238
238
  }) {
239
239
  return (
240
- <div className={center ? "mx-auto mb-10 text-center" : "mb-8"}>
240
+ <div className={center ? "mx-auto text-center" : undefined}>
241
241
  <div className="tx-eyebrow">{eyebrow}</div>
242
242
  <h2 className="tx-h2">{title}</h2>
243
243
  {sub ? <p className="tx-lead mx-auto">{sub}</p> : null}
@@ -272,7 +272,7 @@ function Services() {
272
272
  ];
273
273
  return (
274
274
  <section className="bg-card tx-section">
275
- <div className={SHELL}>
275
+ <Flex direction="col" gap="xl" className={SHELL}>
276
276
  <SectionHead
277
277
  center
278
278
  eyebrow="Dịch vụ"
@@ -296,7 +296,7 @@ function Services() {
296
296
  </Card>
297
297
  ))}
298
298
  </ResponsiveGrid>
299
- </div>
299
+ </Flex>
300
300
  </section>
301
301
  );
302
302
  }
@@ -310,7 +310,7 @@ function Steps() {
310
310
  ];
311
311
  return (
312
312
  <section className="bg-background tx-section">
313
- <div className={SHELL}>
313
+ <Flex direction="col" gap="xl" className={SHELL}>
314
314
  <SectionHead eyebrow="Quy trình" title="Mua hàng quốc tế trong 4 bước" />
315
315
  <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
316
316
  {steps.map(([Icon, t, d], i) => (
@@ -332,7 +332,7 @@ function Steps() {
332
332
  </Flex>
333
333
  ))}
334
334
  </ResponsiveGrid>
335
- </div>
335
+ </Flex>
336
336
  </section>
337
337
  );
338
338
  }
@@ -346,7 +346,7 @@ function Routes() {
346
346
  ];
347
347
  return (
348
348
  <section className="bg-card tx-section">
349
- <div className={SHELL}>
349
+ <Flex direction="col" gap="xl" className={SHELL}>
350
350
  <SectionHead eyebrow="Tuyến vận chuyển" title="Giá cước rõ ràng theo từng tuyến" />
351
351
  <ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
352
352
  {routes.map(([c, code, mode, price]) => (
@@ -370,7 +370,7 @@ function Routes() {
370
370
  </Card>
371
371
  ))}
372
372
  </ResponsiveGrid>
373
- </div>
373
+ </Flex>
374
374
  </section>
375
375
  );
376
376
  }
@@ -43,6 +43,7 @@ import {
43
43
  CardContent,
44
44
  CardHeader,
45
45
  CardTitle,
46
+ ListRow,
46
47
  Progress,
47
48
  StatCard,
48
49
  Table,
@@ -241,27 +242,25 @@ export default function WarehouseDashboardShowcase() {
241
242
  <ul className="divide-border divide-y">
242
243
  {QUEUE.map((q) => {
243
244
  return (
244
- <li key={q.title} className="px-4 py-3">
245
- <Flex align="center" gap="md">
245
+ <ListRow
246
+ as="li"
247
+ key={q.title}
248
+ leading={
246
249
  <Badge
247
250
  tone={q.tone}
248
251
  variant="outline"
249
252
  icon={q.icon}
250
253
  aria-label={q.title}
251
254
  />
252
- <div className="min-w-0 flex-1">
253
- <Text as="div" size="sm" weight="medium" truncate>
254
- {q.title}
255
- </Text>
256
- <Text as="div" size="2xs" tone="muted" truncate>
257
- {q.meta}
258
- </Text>
259
- </div>
255
+ }
256
+ title={q.title}
257
+ description={q.meta}
258
+ trailing={
260
259
  <Button variant="outline" size="sm">
261
260
  {q.action}
262
261
  </Button>
263
- </Flex>
264
- </li>
262
+ }
263
+ />
265
264
  );
266
265
  })}
267
266
  </ul>
@@ -44,6 +44,7 @@ import {
44
44
  CardContent,
45
45
  CardHeader,
46
46
  CardTitle,
47
+ Descriptions,
47
48
  StatCard,
48
49
  Table,
49
50
  TableBody,
@@ -58,6 +59,7 @@ import {
58
59
  Flex,
59
60
  PageContainer,
60
61
  ResponsiveGrid,
62
+ Separator,
61
63
  Sidebar,
62
64
  type SidebarSectionProp,
63
65
  } from "@godxjp/ui/layout";
@@ -228,7 +230,8 @@ function PunchCard() {
228
230
  </Flex>
229
231
 
230
232
  {/* Demo state stepper — lets a reader walk every FSM state at rest. */}
231
- <Flex direction="row" wrap gap="xs" className="border-t pt-3">
233
+ <Separator />
234
+ <Flex direction="row" wrap gap="xs">
232
235
  <Text size="2xs" tone="muted" className="self-center">
233
236
  状態:
234
237
  </Text>
@@ -415,25 +418,16 @@ export default function EmployeeMeShowcase() {
415
418
  本日のサマリー · Hôm nay
416
419
  </CardTitle>
417
420
  </CardHeader>
418
- <CardContent flush>
419
- <dl className="divide-border divide-y">
421
+ <CardContent>
422
+ <Descriptions columns={1} layout="horizontal" labelAlign="start">
420
423
  {SUMMARY.map((s) => (
421
- <Flex
422
- key={s.label}
423
- align="center"
424
- justify="between"
425
- gap="md"
426
- className="px-4 py-2.5"
427
- >
428
- <Text as="dt" size="sm" tone="muted" className="whitespace-nowrap">
429
- {s.label}
430
- </Text>
431
- <Text as="dd" size="sm" weight="medium" align="end" tabular>
424
+ <Descriptions.Item key={s.label} label={s.label}>
425
+ <Text size="sm" weight="medium" tabular>
432
426
  {s.value}
433
427
  </Text>
434
- </Flex>
428
+ </Descriptions.Item>
435
429
  ))}
436
- </dl>
430
+ </Descriptions>
437
431
  </CardContent>
438
432
  </Card>
439
433
  </ResponsiveGrid>