@godxjp/ui 23.0.0 → 23.1.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/data-table.d.ts +8 -1
- package/dist/components/data-display/data-table.js +9 -2
- 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/sheet.js +2 -22
- package/dist/components/navigation/filter-bar.js +2 -1
- package/dist/components/navigation/tabs.js +16 -4
- package/dist/i18n/messages/en.json +5 -1
- package/dist/i18n/messages/ja.json +5 -1
- package/dist/i18n/messages/vi.json +5 -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 +8 -1
- package/dist/props/components/navigation.prop.d.ts +8 -1
- package/dist/props/registry.d.ts +6 -1
- package/dist/props/registry.js +6 -0
- package/dist/props/vocabulary/data.prop.d.ts +5 -0
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/styles/control.css +41 -5
- 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 +13 -2
- package/dist/styles/shell-layout.css +4 -0
- package/dist/styles/table-layout.css +5 -2
- package/dist/tokens/components/control.css +8 -3
- package/dist/tokens/components/navigation.css +2 -0
- package/docs/CONSUMER-RULES.md +7 -2
- package/docs/CUSTOMER-THEMING.md +18 -8
- package/docs/DATETIME.md +11 -2
- package/docs/SPACING.md +35 -5
- package/docs/TOKENS.md +1 -1
- package/docs/data-display/data-table/index.tsx +17 -2
- package/docs/data-display/table.tsx +1 -1
- package/docs/data-entry/segmented-in-filter-row.tsx +77 -0
- package/docs/navigation/dropdown-menu.tsx +4 -4
- package/docs/navigation/tabs.tsx +72 -0
- package/docs/roadmap/ai-chat-components.md +1 -2
- package/docs/roadmap/tree-components.md +0 -1
- package/package.json +11 -17
- package/scripts/_agent-setup.mjs +18 -0
- package/scripts/guinea-pig-skill.md +12 -6
- package/scripts/ui-audit.mjs +184 -6
|
@@ -70,7 +70,7 @@ export default function Demo() {
|
|
|
70
70
|
</CardDescription>
|
|
71
71
|
</CardHeader>
|
|
72
72
|
<CardContent>
|
|
73
|
-
<Flex direction="row" align="center" gap="md">
|
|
73
|
+
<Flex direction="row" align="center" gap="md" wrap>
|
|
74
74
|
<Text>JE-0042 · 売上計上 ¥480,000</Text>
|
|
75
75
|
<DropdownMenu>
|
|
76
76
|
<DropdownMenuTrigger asChild>
|
|
@@ -102,7 +102,7 @@ export default function Demo() {
|
|
|
102
102
|
</CardDescription>
|
|
103
103
|
</CardHeader>
|
|
104
104
|
<CardContent>
|
|
105
|
-
<Flex direction="row" align="center" gap="md">
|
|
105
|
+
<Flex direction="row" align="center" gap="md" wrap>
|
|
106
106
|
<DropdownMenu trigger={["contextMenu"]}>
|
|
107
107
|
<DropdownMenuTrigger asChild>
|
|
108
108
|
<Button variant="outline">仕訳 JE-0042 を右クリック</Button>
|
|
@@ -130,7 +130,7 @@ export default function Demo() {
|
|
|
130
130
|
</CardDescription>
|
|
131
131
|
</CardHeader>
|
|
132
132
|
<CardContent>
|
|
133
|
-
<Flex direction="row" align="center" gap="md">
|
|
133
|
+
<Flex direction="row" align="center" gap="md" wrap>
|
|
134
134
|
<DropdownMenu trigger={["hover"]}>
|
|
135
135
|
<DropdownMenuTrigger asChild>
|
|
136
136
|
<Button variant="outline">エクスポート</Button>
|
|
@@ -171,7 +171,7 @@ export default function Demo() {
|
|
|
171
171
|
</CardDescription>
|
|
172
172
|
</CardHeader>
|
|
173
173
|
<CardContent>
|
|
174
|
-
<Flex direction="row" align="center" gap="md">
|
|
174
|
+
<Flex direction="row" align="center" gap="md" wrap>
|
|
175
175
|
<span className="text-sm">
|
|
176
176
|
現在のステータス:{" "}
|
|
177
177
|
<strong>
|
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,28 @@ 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>
|
|
556
628
|
</Flex>
|
|
557
629
|
</PageContainer>
|
|
558
630
|
);
|
|
@@ -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.1.0",
|
|
4
|
+
"godxUiMcp": "23.1.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -326,29 +326,17 @@
|
|
|
326
326
|
"check:screen-reader-evidence": "node scripts/check-screen-reader-evidence.mjs",
|
|
327
327
|
"check:voiceover-capture": "node scripts/check-voiceover-capture.mjs",
|
|
328
328
|
"capture:voiceover": "node scripts/capture-voiceover-evidence.mjs",
|
|
329
|
-
"check:data-entry-frame-runtime": "node scripts/check-data-entry-frame-runtime.mjs",
|
|
330
329
|
"check:data-entry-owner-source": "node scripts/check-data-entry-owner-source.mjs",
|
|
331
330
|
"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
331
|
"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
332
|
"check:choice-hit-target": "node scripts/check-choice-hit-target.mjs",
|
|
338
|
-
"check:data-table-overflow": "node scripts/check-data-table-overflow.mjs",
|
|
339
333
|
"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
334
|
"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",
|
|
335
|
+
"check:frame-runtime": "pnpm check:data-entry-touch-aria && pnpm check:app-shell-narrow-grid && pnpm check:choice-hit-target",
|
|
348
336
|
"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
337
|
"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
338
|
"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",
|
|
339
|
+
"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-pattern-imports && pnpm check:audit-sync && pnpm check:gate-coverage && pnpm check:mcp-prop-sync && pnpm check:catalog-contradictions && pnpm check:catalog-snippets",
|
|
352
340
|
"verify:browser": "pnpm check:contrast && pnpm check:text-ink-clip && pnpm check:font-fallback-metrics && pnpm check:visual-audit",
|
|
353
341
|
"verify:release": "pnpm verify:static && pnpm check:frame-contracts && pnpm check:frame-coverage",
|
|
354
342
|
"verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve",
|
|
@@ -406,7 +394,13 @@
|
|
|
406
394
|
"postinstall": "node scripts/postinstall.mjs",
|
|
407
395
|
"init-agent": "node scripts/init-agent-kit.mjs",
|
|
408
396
|
"check:use-client": "node scripts/check-use-client.mjs",
|
|
409
|
-
"check:catalog-snippets": "node scripts/audit-catalog-snippets.mjs"
|
|
397
|
+
"check:catalog-snippets": "node scripts/audit-catalog-snippets.mjs",
|
|
398
|
+
"check:data-entry-frame-runtime": "node scripts/check-data-entry-frame-runtime.mjs",
|
|
399
|
+
"check:data-table-empty-inset": "node scripts/check-data-table-empty-inset.mjs",
|
|
400
|
+
"check:number-input-step-target": "node scripts/check-number-input-step-target.mjs",
|
|
401
|
+
"check:mcp-token-sync": "node scripts/gen-component-tokens.mjs --check",
|
|
402
|
+
"check:email-token-sync": "node scripts/gen-email-tokens.mjs --check",
|
|
403
|
+
"check:focus-ring-paint": "node scripts/check-focus-ring-paint.mjs"
|
|
410
404
|
},
|
|
411
405
|
"peerDependencies": {
|
|
412
406
|
"@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");
|
|
@@ -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à
|