@godxjp/ui 21.0.0 → 22.0.0

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 (103) hide show
  1. package/dist/app/app-provider.js +2 -1
  2. package/dist/components/data-display/badge.d.ts +28 -1
  3. package/dist/components/data-display/badge.js +2 -0
  4. package/dist/components/data-display/data-table.d.ts +18 -2
  5. package/dist/components/data-display/data-table.js +4 -0
  6. package/dist/components/data-display/index.d.ts +1 -1
  7. package/dist/components/data-display/popover.d.ts +19 -1
  8. package/dist/components/data-display/popover.js +9 -1
  9. package/dist/components/data-display/progress.d.ts +37 -0
  10. package/dist/components/data-display/progress.js +57 -5
  11. package/dist/components/data-entry/date-picker.d.ts +10 -3
  12. package/dist/components/data-entry/date-picker.js +503 -238
  13. package/dist/components/data-entry/form-field.d.ts +1 -1
  14. package/dist/components/data-entry/form-field.js +4 -1
  15. package/dist/components/data-entry/form.js +10 -1
  16. package/dist/components/data-entry/index.d.ts +0 -6
  17. package/dist/components/data-entry/index.js +0 -6
  18. package/dist/components/data-entry/label.d.ts +14 -1
  19. package/dist/components/data-entry/label.js +6 -1
  20. package/dist/components/data-entry/radio.d.ts +27 -6
  21. package/dist/components/data-entry/radio.js +88 -43
  22. package/dist/components/data-entry/search-select.js +8 -1
  23. package/dist/components/data-entry/select.js +2 -0
  24. package/dist/components/data-entry/switch.d.ts +6 -3
  25. package/dist/components/data-entry/switch.js +34 -11
  26. package/dist/components/layout/mobile-shell.d.ts +1 -1
  27. package/dist/components/layout/mobile-shell.js +2 -0
  28. package/dist/components/navigation/menubar.d.ts +10 -3
  29. package/dist/components/navigation/steps.d.ts +1 -1
  30. package/dist/components/navigation/steps.js +3 -1
  31. package/dist/components/navigation/tabs-scroll.d.ts +27 -0
  32. package/dist/components/navigation/tabs-scroll.js +52 -1
  33. package/dist/components/navigation/tabs.d.ts +2 -2
  34. package/dist/components/navigation/tabs.js +88 -23
  35. package/dist/components/ui/index.d.ts +0 -1
  36. package/dist/components/ui/index.js +0 -1
  37. package/dist/components/ui/segmented.d.ts +15 -1
  38. package/dist/components/ui/segmented.js +13 -6
  39. package/dist/i18n/messages/en.json +3 -2
  40. package/dist/i18n/messages/ja.json +3 -2
  41. package/dist/i18n/messages/vi.json +3 -2
  42. package/dist/lib/datetime/picker-format.d.ts +18 -0
  43. package/dist/lib/datetime/picker-format.js +35 -1
  44. package/dist/lib/field-a11y.d.ts +12 -0
  45. package/dist/lib/field-a11y.js +14 -1
  46. package/dist/props/components/data-display.prop.d.ts +7 -0
  47. package/dist/props/components/data-entry.prop.d.ts +180 -99
  48. package/dist/props/components/index.d.ts +1 -1
  49. package/dist/props/components/layout.prop.d.ts +12 -1
  50. package/dist/props/components/navigation.prop.d.ts +76 -1
  51. package/dist/props/registry.d.ts +16 -16
  52. package/dist/props/registry.js +16 -15
  53. package/dist/props/vocabulary/data.prop.d.ts +12 -0
  54. package/dist/props/vocabulary/index.d.ts +2 -2
  55. package/dist/props/vocabulary/layout.prop.d.ts +11 -0
  56. package/dist/styles/badge-layout.css +4 -0
  57. package/dist/styles/card-layout.css +6 -6
  58. package/dist/styles/control.css +15 -6
  59. package/dist/styles/data-display-layout.css +76 -13
  60. package/dist/styles/focus-ring.css +4 -2
  61. package/dist/styles/navigation-layout.css +25 -0
  62. package/dist/styles/shell-layout.css +5 -0
  63. package/dist/styles/table-layout.css +34 -0
  64. package/dist/tokens/components/data-display.css +9 -0
  65. package/dist/tokens/components/navigation.css +6 -0
  66. package/dist/tokens/components/segmented.css +0 -2
  67. package/dist/tokens/components/shell.css +2 -0
  68. package/dist/tokens/components/table.css +3 -0
  69. package/dist/tokens/foundation.css +7 -0
  70. package/docs/COMPONENTS.md +14 -14
  71. package/docs/CONSUMER-RULES.md +24 -1
  72. package/docs/FRAME-COVERAGE-REPORT.md +3 -6
  73. package/docs/TOKENS.md +65 -0
  74. package/docs/data-display/badge.tsx +37 -0
  75. package/docs/data-display/data-table/index.tsx +18 -0
  76. package/docs/data-display/popover.tsx +41 -1
  77. package/docs/data-display/progress.tsx +28 -0
  78. package/docs/data-entry/calendar.tsx +2 -2
  79. package/docs/data-entry/date-picker.tsx +143 -3
  80. package/docs/data-entry/form/examples/invoice-form.tsx +2 -2
  81. package/docs/data-entry/form-field/examples/a11y-contract.tsx +3 -5
  82. package/docs/data-entry/form.tsx +4 -4
  83. package/docs/data-entry/number-input.tsx +31 -0
  84. package/docs/data-entry/segmented.tsx +103 -1
  85. package/docs/layout/mobile-shell.tsx +5 -0
  86. package/docs/navigation/tabs.tsx +149 -0
  87. package/docs/roadmap/antd-parity.md +35 -34
  88. package/docs/roadmap/parity-audit-data-entry.md +178 -165
  89. package/docs/roadmap/parity-backlog.md +6 -7
  90. package/docs/showcase/acme-portal.tsx +7 -0
  91. package/package.json +11 -23
  92. package/scripts/ui-audit.mjs +17 -4
  93. package/dist/components/data-entry/date-range-picker.d.ts +0 -11
  94. package/dist/components/data-entry/date-range-picker.js +0 -349
  95. package/dist/components/data-entry/month-picker.d.ts +0 -10
  96. package/dist/components/data-entry/month-picker.js +0 -241
  97. package/dist/components/data-entry/month-range-picker.d.ts +0 -10
  98. package/dist/components/data-entry/month-range-picker.js +0 -301
  99. package/dist/components/ui/date-range-picker.d.ts +0 -1
  100. package/dist/components/ui/date-range-picker.js +0 -2
  101. package/docs/data-entry/date-range-picker.tsx +0 -175
  102. package/docs/data-entry/month-picker.tsx +0 -101
  103. package/docs/data-entry/month-range-picker.tsx +0 -115
