@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
@@ -191,10 +191,13 @@ function StateSection({
191
191
  * the loading skeleton visibly preserves the table's column layout. */
192
192
  function TableShell({
193
193
  caption,
194
+ banner,
194
195
  children,
195
196
  }: {
196
197
  caption: React.ReactNode;
197
- children: React.ReactNode;
198
+ /** Padded band between the header and the flush table body (an Alert). */
199
+ banner?: React.ReactNode;
200
+ children?: React.ReactNode;
198
201
  }) {
199
202
  return (
200
203
  <Card>
@@ -206,7 +209,8 @@ function TableShell({
206
209
  </Text>
207
210
  </CardAction>
208
211
  </CardHeader>
209
- <CardContent flush>{children}</CardContent>
212
+ {banner ? <CardContent>{banner}</CardContent> : null}
213
+ {children ? <CardContent flush>{children}</CardContent> : null}
210
214
  </Card>
211
215
  );
212
216
  }
@@ -288,8 +292,9 @@ export default function Demo() {
288
292
  title="エラー"
289
293
  note="エラーコード・リクエストID・再試行を明示する。"
290
294
  >
291
- <TableShell caption="取得に失敗しました">
292
- <div className="p-4">
295
+ <TableShell
296
+ caption="取得に失敗しました"
297
+ banner={
293
298
  <Alert tone="destructive">
294
299
  <AlertTitle>勤怠データを取得できませんでした</AlertTitle>
295
300
  <AlertDescription>
@@ -307,8 +312,8 @@ export default function Demo() {
307
312
  </Button>
308
313
  </AlertActions>
309
314
  </Alert>
310
- </div>
311
- </TableShell>
315
+ }
316
+ />
312
317
  </StateSection>
313
318
 
314
319
  {/* 4 ─ partial: some rows loaded, one segment failed / stale */}
@@ -317,29 +322,29 @@ export default function Demo() {
317
322
  title="部分的"
318
323
  note="一部のみ取得できた状態。失敗した区分だけを再取得できる。"
319
324
  >
320
- <TableShell caption="4 / 5 部署を表示中">
321
- <div>
322
- <div className="p-4 pb-0">
323
- <Alert tone="warning">
324
- <AlertTitle>一部のデータを取得できませんでした</AlertTitle>
325
- <AlertDescription>
326
- 「倉庫」部署の打刻が取得できなかったため、最新ではない可能性があります。
327
- <br />
328
- <Text tone="muted">
329
- コード <code className="tabular-nums">ATTEND_PARTIAL_倉庫</code> ・
330
- リクエストID <code className="tabular-nums">req_7f3a91c0e8</code>
331
- </Text>
332
- </AlertDescription>
333
- <AlertActions>
334
- <Button variant="outline" size="sm">
335
- <RefreshCw aria-hidden="true" />
336
- 倉庫を再取得
337
- </Button>
338
- </AlertActions>
339
- </Alert>
340
- </div>
341
- <DataTable data={PARTIAL_ROWS} columns={COLUMNS} getRowId={(r) => r.id} />
342
- </div>
325
+ <TableShell
326
+ caption="4 / 5 部署を表示中"
327
+ banner={
328
+ <Alert tone="warning">
329
+ <AlertTitle>一部のデータを取得できませんでした</AlertTitle>
330
+ <AlertDescription>
331
+ 「倉庫」部署の打刻が取得できなかったため、最新ではない可能性があります。
332
+ <br />
333
+ <Text tone="muted">
334
+ コード <code className="tabular-nums">ATTEND_PARTIAL_倉庫</code> ・ リクエストID{" "}
335
+ <code className="tabular-nums">req_7f3a91c0e8</code>
336
+ </Text>
337
+ </AlertDescription>
338
+ <AlertActions>
339
+ <Button variant="outline" size="sm">
340
+ <RefreshCw aria-hidden="true" />
341
+ 倉庫を再取得
342
+ </Button>
343
+ </AlertActions>
344
+ </Alert>
345
+ }
346
+ >
347
+ <DataTable data={PARTIAL_ROWS} columns={COLUMNS} getRowId={(r) => r.id} />
343
348
  </TableShell>
344
349
  </StateSection>
345
350
 
@@ -241,12 +241,13 @@ export default function Demo() {
241
241
  <TableHead className={`${PIN_LEFT} w-56 min-w-56`}>従業員</TableHead>
242
242
  {DAYS.map((d) => (
243
243
  <TableHead key={d.key} className="text-center">
244
- <span className="flex flex-col leading-tight">
244
+ {/* Weekday over its date reads as ONE label — no seam between the lines. */}
245
+ <Flex direction="col" gap="none" className="leading-tight">
245
246
  <Text weight="medium">{d.label}</Text>
246
247
  <Text size="2xs" tone="muted" tabular>
247
248
  {d.date}
248
249
  </Text>
249
- </span>
250
+ </Flex>
250
251
  </TableHead>
251
252
  ))}
252
253
  <TableHead className="text-end tabular-nums">実働</TableHead>
@@ -10,10 +10,11 @@
10
10
  *
11
11
  * row model ........ flatten an org tree to rows carrying { depth, hasChildren,
12
12
  * expanded }, then derive `visibleRows` from the open set.
13
- * tree column ...... ColumnDef.render draws a 14px-per-level indent (CSS var,
14
- * not a fixed layout dimension) + a twirl chevron Button
15
- * (ghost icon-sm) that rotates 90° when expanded — rendered
16
- * ONLY on parent rows; leaves get an aligning spacer.
13
+ * tree column ...... ColumnDef.render indents one --table-cell-indent-space-step
14
+ * per level (the token `<TableCell indent>` reads) + a twirl
15
+ * chevron Button (ghost icon-sm) that rotates 90° when
16
+ * expanded — rendered ONLY on parent rows; leaves get an
17
+ * aligning spacer.
17
18
  * metrics .......... 出勤率 / 遅刻 / 残業 as tabular-nums columns; 承認状態 as Badge(tone).
18
19
  * chrome ........... DataTable.Toolbar + DensityToggle + sticky header (built in).
19
20
  *
@@ -242,9 +243,12 @@ const hours = new Intl.NumberFormat("ja-JP", {
242
243
  });
243
244
 
244
245
  // ── Tree name cell ───────────────────────────────────────────────────────────────
245
- // 14px indent per level via a CSS custom property (data-driven, not a fixed layout
246
- // dimension). Twirl chevron is rendered ONLY on parent rows; leaves get a spacer so
247
- // names stay aligned at the same depth.
246
+ // One `--table-cell-indent-space-step` per level the SAME token `<TableCell indent>`
247
+ // reads, so the tree and a hand-authored table indent on one contract and a service
248
+ // retunes the step in one place. DataTable owns the `<td>` here (the column `render`
249
+ // receives no cell), so the level is applied to the cell's content instead of the cell.
250
+ // Twirl chevron is rendered ONLY on parent rows; leaves get a spacer so names stay
251
+ // aligned at the same depth.
248
252
 
249
253
  function TreeCell({
250
254
  row,
@@ -256,9 +260,12 @@ function TreeCell({
256
260
  onToggle: (id: string) => void;
257
261
  }) {
258
262
  return (
259
- <span
260
- className="flex items-center gap-1"
261
- style={{ paddingInlineStart: `calc(${row.depth} * 14px)` }}
263
+ <Flex
264
+ align="center"
265
+ gap="xs"
266
+ style={{
267
+ paddingInlineStart: `calc(var(--table-cell-indent-space-step) * ${row.depth})`,
268
+ }}
262
269
  >
263
270
  {row.hasChildren ? (
264
271
  <Button
@@ -284,15 +291,15 @@ function TreeCell({
284
291
  className="inline-block size-[calc(var(--control-height)-0.5rem)] shrink-0"
285
292
  />
286
293
  )}
287
- <span className="flex min-w-0 items-center gap-2">
294
+ <Flex align="center" gap="sm" className="min-w-0">
288
295
  <Text weight={row.kind === "従業員" ? "regular" : "medium"} truncate>
289
296
  {row.name}
290
297
  </Text>
291
298
  <Badge variant="outline" tone="neutral" className="shrink-0">
292
299
  {row.kind}
293
300
  </Badge>
294
- </span>
295
- </span>
301
+ </Flex>
302
+ </Flex>
296
303
  );
297
304
  }
298
305
 
@@ -391,7 +398,7 @@ function InteractiveTree() {
391
398
  );
392
399
  }
393
400
 
394
- // ── Fully-expanded static tree (proves all depth levels + the 14px indent) ───────
401
+ // ── Fully-expanded static tree (proves all depth levels + the per-level indent) ──
395
402
 
396
403
  function ExpandedTree() {
397
404
  const open = React.useMemo(() => allParentIds(TREE), []);
@@ -417,7 +424,7 @@ export default function Demo() {
417
424
  return (
418
425
  <PageContainer
419
426
  title="ツリー行"
420
- subtitle="階層行 (部署 → チーム → 従業員) · 14px/階層インデント · 親行のみ開閉トグル · 勤怠ロールアップ"
427
+ subtitle="階層行 (部署 → チーム → 従業員) · 階層ごとのインデント · 親行のみ開閉トグル · 勤怠ロールアップ"
421
428
  density="compact"
422
429
  >
423
430
  <Flex direction="col" gap="lg">
@@ -367,22 +367,20 @@ const DOT_CLASS: Record<SavedView["dot"], string> = {
367
367
  neutral: "bg-muted-foreground",
368
368
  };
369
369
 
370
+ // TabsTrigger renders a <button>, whose content model is phrasing content only — so the row and
371
+ // the count chip take `as="span"`. Before Flex/Badge had that seam the only valid shape here was a
372
+ // raw `<span className="flex …">`, i.e. utility layout.
370
373
  function ViewTrigger({ view, count }: { view: SavedView; count: number }) {
371
374
  return (
372
- <span className="flex items-center gap-2">
375
+ <Flex as="span" align="center" gap="sm">
373
376
  <span aria-hidden="true" className={`size-2 rounded-full ${DOT_CLASS[view.dot]}`} />
374
377
  <span>{view.label}</span>
375
- <Text
376
- as="span"
377
- size="2xs"
378
- weight="medium"
379
- tone="muted"
380
- tabular
381
- className="bg-muted inline-flex min-w-5 items-center justify-center rounded-full px-1.5"
382
- >
383
- {count}
384
- </Text>
385
- </span>
378
+ <Badge as="span" tone="neutral" shape="pill">
379
+ <Text as="span" size="2xs" weight="medium" tabular>
380
+ {count}
381
+ </Text>
382
+ </Badge>
383
+ </Flex>
386
384
  );
387
385
  }
388
386
 
@@ -436,12 +434,12 @@ export default function Demo() {
436
434
  <Flex direction="col" gap="md">
437
435
  {/* Saved-view ribbon — controlled Tabs; switching swaps the preset below. */}
438
436
  <Tabs value={view} onValueChange={(v) => setView(v as ViewId)}>
439
- <TabsList variant="line" className="h-auto flex-wrap gap-1 border-b">
437
+ <TabsList variant="line" className="h-auto w-full flex-wrap justify-start border-b">
440
438
  {VIEWS.map((v) => (
441
439
  <TabsTrigger
442
440
  key={v.id}
443
441
  value={v.id}
444
- className="data-[state=active]:border-primary rounded-none border-b-2 border-transparent bg-transparent px-3 py-2 shadow-none data-[state=active]:bg-transparent data-[state=active]:shadow-none"
442
+ className="rounded-[var(--tabs-trigger-line-radius)] px-[var(--tabs-trigger-line-padding-x)] py-[var(--tabs-trigger-line-padding-y)]"
445
443
  >
446
444
  <ViewTrigger view={v} count={counts[v.id]} />
447
445
  </TabsTrigger>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "19.3.1",
4
- "godxUiMcp": "19.3.1",
3
+ "version": "19.4.1",
4
+ "godxUiMcp": "19.4.1",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -333,16 +333,17 @@
333
333
  "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",
334
334
  "check:final-touch-rtl": "node scripts/check-final-touch-rtl.mjs",
335
335
  "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:button-icon-xs",
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:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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-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",
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:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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-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",
338
- "verify:ci": "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:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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-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 test",
339
- "verify:ci: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:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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-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",
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:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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",
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:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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",
338
+ "verify:ci": "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:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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 test",
339
+ "verify:ci: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:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && 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",
340
340
  "verify:browser": "pnpm check:contrast && pnpm check:visual-audit",
341
341
  "verify:release": "pnpm verify:static && pnpm check:frame-contracts && pnpm check:frame-coverage && pnpm check:frame-axe",
342
342
  "verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve",
343
343
  "check:release-plan": "node scripts/check-release-command-plan.mjs",
344
344
  "check:packed-public-contract": "node scripts/check-packed-public-contract.mjs",
345
345
  "check:mcp-pattern-imports": "node scripts/check-mcp-pattern-imports.mjs",
346
+ "check:mcp-lockstep": "node scripts/check-release-lockstep.mjs",
346
347
  "check:mcp-sync": "node scripts/check-mcp-sync.mjs",
347
348
  "check:mcp-catalog-coverage": "node scripts/check-mcp-catalog-coverage.mjs",
348
349
  "check:mcp-orphans": "node scripts/check-mcp-orphans.mjs",