@godxjp/ui 23.0.0 → 23.2.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.
- package/dist/app/date-format-labels.d.ts +14 -2
- package/dist/app/date-format-labels.js +1 -1
- package/dist/app/date-formats.d.ts +14 -2
- package/dist/app/date-formats.js +9 -2
- package/dist/components/data-display/card.d.ts +45 -2
- package/dist/components/data-display/card.js +4 -2
- package/dist/components/data-display/data-table.d.ts +8 -1
- package/dist/components/data-display/data-table.js +9 -2
- package/dist/components/data-display/feature-list.d.ts +26 -0
- package/dist/components/data-display/feature-list.js +29 -0
- package/dist/components/data-display/index.d.ts +6 -0
- package/dist/components/data-display/index.js +6 -0
- package/dist/components/data-display/swatch.d.ts +24 -0
- package/dist/components/data-display/swatch.js +19 -0
- package/dist/components/data-display/thumbnail.d.ts +37 -0
- package/dist/components/data-display/thumbnail.js +20 -0
- package/dist/components/data-entry/checkbox.js +1 -1
- package/dist/components/data-entry/form-field.js +2 -2
- package/dist/components/data-entry/input.js +1 -1
- package/dist/components/data-entry/number-input.js +27 -6
- package/dist/components/data-entry/radio.js +1 -1
- package/dist/components/data-entry/switch.js +1 -1
- package/dist/components/feedback/dialog.js +2 -2
- package/dist/components/feedback/index.d.ts +2 -2
- package/dist/components/feedback/index.js +19 -1
- package/dist/components/feedback/sheet.js +2 -22
- package/dist/components/feedback/skeleton.d.ts +33 -3
- package/dist/components/feedback/skeleton.js +154 -3
- package/dist/components/layout/flex.d.ts +1 -1
- package/dist/components/layout/flex.js +17 -5
- package/dist/components/layout/sidebar.js +9 -2
- package/dist/components/navigation/filter-bar.js +2 -1
- package/dist/components/navigation/tabs-scroll.d.ts +27 -0
- package/dist/components/navigation/tabs-scroll.js +36 -1
- package/dist/components/navigation/tabs.d.ts +2 -2
- package/dist/components/navigation/tabs.js +60 -16
- package/dist/i18n/messages/en.json +10 -1
- package/dist/i18n/messages/ja.json +10 -1
- package/dist/i18n/messages/vi.json +10 -1
- package/dist/lib/breakpoint-token.d.ts +8 -0
- package/dist/lib/breakpoint-token.js +29 -0
- package/dist/props/components/data-display.prop.d.ts +101 -1
- package/dist/props/components/feedback.prop.d.ts +85 -1
- package/dist/props/components/layout.prop.d.ts +72 -1
- package/dist/props/components/navigation.prop.d.ts +80 -2
- package/dist/props/registry.d.ts +124 -1
- package/dist/props/registry.js +140 -0
- package/dist/props/vocabulary/data.prop.d.ts +5 -0
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/styles/alert-layout.css +139 -0
- package/dist/styles/card-layout.css +48 -0
- package/dist/styles/control.css +41 -5
- package/dist/styles/data-display-layout.css +88 -0
- package/dist/styles/focus-ring.css +28 -0
- package/dist/styles/form-layout.css +4 -0
- package/dist/styles/layout.css +2 -1
- package/dist/styles/navigation-layout.css +89 -5
- package/dist/styles/shell-layout.css +22 -0
- package/dist/styles/table-layout.css +5 -2
- package/dist/tokens/components/card.css +2 -0
- package/dist/tokens/components/control.css +8 -3
- package/dist/tokens/components/data-display.css +23 -0
- package/dist/tokens/components/feedback.css +18 -0
- package/dist/tokens/components/navigation.css +4 -0
- package/dist/tokens/foundation.css +18 -16
- package/docs/CONSUMER-RULES.md +8 -3
- package/docs/CUSTOMER-THEMING.md +18 -8
- package/docs/DATETIME.md +11 -2
- package/docs/DESIGN-AUTHORITY.md +2 -1
- package/docs/FRAME-COVERAGE-REPORT.md +29 -3
- package/docs/SPACING.md +35 -5
- package/docs/TOKENS.md +1 -1
- package/docs/assets/shot-landscape.svg +12 -0
- package/docs/assets/shot-portrait.svg +10 -0
- package/docs/data-display/card/index.tsx +40 -0
- package/docs/data-display/data-table/index.tsx +17 -2
- package/docs/data-display/feature-list.tsx +159 -0
- package/docs/data-display/swatch.tsx +107 -0
- package/docs/data-display/table.tsx +1 -1
- package/docs/data-display/thumbnail.tsx +128 -0
- package/docs/data-entry/segmented-in-filter-row.tsx +77 -0
- package/docs/feedback/skeleton.tsx +57 -0
- package/docs/layout/flex.tsx +29 -0
- package/docs/layout/sidebar.tsx +66 -10
- package/docs/navigation/dropdown-menu.tsx +4 -4
- package/docs/navigation/tabs.tsx +131 -0
- package/docs/roadmap/ai-chat-components.md +1 -2
- package/docs/roadmap/tree-components.md +0 -1
- package/package.json +12 -21
- package/scripts/_agent-setup.mjs +18 -0
- package/scripts/consumer-rule.md +16 -0
- package/scripts/guinea-pig-skill.md +12 -6
- package/scripts/ui-audit.mjs +184 -7
package/docs/navigation/tabs.tsx
CHANGED
|
@@ -46,6 +46,56 @@ const journalItems = [
|
|
|
46
46
|
},
|
|
47
47
|
];
|
|
48
48
|
|
|
49
|
+
/**
|
|
50
|
+
* A 設定 screen shaped like the one gh#502 was filed from: a vertical strip beside a panel whose
|
|
51
|
+
* content does NOT collapse below about 200px (an action row of two buttons). That min-content is
|
|
52
|
+
* what starved the strip — measured at 393px before the fold, the strip was 8px wide with 0px of
|
|
53
|
+
* tab in it. `pnpm check:frame-geometry` sweeps this frame at 320/375/390 and fails on the inline
|
|
54
|
+
* overflow it produced; a demo whose panel holds one short paragraph proves nothing, because a
|
|
55
|
+
* paragraph's min-content is one character wide.
|
|
56
|
+
*/
|
|
57
|
+
const settingItems = [
|
|
58
|
+
{
|
|
59
|
+
value: "general",
|
|
60
|
+
label: "基本設定",
|
|
61
|
+
content: (
|
|
62
|
+
<Flex direction="col" gap="sm">
|
|
63
|
+
<Text as="p">表示名・タイムゾーン・言語。</Text>
|
|
64
|
+
<Flex gap="sm">
|
|
65
|
+
<Button variant="outline">変更を破棄</Button>
|
|
66
|
+
<Button>保存する</Button>
|
|
67
|
+
</Flex>
|
|
68
|
+
</Flex>
|
|
69
|
+
),
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
value: "members",
|
|
73
|
+
label: "メンバー",
|
|
74
|
+
content: (
|
|
75
|
+
<Flex direction="col" gap="sm">
|
|
76
|
+
<Text as="p">招待済 8 名 · 管理者 2 名。</Text>
|
|
77
|
+
<Flex gap="sm">
|
|
78
|
+
<Button variant="outline">権限を見る</Button>
|
|
79
|
+
<Button>招待する</Button>
|
|
80
|
+
</Flex>
|
|
81
|
+
</Flex>
|
|
82
|
+
),
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
value: "billing",
|
|
86
|
+
label: "請求",
|
|
87
|
+
content: (
|
|
88
|
+
<Flex direction="col" gap="sm">
|
|
89
|
+
<Text as="p">次回請求日 2026年10月1日。</Text>
|
|
90
|
+
<Flex gap="sm">
|
|
91
|
+
<Button variant="outline">履歴を見る</Button>
|
|
92
|
+
<Button>支払方法</Button>
|
|
93
|
+
</Flex>
|
|
94
|
+
</Flex>
|
|
95
|
+
),
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
|
|
49
99
|
/**
|
|
50
100
|
* 20 saved views with real Japanese labels — a strip that is wider than 1920px, so it overflows at
|
|
51
101
|
* EVERY width the browser gates sweep. `scripts/check-tabs-overflow-menu.mjs` measures this frame;
|
|
@@ -553,6 +603,87 @@ export default function Demo() {
|
|
|
553
603
|
</Flex>
|
|
554
604
|
</CardContent>
|
|
555
605
|
</Card>
|
|
606
|
+
|
|
607
|
+
<Card>
|
|
608
|
+
<CardHeader>
|
|
609
|
+
<CardTitle level={2}>tabPlacement="start" · 狭い画面での折り返し</CardTitle>
|
|
610
|
+
<CardDescription>
|
|
611
|
+
縦のタブ列はパネルと同じインライン軸を共有するので、パネルの min-content
|
|
612
|
+
が画面の大半を占めると列が 0px
|
|
613
|
+
まで潰れ、開いているタブ以外へ行く手段が消える(gh#502)。
|
|
614
|
+
--tabs-placement-responsive-breakpoint-width(48rem)以下では start / end を top /
|
|
615
|
+
bottom へ折り返す。ロービングフォーカスの軸も一緒に切り替わる。
|
|
616
|
+
</CardDescription>
|
|
617
|
+
</CardHeader>
|
|
618
|
+
<CardContent>
|
|
619
|
+
<Tabs
|
|
620
|
+
id="antd-start-narrow"
|
|
621
|
+
defaultValue="general"
|
|
622
|
+
variant="line"
|
|
623
|
+
tabPlacement="start"
|
|
624
|
+
items={settingItems}
|
|
625
|
+
/>
|
|
626
|
+
</CardContent>
|
|
627
|
+
</Card>
|
|
628
|
+
|
|
629
|
+
<Card>
|
|
630
|
+
<CardHeader>
|
|
631
|
+
<CardTitle level={2}>indicator · animated</CardTitle>
|
|
632
|
+
<CardDescription>
|
|
633
|
+
Ant Design の indicator
|
|
634
|
+
は下線バーの長さと寄せ方を決める。size="full"(既定)はタブ全幅、size="label"
|
|
635
|
+
はタブ自身の左右パディングを引いた分、つまりラベルの幅。align
|
|
636
|
+
はバーが短いときだけ効く。animated は inkBar(下線のクロスフェード・既定 ON)と
|
|
637
|
+
tabPane(パネルのフェードイン・既定 OFF)の二つのスイッチで、prefers-reduced-motion
|
|
638
|
+
では両方とも止まる。
|
|
639
|
+
</CardDescription>
|
|
640
|
+
</CardHeader>
|
|
641
|
+
<CardContent>
|
|
642
|
+
<Flex direction="col" gap="lg">
|
|
643
|
+
<Tabs
|
|
644
|
+
id="antd-indicator-full"
|
|
645
|
+
defaultValue="pending"
|
|
646
|
+
variant="line"
|
|
647
|
+
items={journalItems}
|
|
648
|
+
/>
|
|
649
|
+
<Tabs
|
|
650
|
+
id="antd-indicator-label"
|
|
651
|
+
defaultValue="pending"
|
|
652
|
+
variant="line"
|
|
653
|
+
indicator={{ size: "label" }}
|
|
654
|
+
items={journalItems}
|
|
655
|
+
/>
|
|
656
|
+
<Tabs
|
|
657
|
+
id="antd-indicator-label-start"
|
|
658
|
+
defaultValue="pending"
|
|
659
|
+
variant="line"
|
|
660
|
+
indicator={{ size: "label", align: "start" }}
|
|
661
|
+
items={journalItems}
|
|
662
|
+
/>
|
|
663
|
+
<Tabs
|
|
664
|
+
id="antd-indicator-label-end"
|
|
665
|
+
defaultValue="pending"
|
|
666
|
+
variant="line"
|
|
667
|
+
indicator={{ size: "label", align: "end" }}
|
|
668
|
+
items={journalItems}
|
|
669
|
+
/>
|
|
670
|
+
<Tabs
|
|
671
|
+
id="antd-animated-off"
|
|
672
|
+
defaultValue="pending"
|
|
673
|
+
variant="line"
|
|
674
|
+
animated={false}
|
|
675
|
+
items={journalItems}
|
|
676
|
+
/>
|
|
677
|
+
<Tabs
|
|
678
|
+
id="antd-animated-pane"
|
|
679
|
+
defaultValue="pending"
|
|
680
|
+
variant="line"
|
|
681
|
+
animated={{ tabPane: true }}
|
|
682
|
+
items={journalItems}
|
|
683
|
+
/>
|
|
684
|
+
</Flex>
|
|
685
|
+
</CardContent>
|
|
686
|
+
</Card>
|
|
556
687
|
</Flex>
|
|
557
688
|
</PageContainer>
|
|
558
689
|
);
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
> **Naming:** when a component's identity is unclear, look it up at
|
|
5
5
|
> <https://namethatui.com/?platform=web> before inventing a name.
|
|
6
6
|
> **Contract:** `.claude/skills/godxjp-ui-component/SKILL.md` is the hard gate — MCP-first, real
|
|
7
|
-
> primitives only, `t()` + `Intl`, WAI-ARIA APG + WCAG 2.2 AA
|
|
7
|
+
> primitives only, `t()` + `Intl`, WAI-ARIA APG + WCAG 2.2 AA, logical CSS, controlled
|
|
8
8
|
> vocabulary, semantic tokens, MCP catalog entry, real-screen docs page.
|
|
9
9
|
|
|
10
10
|
The library has **zero** chat/AI components today (verified against `mcp/src/data/components.ts` —
|
|
@@ -187,7 +187,6 @@ Every component in the build set ships **all** of:
|
|
|
187
187
|
`check:token-tiers`; control boxes come from the `--control-height` tier.
|
|
188
188
|
4. Keys in `src/i18n/messages/en.json`, `vi.json`, `ja.json` — all three, no exceptions.
|
|
189
189
|
5. Tests in `src/components/<group>/__tests__/`: a behavior test using `@testing-library/user-event`
|
|
190
|
-
**and** a `<name>.a11y.test.tsx` with `expectNoA11yViolations` at **0 violations**.
|
|
191
190
|
6. An `mcp/src/data/components.ts` entry (props / usage / useCases / related / example / rules) —
|
|
192
191
|
`check:mcp-sync` and `check:mcp-orphans` must pass.
|
|
193
192
|
7. A real-screen docs page under `docs/<group>/` (AppShell + PageContainer + real primitives), not
|
|
@@ -100,7 +100,6 @@ Plus the house rules: forward `ref`, spread `...props`, accept `className` + `id
|
|
|
100
100
|
(`margin-inline-start`, `padding-inline-start`), never `ml-`/`pl-`/`left-`.
|
|
101
101
|
- Tri-state parent checkbox: checked / unchecked / **indeterminate** when only some descendants
|
|
102
102
|
are checked (skip propagation entirely when `checkStrictly`).
|
|
103
|
-
- Ships `tree.a11y.test.tsx` with `expectNoA11yViolations` — 0 violations.
|
|
104
103
|
|
|
105
104
|
## 5. Tokens (tier: `src/tokens/components/tree.css`, `@import`ed from `src/tokens/base.css`)
|
|
106
105
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@godxjp/ui",
|
|
3
|
-
"version": "23.
|
|
4
|
-
"godxUiMcp": "23.
|
|
3
|
+
"version": "23.2.0",
|
|
4
|
+
"godxUiMcp": "23.2.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -261,10 +261,6 @@
|
|
|
261
261
|
"types": "./dist/components/data-entry/textarea.d.ts",
|
|
262
262
|
"import": "./dist/components/data-entry/textarea.js"
|
|
263
263
|
},
|
|
264
|
-
"./ui/time-input": {
|
|
265
|
-
"types": "./dist/components/data-entry/time-input.d.ts",
|
|
266
|
-
"import": "./dist/components/data-entry/time-input.js"
|
|
267
|
-
},
|
|
268
264
|
"./ui/dialog": {
|
|
269
265
|
"types": "./dist/components/feedback/dialog.d.ts",
|
|
270
266
|
"import": "./dist/components/feedback/dialog.js"
|
|
@@ -326,29 +322,17 @@
|
|
|
326
322
|
"check:screen-reader-evidence": "node scripts/check-screen-reader-evidence.mjs",
|
|
327
323
|
"check:voiceover-capture": "node scripts/check-voiceover-capture.mjs",
|
|
328
324
|
"capture:voiceover": "node scripts/capture-voiceover-evidence.mjs",
|
|
329
|
-
"check:data-entry-frame-runtime": "node scripts/check-data-entry-frame-runtime.mjs",
|
|
330
325
|
"check:data-entry-owner-source": "node scripts/check-data-entry-owner-source.mjs",
|
|
331
326
|
"check:data-entry-touch-aria": "node scripts/check-data-entry-touch-aria.mjs",
|
|
332
|
-
"check:layout-nav-frames": "node scripts/check-layout-nav-frames.mjs",
|
|
333
|
-
"check:provider-feedback-query-runtime": "for frames in navigation-app-setting-picker,feedback-dialog,feedback-sheet,feedback-alert-dialog feedback-tooltip,feedback-toast,feedback-skeleton,query-data-state query-infinite-query-state,query-mutation-feedback,query-prefetch-link; do FRAMES=$frames node scripts/check-provider-feedback-query-runtime.mjs || exit 1; done",
|
|
334
|
-
"check:layout-nav-closure": "for frames in layout-flex,layout-app-shell,layout-aspect-ratio,layout-auth-shell layout-page-container,layout-resizable-panel,layout-separator,layout-sidebar layout-split-pane,layout-topbar,navigation-breadcrumb,navigation-app-setting-picker navigation-dropdown-menu navigation-steps,navigation-toolbar,navigation-tabs,navigation-pagination; do FRAMES=$frames node scripts/check-layout-nav-closure.mjs || exit 1; done",
|
|
335
327
|
"check:display-runtime-evidence": "node scripts/check-display-runtime-evidence.mjs",
|
|
336
|
-
"check:data-table-pagination-wrap": "node scripts/check-data-table-pagination-wrap.mjs",
|
|
337
328
|
"check:choice-hit-target": "node scripts/check-choice-hit-target.mjs",
|
|
338
|
-
"check:data-table-overflow": "node scripts/check-data-table-overflow.mjs",
|
|
339
329
|
"check:app-shell-narrow-grid": "node scripts/check-app-shell-narrow-grid.mjs",
|
|
340
|
-
"check:segmented-wrap": "node scripts/check-segmented-wrap.mjs",
|
|
341
|
-
"check:tabs-overflow-menu": "node scripts/check-tabs-overflow-menu.mjs",
|
|
342
|
-
"check:button-icon-xs": "node scripts/check-button-icon-xs.mjs",
|
|
343
|
-
"check:timeline-title-fill": "node scripts/check-timeline-title-fill.mjs",
|
|
344
|
-
"check:descriptions-label-value-step": "node scripts/check-descriptions-label-value-step.mjs",
|
|
345
330
|
"check:frame-contracts": "pnpm check:component-api-manifest && pnpm audit:component-cases && pnpm check:frame-coverage && pnpm check:frame-coverage-ledger && pnpm check:screen-reader-evidence && pnpm check:data-entry-owner-source && pnpm check:display-runtime-evidence",
|
|
346
|
-
"check:
|
|
347
|
-
"check:frame-runtime": "pnpm check:data-entry-frame-runtime && pnpm check:data-entry-touch-aria && pnpm check:layout-nav-frames && pnpm check:provider-feedback-query-runtime && pnpm check:layout-nav-closure && pnpm check:final-touch-rtl && pnpm check:data-table-pagination-wrap && pnpm check:data-table-overflow && pnpm check:app-shell-narrow-grid && pnpm check:choice-hit-target && pnpm check:segmented-wrap && pnpm check:tabs-overflow-menu && pnpm check:button-icon-xs && pnpm check:timeline-title-fill && pnpm check:descriptions-label-value-step",
|
|
331
|
+
"check:frame-runtime": "pnpm check:data-entry-touch-aria && pnpm check:app-shell-narrow-grid && pnpm check:choice-hit-target",
|
|
348
332
|
"verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:radix-surface && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:disclosure-duplication && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
|
|
349
333
|
"verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:radix-surface && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:disclosure-duplication && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
|
|
350
334
|
"verify:ci": "pnpm verify:ci:static && pnpm check:frame-contracts && pnpm test",
|
|
351
|
-
"verify:ci:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:registry && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:no-antd-runtime && pnpm check:radix-surface && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:disclosure-duplication && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:gate-coverage && pnpm check:mcp-prop-sync && pnpm check:catalog-contradictions && pnpm check:catalog-snippets",
|
|
335
|
+
"verify:ci:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:registry && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:no-antd-runtime && pnpm check:radix-surface && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:disclosure-duplication && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-lockstep && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-catalog-completeness && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:gate-coverage && pnpm check:mcp-prop-sync && pnpm check:catalog-contradictions && pnpm check:catalog-snippets",
|
|
352
336
|
"verify:browser": "pnpm check:contrast && pnpm check:text-ink-clip && pnpm check:font-fallback-metrics && pnpm check:visual-audit",
|
|
353
337
|
"verify:release": "pnpm verify:static && pnpm check:frame-contracts && pnpm check:frame-coverage",
|
|
354
338
|
"verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve",
|
|
@@ -359,6 +343,7 @@
|
|
|
359
343
|
"check:mcp-sync": "node scripts/check-mcp-sync.mjs",
|
|
360
344
|
"check:mcp-catalog-coverage": "node scripts/check-mcp-catalog-coverage.mjs",
|
|
361
345
|
"check:mcp-orphans": "node scripts/check-mcp-orphans.mjs",
|
|
346
|
+
"check:mcp-catalog-completeness": "node scripts/check-mcp-catalog-completeness.mjs",
|
|
362
347
|
"check:catalog-contradictions": "node scripts/check-catalog-contradictions.mjs",
|
|
363
348
|
"check:mcp-prop-sync": "node scripts/check-mcp-prop-sync.mjs",
|
|
364
349
|
"check:doc-prop-existence": "node scripts/check-doc-prop-existence.mjs",
|
|
@@ -406,7 +391,13 @@
|
|
|
406
391
|
"postinstall": "node scripts/postinstall.mjs",
|
|
407
392
|
"init-agent": "node scripts/init-agent-kit.mjs",
|
|
408
393
|
"check:use-client": "node scripts/check-use-client.mjs",
|
|
409
|
-
"check:catalog-snippets": "node scripts/audit-catalog-snippets.mjs"
|
|
394
|
+
"check:catalog-snippets": "node scripts/audit-catalog-snippets.mjs",
|
|
395
|
+
"check:data-entry-frame-runtime": "node scripts/check-data-entry-frame-runtime.mjs",
|
|
396
|
+
"check:data-table-empty-inset": "node scripts/check-data-table-empty-inset.mjs",
|
|
397
|
+
"check:number-input-step-target": "node scripts/check-number-input-step-target.mjs",
|
|
398
|
+
"check:mcp-token-sync": "node scripts/gen-component-tokens.mjs --check",
|
|
399
|
+
"check:email-token-sync": "node scripts/gen-email-tokens.mjs --check",
|
|
400
|
+
"check:focus-ring-paint": "node scripts/check-focus-ring-paint.mjs"
|
|
410
401
|
},
|
|
411
402
|
"peerDependencies": {
|
|
412
403
|
"@hookform/resolvers": "^5.2.0",
|
package/scripts/_agent-setup.mjs
CHANGED
|
@@ -372,6 +372,24 @@ export function ensureConsumerRules(root) {
|
|
|
372
372
|
mkdirSync(dir, { recursive: true });
|
|
373
373
|
writeFileSync(target, next);
|
|
374
374
|
|
|
375
|
+
// Prettier and this writer were fighting over the same file: the body holds aligned markdown
|
|
376
|
+
// tables, Prettier reformats them, the digest changes, the next install writes it back, and
|
|
377
|
+
// `format:check` goes red again — a loop with no winner, and the consumer is who is stuck in it
|
|
378
|
+
// (godx-jp/id#513). The file is OURS; say so to Prettier once, idempotently.
|
|
379
|
+
const ignoreFile = join(root, ".prettierignore");
|
|
380
|
+
if (existsSync(ignoreFile)) {
|
|
381
|
+
const cur = readFileSync(ignoreFile, "utf8");
|
|
382
|
+
const owned = [".ai/rules/godxjp-ui.md", ".claude/godxjp-ui-workflow.md"].filter(
|
|
383
|
+
(line) => !cur.includes(line),
|
|
384
|
+
);
|
|
385
|
+
if (owned.length) {
|
|
386
|
+
writeFileSync(
|
|
387
|
+
ignoreFile,
|
|
388
|
+
`${cur.replace(/\s*$/, "")}\n\n# Owned by @godxjp/ui — rewritten on every install, never hand-formatted.\n${owned.join("\n")}\n`,
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
375
393
|
// Only touch the index when the repo keeps one; a missing index means the repo reads rule files
|
|
376
394
|
// directly, and inventing one would change how it loads everything else.
|
|
377
395
|
const index = join(dir, "index.md");
|
package/scripts/consumer-rule.md
CHANGED
|
@@ -9,6 +9,22 @@
|
|
|
9
9
|
`docs/CONSUMER-RULES.md` (10 luật) và, với kho chuột bạch, ở
|
|
10
10
|
`.claude/skills/godx-ui-guinea-pig/SKILL.md`.
|
|
11
11
|
|
|
12
|
+
## Nạp style: HAI lối vào, và lối thứ hai không chở font
|
|
13
|
+
|
|
14
|
+
```css
|
|
15
|
+
@import "@godxjp/ui/styles"; /* mọi layer + Noto Sans JP / M PLUS 2 đóng gói sẵn */
|
|
16
|
+
@import "@godxjp/ui/styles/core"; /* CÙNG các layer ấy, KHÔNG một @font-face nào */
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Chọn `core` khi kho tự lo mặt chữ, hoặc khi không muốn chở font: `@fontsource` cắt
|
|
20
|
+
Noto Sans JP thành hàng trăm lát `unicode-range`, và trình duyệt chỉ biết cần lát nào
|
|
21
|
+
SAU khi đã dựng bố cục — một consumer đo được **737 lát / 13 MB**, gấp bảy lần toàn bộ
|
|
22
|
+
JavaScript của họ, cộng ~8 vòng tải mỗi lần chuyển màn.
|
|
23
|
+
|
|
24
|
+
`core` không phải cherry-pick: nó là một trong hai lối vào được hỗ trợ, và thứ tự layer
|
|
25
|
+
vẫn nguyên vẹn. Cherry-pick từng layer riêng lẻ thì vẫn cấm — đó là thứ làm vỡ hợp đồng
|
|
26
|
+
thứ tự, không phải việc chọn lối vào.
|
|
27
|
+
|
|
12
28
|
## Bố cục chuẩn của platform: BA CỘT, và ba cột là BA PHẠM VI
|
|
13
29
|
|
|
14
30
|
Vỏ mặc định của mọi app trên platform là ba cột, dựng bằng một `AppShell`:
|
|
@@ -45,12 +45,17 @@ chúng. Không chép lại ở đây. Ba điều cấm riêng của **chuột b
|
|
|
45
45
|
`w-[240px]`, `text-muted-foreground`.
|
|
46
46
|
3. **Gõ mã màu hex hay số đo ngoài thang token.**
|
|
47
47
|
|
|
48
|
-
Thước đo, chạy trước mọi lần review
|
|
48
|
+
Thước đo, chạy trước mọi lần review — **quét đúng thứ bạn vừa đụng vào**:
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
node node_modules/@godxjp/ui/scripts/ui-audit.mjs
|
|
51
|
+
node node_modules/@godxjp/ui/scripts/ui-audit.mjs --changed # 0 lỗi là mức đạt
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
`--changed` lấy danh sách từ diff so với merge-base, nên nó thấy cả file sửa bằng
|
|
55
|
+
shell — thứ hook `PostToolUse` không thấy. Quét cả `resources/js` chỉ khi việc được
|
|
56
|
+
giao ĐÚNG là soát toàn bộ UI: trên một kho cũ, nó trả về hàng trăm phát hiện thuộc
|
|
57
|
+
mã kế thừa và chôn mất cái bạn vừa tạo ra.
|
|
58
|
+
|
|
54
59
|
Một lỗi bạn **không sửa được ở phía consumer** chính là một khoảng trống của DS.
|
|
55
60
|
Nó là đầu vào của §3, không phải một ngoại lệ để nới.
|
|
56
61
|
|
|
@@ -116,10 +121,11 @@ tarball đường dẫn máy bạn lọt vào commit. `main` phải `npm ci` đ
|
|
|
116
121
|
|
|
117
122
|
### Bước 5 — Cổng của DS
|
|
118
123
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
**KHÔNG chạy `pnpm verify:ci` / `pnpm test` của kho DS khi chưa được chủ dự án cho
|
|
125
|
+
phép trong chính lượt trao đổi ấy.** Đó là bộ đầy đủ của một kho KHÁC — hàng nghìn
|
|
126
|
+
test cộng các cổng trình duyệt, hàng chục phút máy mỗi lượt. Chạy đúng test bạn vừa
|
|
127
|
+
viết cho thay đổi này, đẩy nhánh, rồi đọc cổng đỏ trên Actions: `ci.yml` chạy y hệt
|
|
128
|
+
những thứ ấy trên PR. **Tới được bước này KHÔNG phải là được phép.**
|
|
123
129
|
|
|
124
130
|
**Không nới, không tắt, không thêm ngoại lệ để lấy màu xanh.** Một cổng đỏ là
|
|
125
131
|
một câu hỏi, không phải một chướng ngại. Nếu bạn tin cổng ấy sai thì nói ra và
|