@@ -32,6 +32,11 @@ export default function Demo() {
32
32
 
33
33
  return (
34
34
  <MobileShell
35
+ // `width="phone"` because this frame is READ ON A DESKTOP. The shell's own docstring already
36
+ // named this case on the block axis (`height="fill"` for "a phone view embedded in a wider
37
+ // page"); the inline axis had no answer until now, so this page drew a 1232px-wide handheld
38
+ // app with its four tab-bar destinations spread across the screen.
39
+ width="phone"
35
40
  statusBar={
36
41
  <>
37
42
  <Text size="sm" weight="medium" tabular>
@@ -1,5 +1,7 @@
1
1
  import { useState } from "react";
2
2
 
3
+ import { Trash2 } from "lucide-react";
4
+
3
5
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
4
6
  import { Button, Text } from "@godxjp/ui/general";
5
7
  import { Flex, PageContainer } from "@godxjp/ui/layout";
@@ -44,8 +46,45 @@ const journalItems = [
44
46
  },
45
47
  ];
46
48
 
49
+ /**
50
+ * 20 saved views with real Japanese labels — a strip that is wider than 1920px, so it overflows at
51
+ * EVERY width the browser gates sweep. `scripts/check-tabs-overflow-menu.mjs` measures this frame;
52
+ * it fails if the strip ever stops overflowing, because a gate over a bar that fits proves nothing.
53
+ */
54
+ const savedViewItems = [
55
+ { value: "all", label: "すべての仕訳", content: <Text as="p">全 1,284 件</Text> },
56
+ { value: "pending", label: "未承認の仕訳", content: <Text as="p">未承認 2 件</Text> },
57
+ { value: "posted", label: "承認済の仕訳", content: <Text as="p">承認済 48 件</Text> },
58
+ { value: "voided", label: "取消済の仕訳", content: <Text as="p">取消済 3 件</Text> },
59
+ { value: "returned", label: "差戻しの仕訳", content: <Text as="p">差戻し 5 件</Text> },
60
+ { value: "draft", label: "下書きの仕訳", content: <Text as="p">下書き 12 件</Text> },
61
+ { value: "recurring", label: "定期仕訳のひな形", content: <Text as="p">ひな形 7 件</Text> },
62
+ { value: "accrual", label: "未払費用の計上", content: <Text as="p">未払費用 9 件</Text> },
63
+ { value: "prepaid", label: "前払費用の振替", content: <Text as="p">前払費用 4 件</Text> },
64
+ { value: "payroll", label: "給与支払の仕訳", content: <Text as="p">給与 3 件</Text> },
65
+ { value: "tax", label: "消費税の集計", content: <Text as="p">消費税 6 件</Text> },
66
+ { value: "closing", label: "決算整理の仕訳", content: <Text as="p">決算整理 11 件</Text> },
67
+ { value: "audit", label: "監査対象の仕訳", content: <Text as="p">監査対象 8 件</Text> },
68
+ {
69
+ value: "archived",
70
+ label: "アーカイブ済の仕訳",
71
+ content: <Text as="p">アーカイブ 214 件</Text>,
72
+ },
73
+ { value: "fx", label: "外貨建の換算差額", content: <Text as="p">換算差額 2 件</Text> },
74
+ { value: "intercompany", label: "関係会社間の取引", content: <Text as="p">関係会社 15 件</Text> },
75
+ {
76
+ value: "fixed-asset",
77
+ label: "固定資産の減価償却",
78
+ content: <Text as="p">減価償却 22 件</Text>,
79
+ },
80
+ { value: "inventory", label: "棚卸資産の評価替", content: <Text as="p">評価替 6 件</Text> },
81
+ { value: "bank", label: "銀行勘定の照合", content: <Text as="p">未照合 4 件</Text> },
82
+ { value: "reversal", label: "翌期首の振戻し", content: <Text as="p">振戻し 9 件</Text> },
83
+ ];
84
+
47
85
  export default function Demo() {
48
86
  const [activeTab, setActiveTab] = useState("pending");
87
+ const [reopened, setReopened] = useState(0);
49
88
  const [editableTabs, setEditableTabs] = useState([
50
89
  { value: "je-0042", label: "JE-0042", content: <Text as="p">売上計上 ¥480,000</Text> },
51
90
  { value: "je-0043", label: "JE-0043", content: <Text as="p">仕入計上 ¥120,000</Text> },
@@ -367,6 +406,116 @@ export default function Demo() {
367
406
  </CardContent>
368
407
  </Card>
369
408
 
409
+ {/* antd `more` — overflow="menu" beside the default overflow="scroll" */}
410
+ <Card>
411
+ <CardHeader>
412
+ <CardTitle level={2}>overflow · scroll(既定) / menu</CardTitle>
413
+ <CardDescription>
414
+ antd の more をこのライブラリの overflow 語彙に写したもの。既定の scroll
415
+ は今までどおり、帯が自分の水平オーバーフローをスクロールする。menu
416
+ はそれに加えて、帯の外に「他のタブ」ボタンを出し、いま見えていないタブだけを並べる ·
417
+ antd と違いタブは帯から取り除かれない(tablist はタブ以外を持てず、display:none
418
+ のタブはロービングフォーカスを受け取れないため · WAI-ARIA APG)。
419
+ </CardDescription>
420
+ </CardHeader>
421
+ <CardContent>
422
+ <Flex direction="col" gap="lg">
423
+ <Flex direction="col" gap="sm">
424
+ <Text as="p" size="sm" tone="muted">
425
+ overflow=&quot;scroll&quot;(既定)
426
+ </Text>
427
+ <Tabs
428
+ id="antd-overflow-scroll"
429
+ defaultValue="all"
430
+ variant="line"
431
+ items={savedViewItems}
432
+ />
433
+ </Flex>
434
+ <Flex direction="col" gap="sm">
435
+ <Text as="p" size="sm" tone="muted">
436
+ overflow=&quot;menu&quot;
437
+ </Text>
438
+ <Tabs
439
+ id="antd-overflow-menu"
440
+ defaultValue="all"
441
+ variant="line"
442
+ overflow="menu"
443
+ items={savedViewItems}
444
+ />
445
+ </Flex>
446
+ </Flex>
447
+ </CardContent>
448
+ </Card>
449
+
450
+ {/* antd onTabClick / removeIcon / Tab.forceRender */}
451
+ <Card>
452
+ <CardHeader>
453
+ <CardTitle level={2}>onTabClick · closeIcon · forceRender</CardTitle>
454
+ <CardDescription>
455
+ onTabClick は antd の onTabClick で、ポインタで押されたときだけ発火し DOM の
456
+ MouseEvent を渡す(キーボードは activationMode=&quot;manual&quot;
457
+ でフォーカス移動と選択が分かれるため発火しない · 選択は onValueChange
458
+ が担当)。closeIcon は antd の removeIcon で、タブ全体の既定グリフを差し替える(item
459
+ 側の closeIcon が優先)。item の forceRender は antd の Tab.forceRender
460
+ で、そのパネルだけを先にマウントし、他のタブに 切り替えても保持する。
461
+ </CardDescription>
462
+ </CardHeader>
463
+ <CardContent>
464
+ <Flex direction="col" gap="md">
465
+ <Text as="p" size="sm" tone="muted">
466
+ 同じタブを押し直した回数: {reopened}
467
+ </Text>
468
+ <Tabs
469
+ id="antd-tab-click"
470
+ defaultValue="pending"
471
+ variant="line"
472
+ onTabClick={(value) => {
473
+ if (value === activeTab) setReopened((count) => count + 1);
474
+ setActiveTab(value);
475
+ }}
476
+ items={[
477
+ {
478
+ value: "pending",
479
+ label: "未承認",
480
+ content: <Text as="p">未承認の仕訳が 2 件あります。</Text>,
481
+ },
482
+ {
483
+ value: "chart",
484
+ label: "推移グラフ",
485
+ // The one panel that must survive a tab switch — antd Tab.forceRender.
486
+ forceRender: true,
487
+ content: <Text as="p">月次推移: 4 月 ¥3,120,000 · 5 月 ¥4,820,000</Text>,
488
+ },
489
+ {
490
+ value: "posted",
491
+ label: "承認済",
492
+ content: <Text as="p">当期承認済: 48 件</Text>,
493
+ },
494
+ ]}
495
+ />
496
+ <Tabs
497
+ id="antd-remove-icon"
498
+ variant="editable-card"
499
+ defaultValue="je-0042"
500
+ closeIcon={<Trash2 aria-hidden="true" />}
501
+ onEdit={() => undefined}
502
+ items={[
503
+ {
504
+ value: "je-0042",
505
+ label: "JE-0042",
506
+ content: <Text as="p">売上計上 ¥480,000</Text>,
507
+ },
508
+ {
509
+ value: "je-0043",
510
+ label: "JE-0043",
511
+ content: <Text as="p">仕入計上 ¥120,000</Text>,
512
+ },
513
+ ]}
514
+ />
515
+ </Flex>
516
+ </CardContent>
517
+ </Card>
518
+
370
519
  <Card>
371
520
  <CardHeader>
372
521
  <CardTitle level={2}>tabPlacement · size · centered</CardTitle>
@@ -1,6 +1,6 @@
1
1
  # Ant Design parity — the audit programme
2
2
 
3
- > The complaint is systemic: *"hầu hết các component thiếu tính năng so với Ant Design."*
3
+ > The complaint is systemic: _"hầu hết các component thiếu tính năng so với Ant Design."_
4
4
  > This document is the **method**, so that 127 catalog entries can be audited by different agents
5
5
  > and still produce comparable, reviewable results. Per-component specs live in sibling files.
6
6
 
@@ -29,7 +29,7 @@ is machine-checkable, so check it before you hand it to anyone.
29
29
 
30
30
  **Spacing is not free-form.** `docs/SPACING.md` is binding:
31
31
 
32
- - Macro layout uses a **φ modular scale (≈1.618)**, *not* the 8pt grid. `xs`/`sm` = 4px grid,
32
+ - Macro layout uses a **φ modular scale (≈1.618)**, _not_ the 8pt grid. `xs`/`sm` = 4px grid,
33
33
  `md` = φ⁰, `lg` = φ¹, `xl` = φ². Applying Material's 8pt grid here is wrong, not "standard".
34
34
  - Tailwind `p-*` / `m-*` / `gap-*` are rejected by `no-utility-spacing`; hand-rolled `flex`/`grid`
35
35
  by `no-utility-layout`. Rows are `<Flex>`, stacks `<Flex direction="col" gap>`, grids
@@ -63,8 +63,8 @@ pnpm check:token-tiers && pnpm check:no-hardcoded-geometry && pnpm run audit
63
63
  ```
64
64
 
65
65
  This section exists because it was violated: a comparison table in
66
- `badge-tag-chip-count.md` wrote an antd `Badge` + `count` example to illustrate *Ant's* API and
67
- `check:doc-prop-existence` correctly read it as a claim about *ours*; and three specs named tokens
66
+ `badge-tag-chip-count.md` wrote an antd `Badge` + `count` example to illustrate _Ant's_ API and
67
+ `check:doc-prop-existence` correctly read it as a claim about _ours_; and three specs named tokens
68
68
  `--…-surface` / `--…-bg`, which the shape above forbids. Both were caught by gates that already
69
69
  existed and simply had not been run.
70
70
 
@@ -72,8 +72,8 @@ existed and simply had not been run.
72
72
 
73
73
  One row per antd capability. No prose findings.
74
74
 
75
- | Ant Design prop / behaviour | Status | Evidence | Verdict |
76
- | --- | --- | --- | --- |
75
+ | Ant Design prop / behaviour | Status | Evidence | Verdict |
76
+ | --------------------------- | --------------------------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------- |
77
77
  | `<prop>` — one-line meaning | `PRESENT` / `RENAMED` / `COVERED-ELSEWHERE` / `MISSING` / `WONT-PORT` | `src/…:line`, or the grep that found nothing | for `MISSING`: the godx prop name to add, or "composition" |
78
78
 
79
79
  - `RENAMED` — present under the house spelling. Record both names; no work.
@@ -88,12 +88,12 @@ but it is hand-rolled and a11y-risky), `P2` (nice to have).
88
88
 
89
89
  ### 3.1 Already specced — see the sibling documents
90
90
 
91
- | Area | Verdict | Spec |
92
- | --- | --- | --- |
93
- | `Tree` / `TreeList` / `TreeSelect` | `TreeSelect` fine; `TreeList` is not a tree; **`Tree` missing entirely** | `tree-components.md` |
94
- | Badge / Tag / Chip / Pill / Count | Count marker missing entirely; removable chip trapped inside `TagInput`; selectable chip already is `Toggle` | `badge-tag-chip-count.md` |
95
- | `List` (Ant `Listy`) / `Masonry` | Both missing entirely — no virtualization and no column packing anywhere in `src/` | `list-masonry.md` |
96
- | AI / chat surface | Nothing exists; 4 components + 6 compositions decided | `ai-chat-components.md` |
91
+ | Area | Verdict | Spec |
92
+ | ---------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------- |
93
+ | `Tree` / `TreeList` / `TreeSelect` | `TreeSelect` fine; `TreeList` is not a tree; **`Tree` missing entirely** | `tree-components.md` |
94
+ | Badge / Tag / Chip / Pill / Count | Count marker missing entirely; removable chip trapped inside `TagInput`; selectable chip already is `Toggle` | `badge-tag-chip-count.md` |
95
+ | `List` (Ant `Listy`) / `Masonry` | Both missing entirely — no virtualization and no column packing anywhere in `src/` | `list-masonry.md` |
96
+ | AI / chat surface | Nothing exists; 4 components + 6 compositions decided | `ai-chat-components.md` |
97
97
 
98
98
  ### 3.2 `Tabs`, `Steps`, `Segmented` — audited 2026-09-10
99
99
 
@@ -106,14 +106,14 @@ Present: `items` (incl. `closable`/`closeIcon`/`icon`), `value`/`defaultValue`/`
106
106
  (= antd `tabBarExtraContent`), `destroyOnHidden`, `onEdit`, `addIcon`, `hideAdd`. Overflow already
107
107
  scrolls and keeps the active tab visible (`src/components/navigation/tabs-scroll.ts`).
108
108
 
109
- | Gap | Priority | Verdict |
110
- | --- | --- | --- |
111
- | `moreIcon` + an overflow **"more" dropdown** when the strip cannot scroll (narrow viewports) | **P1** | Add. Scrolling alone hides tabs from a touch user with no affordance. |
112
- | `indicator: { size, align }` | P2 | Add as tokens (`--tabs-indicator-*`), not props — it is a design knob (cardinal rule #44). |
113
- | `tabBarGutter` | P2 | Token, not a prop. |
114
- | `animated` | P2 | `WONT-PORT` as a prop — motion is a system decision and must follow `prefers-reduced-motion`. |
115
- | `renderTabBar` | P2 | `WONT-PORT` — an escape hatch that lets a consumer bypass the a11y contract. |
116
- | `size` lacks `xs` | P2 | Add `xs` for the full `xs\|sm\|md\|lg` tier. |
109
+ | Gap | Priority | Verdict |
110
+ | -------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------- |
111
+ | `moreIcon` + an overflow **"more" dropdown** when the strip cannot scroll (narrow viewports) | **P1** | Add. Scrolling alone hides tabs from a touch user with no affordance. |
112
+ | `indicator: { size, align }` | P2 | Add as tokens (`--tabs-indicator-*`), not props — it is a design knob (cardinal rule #44). |
113
+ | `tabBarGutter` | P2 | Token, not a prop. |
114
+ | `animated` | P2 | `WONT-PORT` as a prop — motion is a system decision and must follow `prefers-reduced-motion`. |
115
+ | `renderTabBar` | P2 | `WONT-PORT` — an escape hatch that lets a consumer bypass the a11y contract. |
116
+ | `size` lacks `xs` | P2 | Add `xs` for the full `xs\|sm\|md\|lg` tier. |
117
117
 
118
118
  **`Steps`** (`src/props/components/navigation.prop.ts:201-240`).
119
119
  Present: `items` (`title`/`subtitle`/`description`/`icon`/`status`/`disabled`),
@@ -121,23 +121,24 @@ Present: `items` (`title`/`subtitle`/`description`/`icon`/`status`/`disabled`),
121
121
  (`default`/`dot`/`inline`/`navigation` — `dot` **is** antd's deprecated `progressDot`), `percent`,
122
122
  `titlePlacement`, `separator`.
123
123
 
124
- | Gap | Priority | Verdict |
125
- | --- | --- | --- |
126
- | `initial` — start the visible numbering at N | P2 | Add. Trivial, and real for resumed wizards. |
127
- | `responsive` — auto-switch to vertical on a narrow container | **P1** | Add. Today a horizontal 5-step bar on a phone is the caller's problem. |
128
- | `size` is `md\|sm` only | P2 | Extend to `xs\|sm\|md\|lg`. |
124
+ | Gap | Priority | Verdict |
125
+ | ------------------------------------------------------------ | -------- | ---------------------------------------------------------------------- |
126
+ | `initial` — start the visible numbering at N | P2 | Add. Trivial, and real for resumed wizards. |
127
+ | `responsive` — auto-switch to vertical on a narrow container | **P1** | Add. Today a horizontal 5-step bar on a phone is the caller's problem. |
128
+ | `size` is `md\|sm` only | P2 | Extend to `xs\|sm\|md\|lg`. |
129
129
 
130
- **`Segmented`** (`src/components/ui/segmented.tsx`). Built on Radix `RadioGroup` — the correct APG
131
- choice, and the comment explaining why it is not a `ToggleGroup` should be preserved verbatim.
130
+ **`Segmented`** (`src/components/ui/segmented.tsx`). Built on react-aria-components' `RadioGroup`
131
+ (Radix's, when this was audited) the correct APG choice either way, and the comment explaining why
132
+ it is not a `ToggleGroup` should be preserved verbatim.
132
133
  Present: `options` (`value`/`label`/`icon`/`disabled`), `value`/`defaultValue`/`onValueChange`,
133
134
  `block`, `vertical`, `size`, `disabled`, `name`.
134
135
 
135
- | Gap | Priority | Verdict |
136
- | --- | --- | --- |
137
- | `shape: 'default' \| 'round'` | P2 | Add as `shape` — the existing `ShapeProp` vocabulary already has `pill`; reuse it rather than antd's `round`. |
138
- | Option as a bare `string \| number` | P2 | Add. Ant accepts it; it removes ceremony for the common case. |
139
- | Per-option `title` (a tooltip / hover hint) | P2 | `COVERED-ELSEWHERE` — wrap the option in `Tooltip`. Do not add a second tooltip API. |
140
- | `size` lacks `xs` | P2 | Add. |
136
+ | Gap | Priority | Verdict |
137
+ | ------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
138
+ | `shape: 'default' \| 'round'` | P2 | Add as `shape` — the existing `ShapeProp` vocabulary already has `pill`; reuse it rather than antd's `round`. |
139
+ | Option as a bare `string \| number` | P2 | Add. Ant accepts it; it removes ceremony for the common case. |
140
+ | Per-option `title` (a tooltip / hover hint) | P2 | `COVERED-ELSEWHERE` — wrap the option in `Tooltip`. Do not add a second tooltip API. |
141
+ | `size` lacks `xs` | P2 | Add. |
141
142
 
142
143
  **None of these three is the source of the "doesn't look like Ant Design" impression** — that is
143
144
  `TreeList`, the missing count badge, and the missing `List`/`Masonry`/`Tree`.
@@ -146,7 +147,7 @@ Present: `options` (`value`/`label`/`icon`/`disabled`), `value`/`defaultValue`/`
146
147
 
147
148
  1. Read the group's catalog entries in `mcp/src/data/components.ts` and the prop types in
148
149
  `src/props/components/<group>.prop.ts`.
149
- 2. Fetch the matching Ant Design docs page for each. Where a component's *identity* is unclear,
150
+ 2. Fetch the matching Ant Design docs page for each. Where a component's _identity_ is unclear,
150
151
  settle it at <https://namethatui.com/?platform=web> before writing anything.
151
152
  3. Produce the §2 ledger per component. Cite file:line.
152
153
  4. Publish a GATE-0 C1–C7 ledger for anything proposed as a **new** component.