@godxjp/ui 31.31.8 → 32.0.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 (732) hide show
  1. package/README.md +102 -121
  2. package/agent/START-HERE.md +10 -10
  3. package/agent/components/Accordion.json +2 -2
  4. package/agent/components/AccountChip.json +1 -1
  5. package/agent/components/Actions.json +1 -1
  6. package/agent/components/Activity.json +2 -2
  7. package/agent/components/Affix.json +1 -1
  8. package/agent/components/Alert.json +22 -6
  9. package/agent/components/AlertDialog.json +8 -1
  10. package/agent/components/Anchor.json +4 -3
  11. package/agent/components/AppLauncher.json +2 -2
  12. package/agent/components/AppProvider.json +19 -11
  13. package/agent/components/AppSettingPicker.json +18 -2
  14. package/agent/components/AppShell.json +4 -5
  15. package/agent/components/AreaChart.json +0 -1
  16. package/agent/components/AspectRatio.json +2 -2
  17. package/agent/components/Attachments.json +3 -3
  18. package/agent/components/AuthAccountSummary.json +1 -1
  19. package/agent/components/AuthDivider.json +1 -1
  20. package/agent/components/AuthExpiryProvider.json +0 -1
  21. package/agent/components/AuthFooter.json +2 -2
  22. package/agent/components/AuthIdentity.json +3 -3
  23. package/agent/components/AuthStack.json +1 -1
  24. package/agent/components/Avatar.json +2 -12
  25. package/agent/components/Badge.json +1 -1
  26. package/agent/components/BarChart.json +0 -1
  27. package/agent/components/BranchScopePicker.json +1 -1
  28. package/agent/components/Breadcrumb.json +1 -1
  29. package/agent/components/Button.json +3 -3
  30. package/agent/components/Calendar.json +1 -1
  31. package/agent/components/Card.json +2 -2
  32. package/agent/components/CardBar.json +0 -1
  33. package/agent/components/CardContent.json +0 -1
  34. package/agent/components/Carousel.json +4 -3
  35. package/agent/components/Cascader.json +1 -1
  36. package/agent/components/CenteredShell.json +78 -17
  37. package/agent/components/ChatBubble.json +3 -3
  38. package/agent/components/ChatBubbleList.json +3 -3
  39. package/agent/components/ChatComposer.json +3 -3
  40. package/agent/components/ChatSuggestion.json +3 -3
  41. package/agent/components/Checkbox.json +1 -1
  42. package/agent/components/CheckboxGroup.json +0 -1
  43. package/agent/components/CodeBlock.json +1 -1
  44. package/agent/components/Collapsible.json +4 -4
  45. package/agent/components/ColorPicker.json +1 -1
  46. package/agent/components/Command.json +5 -5
  47. package/agent/components/CommandPalette.json +1 -1
  48. package/agent/components/CompactBarTrend.json +1 -1
  49. package/agent/components/Conversations.json +3 -3
  50. package/agent/components/CredentialReveal.json +1 -1
  51. package/agent/components/DataState.json +2 -2
  52. package/agent/components/DataTable.json +1 -1
  53. package/agent/components/DatePicker.json +1 -1
  54. package/agent/components/Descriptions.json +1 -1
  55. package/agent/components/Dialog.json +2 -2
  56. package/agent/components/DraggablePanel.json +5 -4
  57. package/agent/components/DropdownMenu.json +1 -1
  58. package/agent/components/EmojiPicker.json +3 -2
  59. package/agent/components/EmptyState.json +1 -1
  60. package/agent/components/ErrorSurface.json +3 -3
  61. package/agent/components/FeatureList.json +1 -1
  62. package/agent/components/Field.json +0 -1
  63. package/agent/components/Flex.json +34 -4
  64. package/agent/components/FloatButton.json +6 -5
  65. package/agent/components/Form.json +1 -1
  66. package/agent/components/FormErrors.json +0 -1
  67. package/agent/components/FormField.json +6 -6
  68. package/agent/components/FormFieldArray.json +0 -1
  69. package/agent/components/FormFieldControl.json +0 -1
  70. package/agent/components/FormRoot.json +1 -1
  71. package/agent/components/Heading.json +3 -0
  72. package/agent/components/Icon.json +1 -1
  73. package/agent/components/Image.json +7 -4
  74. package/agent/components/InfiniteQueryState.json +1 -1
  75. package/agent/components/Input.json +1 -1
  76. package/agent/components/InputOTP.json +2 -2
  77. package/agent/components/Label.json +3 -3
  78. package/agent/components/LegalDocumentShell.json +5 -4
  79. package/agent/components/Legend.json +1 -1
  80. package/agent/components/LineChart.json +0 -1
  81. package/agent/components/Link.json +0 -1
  82. package/agent/components/ListRow.json +1 -1
  83. package/agent/components/Logo.json +5 -4
  84. package/agent/components/Marquee.json +4 -3
  85. package/agent/components/Masonry.json +4 -3
  86. package/agent/components/MasterDetail.json +1 -1
  87. package/agent/components/MegaMenu.json +4 -3
  88. package/agent/components/MobileShell.json +4 -4
  89. package/agent/components/NavList.json +1 -1
  90. package/agent/components/NumberInput.json +1 -1
  91. package/agent/components/OrgChart.json +4 -3
  92. package/agent/components/OrgSwitcher.json +1 -1
  93. package/agent/components/OverlayPortalProvider.json +0 -1
  94. package/agent/components/PageContainer.json +3 -3
  95. package/agent/components/PageCover.json +3 -2
  96. package/agent/components/Pagination.json +1 -1
  97. package/agent/components/PasswordInput.json +1 -1
  98. package/agent/components/PasswordStrength.json +1 -1
  99. package/agent/components/PermissionMatrix.json +1 -1
  100. package/agent/components/PieChart.json +0 -1
  101. package/agent/components/Popover.json +31 -6
  102. package/agent/components/PrefetchLink.json +1 -1
  103. package/agent/components/Progress.json +1 -1
  104. package/agent/components/Prose.json +1 -1
  105. package/agent/components/QrCode.json +1 -1
  106. package/agent/components/Radio.json +0 -1
  107. package/agent/components/RadioGroup.json +2 -2
  108. package/agent/components/RangeTimeline.json +2 -1
  109. package/agent/components/Rating.json +1 -1
  110. package/agent/components/RecordPicker.json +1 -1
  111. package/agent/components/ResizablePanel.json +1 -1
  112. package/agent/components/ResponsiveGrid.json +2 -2
  113. package/agent/components/Reveal.json +3 -3
  114. package/agent/components/ScrollArea.json +2 -2
  115. package/agent/components/SearchInput.json +1 -1
  116. package/agent/components/Segmented.json +1 -1
  117. package/agent/components/Select.json +7 -5
  118. package/agent/components/Separator.json +1 -1
  119. package/agent/components/ServiceCatalogCta.json +0 -1
  120. package/agent/components/ServiceLauncherCard.json +1 -1
  121. package/agent/components/ServiceRolePanel.json +1 -1
  122. package/agent/components/Sheet.json +5 -5
  123. package/agent/components/Sidebar.json +1 -1
  124. package/agent/components/Skeleton.json +26 -12
  125. package/agent/components/Slider.json +2 -2
  126. package/agent/components/SortableList.json +3 -2
  127. package/agent/components/SplitPane.json +1 -1
  128. package/agent/components/StatCard.json +1 -1
  129. package/agent/components/Steps.json +1 -1
  130. package/agent/components/Swatch.json +1 -1
  131. package/agent/components/Switch.json +1 -1
  132. package/agent/components/Table.json +1 -1
  133. package/agent/components/Tabs.json +3 -3
  134. package/agent/components/Text.json +5 -1
  135. package/agent/components/TextDiff.json +5 -4
  136. package/agent/components/Textarea.json +1 -1
  137. package/agent/components/ThemeScope.json +1 -1
  138. package/agent/components/ThoughtChain.json +3 -3
  139. package/agent/components/TimePicker.json +1 -1
  140. package/agent/components/Timeline.json +1 -1
  141. package/agent/components/TimelineGrid.json +5 -4
  142. package/agent/components/Toaster.json +0 -1
  143. package/agent/components/Toggle.json +3 -3
  144. package/agent/components/ToggleGroup.json +1 -1
  145. package/agent/components/Toolbar.json +10 -3
  146. package/agent/components/Tooltip.json +9 -9
  147. package/agent/components/Topbar.json +1 -1
  148. package/agent/components/TopbarItem.json +1 -1
  149. package/agent/components/Transfer.json +2 -2
  150. package/agent/components/Tree.json +1 -1
  151. package/agent/components/TreeSelect.json +1 -1
  152. package/agent/components/TwoFactorSetup.json +1 -1
  153. package/agent/components/Upload.json +1 -1
  154. package/agent/components/UploadCropDialog.json +1 -1
  155. package/agent/components/Welcome.json +3 -3
  156. package/agent/components/formatDate.json +2 -2
  157. package/agent/components/inertiaUpload.json +0 -1
  158. package/agent/components/useZodForm.json +0 -1
  159. package/agent/components-index.json +80 -154
  160. package/agent/components.json +541 -1737
  161. package/agent/index.json +10 -10
  162. package/agent/llms.txt +9 -9
  163. package/agent/patterns/account-recovery-settings.json +1 -1
  164. package/agent/patterns/auth-recovery-panels.json +2 -2
  165. package/agent/patterns/error-pages.json +1 -1
  166. package/agent/patterns/pricing-plans.json +17 -0
  167. package/agent/patterns-index.json +17 -1
  168. package/agent/patterns.json +21 -4
  169. package/agent/rules.json +30 -65
  170. package/agent/tokens.json +27 -57
  171. package/agent/vocabulary.json +3 -3
  172. package/dist/app/app-provider.d.ts +5 -3
  173. package/dist/app/app-provider.js +47 -12
  174. package/dist/app/date-format-labels.d.ts +3 -1
  175. package/dist/app/date-format-labels.js +2 -4
  176. package/dist/app/date-formats.d.ts +21 -2
  177. package/dist/app/date-formats.js +51 -2
  178. package/dist/app/index.d.ts +3 -1
  179. package/dist/app/index.js +5 -0
  180. package/dist/app/locales.d.ts +58 -3
  181. package/dist/app/locales.js +134 -8
  182. package/dist/app/preset.d.ts +25 -0
  183. package/dist/app/preset.js +10 -0
  184. package/dist/app/request-headers.d.ts +3 -3
  185. package/dist/app/request-headers.js +19 -10
  186. package/dist/app/settings-scope.d.ts +54 -0
  187. package/dist/app/settings-scope.js +46 -0
  188. package/dist/app/tenant-theme.js +8 -3
  189. package/dist/app/time-format-labels.d.ts +4 -1
  190. package/dist/app/time-format-labels.js +7 -1
  191. package/dist/app/types.d.ts +10 -2
  192. package/dist/app/use-formatting.d.ts +1 -1
  193. package/dist/components/admin/index.d.ts +1 -1
  194. package/dist/components/admin/index.js +1 -1
  195. package/dist/components/data-display/accordion.d.ts +51 -1
  196. package/dist/components/data-display/accordion.js +247 -1
  197. package/dist/components/data-display/avatar.d.ts +16 -1
  198. package/dist/components/data-display/avatar.js +109 -1
  199. package/dist/components/data-display/credential-reveal.d.ts +9 -2
  200. package/dist/components/data-display/credential-reveal.js +156 -1
  201. package/dist/components/data-display/image.js +5 -3
  202. package/dist/components/data-display/index.d.ts +0 -21
  203. package/dist/components/data-display/index.js +1 -43
  204. package/dist/components/data-display/popover.d.ts +15 -3
  205. package/dist/components/data-display/popover.js +168 -2
  206. package/dist/components/data-entry/branch-scope-picker.d.ts +1 -1
  207. package/dist/components/data-entry/index.d.ts +5 -12
  208. package/dist/components/data-entry/index.js +11 -12
  209. package/dist/components/data-entry/input-otp.d.ts +48 -2
  210. package/dist/components/data-entry/input-otp.js +94 -1
  211. package/dist/components/data-entry/number-input.d.ts +1 -1
  212. package/dist/components/data-entry/password-input.d.ts +38 -2
  213. package/dist/components/data-entry/password-input.js +56 -1
  214. package/dist/components/data-entry/rating.d.ts +38 -2
  215. package/dist/components/data-entry/rating.js +127 -1
  216. package/dist/components/data-entry/segmented.d.ts +94 -2
  217. package/dist/components/data-entry/segmented.js +104 -1
  218. package/dist/components/{ui/tag-input.d.ts → data-entry/select-tags-inline.d.ts} +7 -4
  219. package/dist/components/{ui/tag-input.js → data-entry/select-tags-inline.js} +4 -4
  220. package/dist/components/data-entry/select.js +4 -0
  221. package/dist/components/data-entry/toggle-group.d.ts +108 -2
  222. package/dist/components/data-entry/toggle-group.js +189 -1
  223. package/dist/components/data-entry/toggle.d.ts +86 -2
  224. package/dist/components/data-entry/toggle.js +153 -2
  225. package/dist/components/feedback/alert.d.ts +5 -3
  226. package/dist/components/feedback/alert.js +14 -2
  227. package/dist/components/feedback/index.d.ts +2 -6
  228. package/dist/components/feedback/index.js +1 -13
  229. package/dist/components/feedback/skeleton.d.ts +4 -17
  230. package/dist/components/feedback/skeleton.js +3 -40
  231. package/dist/components/general/index.d.ts +2 -4
  232. package/dist/components/general/index.js +1 -6
  233. package/dist/components/general/typography.d.ts +4 -58
  234. package/dist/components/general/typography.js +7 -141
  235. package/dist/components/layout/aspect-ratio.d.ts +24 -1
  236. package/dist/components/layout/aspect-ratio.js +18 -1
  237. package/dist/components/layout/auth-divider.js +1 -1
  238. package/dist/components/layout/auth-identity.js +6 -2
  239. package/dist/components/layout/centered-shell.d.ts +13 -8
  240. package/dist/components/layout/centered-shell.js +43 -1
  241. package/dist/components/layout/flex.d.ts +1 -1
  242. package/dist/components/layout/flex.js +73 -1
  243. package/dist/components/layout/index.d.ts +1 -13
  244. package/dist/components/layout/index.js +0 -12
  245. package/dist/components/layout/separator.d.ts +25 -2
  246. package/dist/components/layout/separator.js +71 -1
  247. package/dist/components/navigation/{app-setting-toggle.d.ts → app-setting-cycle.d.ts} +3 -4
  248. package/dist/components/navigation/{app-setting-toggle.js → app-setting-cycle.js} +3 -3
  249. package/dist/components/navigation/app-setting-picker.d.ts +6 -2
  250. package/dist/components/navigation/app-setting-picker.js +20 -2
  251. package/dist/components/navigation/index.d.ts +3 -11
  252. package/dist/components/navigation/index.js +1 -9
  253. package/dist/components/navigation/tabs.js +1 -1
  254. package/dist/components/ui/carousel.d.ts +1 -1
  255. package/dist/components/ui/carousel.js +1 -1
  256. package/dist/components/ui/index.d.ts +11 -5
  257. package/dist/components/ui/index.js +5 -5
  258. package/dist/contracts/measurement.json +2 -2
  259. package/dist/email/brand-mark.d.ts +3 -2
  260. package/dist/email/brand-mark.js +1 -1
  261. package/dist/email/color.d.ts +7 -0
  262. package/dist/email/color.js +14 -1
  263. package/dist/email/index.d.ts +10 -2
  264. package/dist/email/index.js +23 -2
  265. package/dist/email/tokens.generated.d.ts +120 -2
  266. package/dist/email/tokens.generated.js +119 -1
  267. package/dist/i18n/locale-tags.d.ts +25 -0
  268. package/dist/i18n/locale-tags.js +59 -0
  269. package/dist/i18n/translate.d.ts +20 -3
  270. package/dist/i18n/translate.js +25 -14
  271. package/dist/i18n/use-translation.d.ts +3 -3
  272. package/dist/i18n/use-translation.js +4 -2
  273. package/dist/{components/navigation → lab}/anchor.d.ts +2 -2
  274. package/dist/{components/navigation → lab}/anchor.js +5 -5
  275. package/dist/{components/data-display → lab}/carousel.js +2 -2
  276. package/dist/{components/layout → lab}/draggable-panel.d.ts +8 -8
  277. package/dist/{components/layout → lab}/draggable-panel.js +2 -2
  278. package/dist/{components/data-entry → lab}/emoji-picker.d.ts +2 -2
  279. package/dist/{components/data-entry → lab}/emoji-picker.js +6 -6
  280. package/dist/{components/general → lab}/float-button.d.ts +8 -8
  281. package/dist/{components/general → lab}/float-button.js +7 -7
  282. package/dist/lab/index.d.ts +39 -0
  283. package/dist/lab/index.js +48 -0
  284. package/dist/{components/layout → lab}/legal-document-shell.d.ts +2 -2
  285. package/dist/{components/layout → lab}/legal-document-shell.js +4 -4
  286. package/dist/{components/data-display → lab}/marquee.d.ts +5 -5
  287. package/dist/{components/data-display → lab}/marquee.js +5 -5
  288. package/dist/{components/layout → lab}/masonry.d.ts +2 -2
  289. package/dist/{components/layout → lab}/masonry.js +3 -3
  290. package/dist/{components/navigation → lab}/mega-menu.d.ts +4 -4
  291. package/dist/{components/navigation → lab}/mega-menu.js +2 -2
  292. package/dist/{components/data-display → lab}/org-chart.d.ts +2 -2
  293. package/dist/{components/data-display → lab}/org-chart.js +4 -4
  294. package/dist/{components/layout → lab}/page-cover.d.ts +2 -2
  295. package/dist/{components/layout → lab}/page-cover.js +2 -2
  296. package/dist/{components/data-display → lab}/range-timeline.d.ts +1 -1
  297. package/dist/{components/data-display → lab}/range-timeline.js +6 -6
  298. package/dist/{components/data-entry → lab}/sortable-list.d.ts +2 -2
  299. package/dist/{components/data-entry → lab}/sortable-list.js +3 -3
  300. package/dist/{components/data-display → lab}/text-diff.d.ts +3 -3
  301. package/dist/{components/data-display → lab}/text-diff.js +4 -4
  302. package/dist/{components/data-display → lab}/timeline-grid.d.ts +2 -2
  303. package/dist/{components/data-display → lab}/timeline-grid.js +1 -1
  304. package/dist/lib/control-styles.js +1 -1
  305. package/dist/lib/datetime/format.js +20 -6
  306. package/dist/lib/datetime/sync.d.ts +6 -2
  307. package/dist/lib/datetime/sync.js +14 -18
  308. package/dist/lib/platform.d.ts +1 -1
  309. package/dist/props/components/app.prop.d.ts +28 -13
  310. package/dist/props/components/data-display.prop.d.ts +19 -29
  311. package/dist/props/components/feedback.prop.d.ts +15 -44
  312. package/dist/props/components/general.prop.d.ts +2 -64
  313. package/dist/props/components/index.d.ts +9 -1
  314. package/dist/props/components/layout.prop.d.ts +41 -57
  315. package/dist/props/registry.d.ts +48 -101
  316. package/dist/props/registry.js +45 -129
  317. package/dist/props/vocabulary/index.d.ts +1 -1
  318. package/dist/props/vocabulary/interaction.prop.d.ts +3 -12
  319. package/dist/styles/alert-layout.css +0 -29
  320. package/dist/styles/data-display-layout.css +14 -22
  321. package/dist/styles/fonts/OFL.txt +93 -0
  322. package/dist/styles/form-layout.css +4 -0
  323. package/dist/styles/index.css +0 -2
  324. package/dist/styles/layers.json +44 -179
  325. package/dist/styles/text-layout.css +0 -15
  326. package/dist/styles.css +2 -0
  327. package/dist/themes/godx-tokens.css +41 -0
  328. package/dist/themes/godx.css +3 -0
  329. package/dist/themes/godx.d.ts +16 -0
  330. package/dist/themes/godx.js +12 -0
  331. package/dist/tokens/components/feedback.css +0 -6
  332. package/dist/tokens/derived.css +23 -22
  333. package/dist/tokens/foundation.css +4 -6
  334. package/docs/COMPOSITION-VS-COMPONENT.md +58 -33
  335. package/docs/CONSUMER-RULES.md +1 -1
  336. package/docs/CUSTOMER-THEMING.md +17 -53
  337. package/docs/migrations/v32.md +105 -0
  338. package/package.json +59 -19
  339. package/scripts/_agent-setup.mjs +54 -3
  340. package/scripts/brand-accent.generated.mjs +15 -2
  341. package/scripts/cli.mjs +36 -11
  342. package/scripts/codemod.mjs +542 -0
  343. package/scripts/consumer-rule.md +21 -43
  344. package/scripts/postinstall.mjs +10 -47
  345. package/scripts/prune-css.mjs +1 -1
  346. package/scripts/ui-audit.mjs +5 -2
  347. package/dist/components/data-display/chat-bubble.d.ts +0 -30
  348. package/dist/components/data-display/chat-bubble.js +0 -229
  349. package/dist/components/data-display/hover-card.d.ts +0 -1
  350. package/dist/components/data-display/hover-card.js +0 -7
  351. package/dist/components/data-display/thought-chain.d.ts +0 -42
  352. package/dist/components/data-display/thought-chain.js +0 -177
  353. package/dist/components/data-display/thumbnail.d.ts +0 -37
  354. package/dist/components/data-display/thumbnail.js +0 -20
  355. package/dist/components/data-display/welcome.d.ts +0 -26
  356. package/dist/components/data-display/welcome.js +0 -37
  357. package/dist/components/data-entry/attachments.d.ts +0 -19
  358. package/dist/components/data-entry/attachments.js +0 -366
  359. package/dist/components/data-entry/chat-composer.d.ts +0 -51
  360. package/dist/components/data-entry/chat-composer.js +0 -200
  361. package/dist/components/data-entry/chat-suggestion.d.ts +0 -28
  362. package/dist/components/data-entry/chat-suggestion.js +0 -309
  363. package/dist/components/data-entry/tag-input.d.ts +0 -2
  364. package/dist/components/data-entry/tag-input.js +0 -5
  365. package/dist/components/feedback/banner.d.ts +0 -21
  366. package/dist/components/feedback/banner.js +0 -19
  367. package/dist/components/feedback/callout.d.ts +0 -23
  368. package/dist/components/feedback/callout.js +0 -42
  369. package/dist/components/layout/auth-shell.d.ts +0 -10
  370. package/dist/components/layout/auth-shell.js +0 -42
  371. package/dist/components/layout/space-compact.d.ts +0 -65
  372. package/dist/components/layout/space-compact.js +0 -52
  373. package/dist/components/navigation/conversations.d.ts +0 -39
  374. package/dist/components/navigation/conversations.js +0 -371
  375. package/dist/components/ui/accordion.d.ts +0 -51
  376. package/dist/components/ui/accordion.js +0 -254
  377. package/dist/components/ui/aspect-ratio.d.ts +0 -24
  378. package/dist/components/ui/aspect-ratio.js +0 -21
  379. package/dist/components/ui/avatar.d.ts +0 -16
  380. package/dist/components/ui/avatar.js +0 -115
  381. package/dist/components/ui/credential-reveal.d.ts +0 -9
  382. package/dist/components/ui/credential-reveal.js +0 -160
  383. package/dist/components/ui/hover-card.d.ts +0 -47
  384. package/dist/components/ui/hover-card.js +0 -205
  385. package/dist/components/ui/input-otp.d.ts +0 -48
  386. package/dist/components/ui/input-otp.js +0 -101
  387. package/dist/components/ui/password-input.d.ts +0 -38
  388. package/dist/components/ui/password-input.js +0 -60
  389. package/dist/components/ui/rating.d.ts +0 -38
  390. package/dist/components/ui/rating.js +0 -131
  391. package/dist/components/ui/segmented.d.ts +0 -94
  392. package/dist/components/ui/segmented.js +0 -108
  393. package/dist/components/ui/separator.d.ts +0 -25
  394. package/dist/components/ui/separator.js +0 -74
  395. package/dist/components/ui/toggle-group.d.ts +0 -108
  396. package/dist/components/ui/toggle-group.js +0 -194
  397. package/dist/components/ui/toggle.d.ts +0 -86
  398. package/dist/components/ui/toggle.js +0 -156
  399. package/docs/CANONICAL-CONTRACTS.md +0 -206
  400. package/docs/COMPONENTS.md +0 -163
  401. package/docs/DATETIME.md +0 -78
  402. package/docs/DEVELOPMENT.md +0 -269
  403. package/docs/FRAME-A11Y-CI.md +0 -287
  404. package/docs/FRAME-COVERAGE-LEDGER.md +0 -123
  405. package/docs/FRAME-COVERAGE-REPORT.md +0 -228
  406. package/docs/FRAME-COVERAGE-STANDARD.md +0 -65
  407. package/docs/FRAME-COVERAGE.md +0 -29
  408. package/docs/MEASUREMENT-CONTRACT.md +0 -109
  409. package/docs/PROPS-REGISTRY.md +0 -61
  410. package/docs/PROPS-VOCABULARY.md +0 -100
  411. package/docs/REGISTRY.md +0 -70
  412. package/docs/TESTING.md +0 -107
  413. package/docs/THEME-API-COVERAGE.md +0 -538
  414. package/docs/WHAT-BELONGS-HERE.md +0 -179
  415. package/docs/asset-modules.d.ts +0 -53
  416. package/docs/assets/cover-terrain.svg +0 -6
  417. package/docs/assets/portrait-amber.svg +0 -5
  418. package/docs/assets/portrait-clay.svg +0 -5
  419. package/docs/assets/portrait-indigo.svg +0 -5
  420. package/docs/assets/portrait-iris.svg +0 -5
  421. package/docs/assets/portrait-moss.svg +0 -5
  422. package/docs/assets/portrait-plum.svg +0 -5
  423. package/docs/assets/portrait-slate.svg +0 -5
  424. package/docs/assets/service-mark-rose.svg +0 -6
  425. package/docs/assets/service-mark-teal.svg +0 -5
  426. package/docs/assets/shot-landscape.svg +0 -12
  427. package/docs/assets/shot-portrait.svg +0 -10
  428. package/docs/assets/tcgm/card-1.svg +0 -1
  429. package/docs/assets/tcgm/card-2.svg +0 -1
  430. package/docs/assets/tcgm/card-3.svg +0 -1
  431. package/docs/assets/tcgm/card-4.svg +0 -1
  432. package/docs/assets/tcgm/card-5.svg +0 -1
  433. package/docs/assets/tcgm/card-6.svg +0 -1
  434. package/docs/assets/tcgm/hero-prism.svg +0 -1
  435. package/docs/assets/tcgm/scene-1.svg +0 -1
  436. package/docs/assets/tcgm/scene-2.svg +0 -1
  437. package/docs/assets/tcgm/scene-3.svg +0 -1
  438. package/docs/assets/tcgm/scene-4.svg +0 -1
  439. package/docs/assets/tcgm/scene-5.svg +0 -1
  440. package/docs/assets/tcgm/tcgm-lockup-color.svg +0 -1
  441. package/docs/assets/tcgm/tcgm-symbol-color.svg +0 -1
  442. package/docs/charts/cjk-category-axis.tsx +0 -81
  443. package/docs/charts/compact-bar-trend.tsx +0 -327
  444. package/docs/charts/size-tiers.tsx +0 -192
  445. package/docs/data-display/accordion.tsx +0 -99
  446. package/docs/data-display/avatar.tsx +0 -502
  447. package/docs/data-display/badge.tsx +0 -335
  448. package/docs/data-display/card/examples/detail-panel.tsx +0 -106
  449. package/docs/data-display/card/examples/tab-list.tsx +0 -97
  450. package/docs/data-display/card/index.md +0 -3
  451. package/docs/data-display/card/index.tsx +0 -390
  452. package/docs/data-display/carousel.tsx +0 -160
  453. package/docs/data-display/charts.tsx +0 -278
  454. package/docs/data-display/chat-bubble.tsx +0 -397
  455. package/docs/data-display/code-block.tsx +0 -188
  456. package/docs/data-display/collapsible.tsx +0 -162
  457. package/docs/data-display/credential-reveal.tsx +0 -148
  458. package/docs/data-display/data-table/examples/antd-parity.tsx +0 -257
  459. package/docs/data-display/data-table/examples/approval-queue.tsx +0 -212
  460. package/docs/data-display/data-table/examples/grid-features.tsx +0 -158
  461. package/docs/data-display/data-table/examples/list-page.tsx +0 -175
  462. package/docs/data-display/data-table/examples/selectable-inbox.tsx +0 -113
  463. package/docs/data-display/data-table/examples/server-paged.tsx +0 -179
  464. package/docs/data-display/data-table/examples/striped-list.tsx +0 -173
  465. package/docs/data-display/data-table/index.md +0 -9
  466. package/docs/data-display/data-table/index.tsx +0 -407
  467. package/docs/data-display/descriptions.tsx +0 -263
  468. package/docs/data-display/empty-state.tsx +0 -164
  469. package/docs/data-display/feature-list.tsx +0 -159
  470. package/docs/data-display/hover-card.tsx +0 -181
  471. package/docs/data-display/image.tsx +0 -170
  472. package/docs/data-display/legend.tsx +0 -158
  473. package/docs/data-display/list-row.tsx +0 -441
  474. package/docs/data-display/markdown.tsx +0 -86
  475. package/docs/data-display/marquee.tsx +0 -254
  476. package/docs/data-display/org-chart.tsx +0 -165
  477. package/docs/data-display/permission-matrix.tsx +0 -188
  478. package/docs/data-display/popover-touch.tsx +0 -27
  479. package/docs/data-display/popover.tsx +0 -331
  480. package/docs/data-display/progress.tsx +0 -162
  481. package/docs/data-display/prose.tsx +0 -169
  482. package/docs/data-display/qr-code.tsx +0 -68
  483. package/docs/data-display/scroll-area.tsx +0 -420
  484. package/docs/data-display/service-launcher-card.tsx +0 -445
  485. package/docs/data-display/stat-card.tsx +0 -354
  486. package/docs/data-display/swatch.tsx +0 -107
  487. package/docs/data-display/table.tsx +0 -362
  488. package/docs/data-display/text-diff.tsx +0 -89
  489. package/docs/data-display/thought-chain.tsx +0 -176
  490. package/docs/data-display/thumbnail.tsx +0 -128
  491. package/docs/data-display/timeline-grid.tsx +0 -119
  492. package/docs/data-display/timeline.tsx +0 -671
  493. package/docs/data-display/touch-actions.tsx +0 -36
  494. package/docs/data-display/tree.tsx +0 -724
  495. package/docs/data-display/welcome.tsx +0 -115
  496. package/docs/data-entry/attachments.tsx +0 -160
  497. package/docs/data-entry/block-editor.tsx +0 -105
  498. package/docs/data-entry/branch-scope-picker.tsx +0 -128
  499. package/docs/data-entry/calendar.tsx +0 -226
  500. package/docs/data-entry/cascader.tsx +0 -380
  501. package/docs/data-entry/chat-composer.tsx +0 -619
  502. package/docs/data-entry/chat-suggestion.tsx +0 -301
  503. package/docs/data-entry/checkbox.tsx +0 -256
  504. package/docs/data-entry/color-picker.tsx +0 -189
  505. package/docs/data-entry/command-palette.tsx +0 -179
  506. package/docs/data-entry/command.tsx +0 -341
  507. package/docs/data-entry/country-picker-recipe.tsx +0 -175
  508. package/docs/data-entry/date-picker.tsx +0 -452
  509. package/docs/data-entry/emoji-picker.tsx +0 -35
  510. package/docs/data-entry/form/examples/employee-settings.tsx +0 -267
  511. package/docs/data-entry/form/examples/invoice-form.tsx +0 -387
  512. package/docs/data-entry/form-dynamic-fields.tsx +0 -199
  513. package/docs/data-entry/form-field/examples/a11y-contract.tsx +0 -242
  514. package/docs/data-entry/form-field/examples/create-form.tsx +0 -107
  515. package/docs/data-entry/form-field/index.md +0 -8
  516. package/docs/data-entry/form-field/index.tsx +0 -337
  517. package/docs/data-entry/form-inertia.tsx +0 -80
  518. package/docs/data-entry/form-root.tsx +0 -112
  519. package/docs/data-entry/form.tsx +0 -1498
  520. package/docs/data-entry/input-otp.tsx +0 -258
  521. package/docs/data-entry/input.tsx +0 -796
  522. package/docs/data-entry/label.tsx +0 -102
  523. package/docs/data-entry/markdown-editor.tsx +0 -69
  524. package/docs/data-entry/number-input.tsx +0 -279
  525. package/docs/data-entry/password-input.tsx +0 -102
  526. package/docs/data-entry/password-strength.tsx +0 -99
  527. package/docs/data-entry/radio-group.tsx +0 -316
  528. package/docs/data-entry/rating.tsx +0 -91
  529. package/docs/data-entry/record-picker.tsx +0 -209
  530. package/docs/data-entry/search-input.tsx +0 -121
  531. package/docs/data-entry/segmented-in-filter-row.tsx +0 -60
  532. package/docs/data-entry/segmented.tsx +0 -300
  533. package/docs/data-entry/select-async-contracts.tsx +0 -108
  534. package/docs/data-entry/select-matrix.tsx +0 -209
  535. package/docs/data-entry/select.tsx +0 -547
  536. package/docs/data-entry/slider.tsx +0 -212
  537. package/docs/data-entry/sortable-list.tsx +0 -76
  538. package/docs/data-entry/switch.tsx +0 -314
  539. package/docs/data-entry/tag-input.tsx +0 -145
  540. package/docs/data-entry/textarea.tsx +0 -249
  541. package/docs/data-entry/time-picker.tsx +0 -187
  542. package/docs/data-entry/time-range-picker.tsx +0 -55
  543. package/docs/data-entry/toggle-count.tsx +0 -348
  544. package/docs/data-entry/toggle-group.tsx +0 -438
  545. package/docs/data-entry/toggle.tsx +0 -217
  546. package/docs/data-entry/transfer.tsx +0 -115
  547. package/docs/data-entry/tree-select.tsx +0 -204
  548. package/docs/data-entry/upload-crop-dialog.tsx +0 -109
  549. package/docs/data-entry/upload.tsx +0 -310
  550. package/docs/feedback/alert-dialog.tsx +0 -270
  551. package/docs/feedback/alert.tsx +0 -248
  552. package/docs/feedback/auth-expiry.tsx +0 -104
  553. package/docs/feedback/banner.tsx +0 -183
  554. package/docs/feedback/callout.tsx +0 -220
  555. package/docs/feedback/danger-confirm.tsx +0 -91
  556. package/docs/feedback/dialog-touch.tsx +0 -24
  557. package/docs/feedback/dialog.tsx +0 -373
  558. package/docs/feedback/sheet.tsx +0 -510
  559. package/docs/feedback/skeleton.tsx +0 -168
  560. package/docs/feedback/toast.tsx +0 -135
  561. package/docs/feedback/tooltip.tsx +0 -171
  562. package/docs/feedback/two-factor-setup.tsx +0 -68
  563. package/docs/foundation/_email-specimen.ts +0 -274
  564. package/docs/foundation/_theme-editor-scope.ts +0 -222
  565. package/docs/foundation/colors.tsx +0 -207
  566. package/docs/foundation/density.tsx +0 -242
  567. package/docs/foundation/email-tokens.tsx +0 -323
  568. package/docs/foundation/radius-shadow.tsx +0 -154
  569. package/docs/foundation/spacing.tsx +0 -216
  570. package/docs/foundation/theme-editor.tsx +0 -654
  571. package/docs/foundation/typography.tsx +0 -147
  572. package/docs/general/actions.tsx +0 -175
  573. package/docs/general/activity.tsx +0 -289
  574. package/docs/general/button/examples/destructive-confirm.tsx +0 -90
  575. package/docs/general/button/examples/form-actions.tsx +0 -87
  576. package/docs/general/button/examples/toolbar.tsx +0 -160
  577. package/docs/general/button/index.md +0 -16
  578. package/docs/general/button/index.tsx +0 -236
  579. package/docs/general/float-button.tsx +0 -133
  580. package/docs/general/icon.tsx +0 -217
  581. package/docs/general/logo.tsx +0 -194
  582. package/docs/general/reveal.tsx +0 -309
  583. package/docs/general/typography.tsx +0 -542
  584. package/docs/i18n/messages/en.json +0 -1715
  585. package/docs/i18n/messages/ja.json +0 -1708
  586. package/docs/i18n/messages/vi.json +0 -1708
  587. package/docs/layout/account-chip.tsx +0 -72
  588. package/docs/layout/admin-collection.tsx +0 -122
  589. package/docs/layout/affix.tsx +0 -209
  590. package/docs/layout/app-launcher.tsx +0 -211
  591. package/docs/layout/app-shell-arrangements.tsx +0 -225
  592. package/docs/layout/app-shell-narrow-bar.tsx +0 -205
  593. package/docs/layout/app-shell-states.tsx +0 -171
  594. package/docs/layout/app-shell.tsx +0 -395
  595. package/docs/layout/aspect-ratio.tsx +0 -135
  596. package/docs/layout/auth-account-summary.tsx +0 -103
  597. package/docs/layout/auth-divider.tsx +0 -28
  598. package/docs/layout/auth-footer.tsx +0 -37
  599. package/docs/layout/auth-identity.tsx +0 -70
  600. package/docs/layout/auth-recovery/examples/mfa-challenge.md +0 -41
  601. package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +0 -254
  602. package/docs/layout/auth-recovery/examples/mobile-390.md +0 -25
  603. package/docs/layout/auth-recovery/examples/mobile-390.tsx +0 -82
  604. package/docs/layout/auth-recovery/examples/password-recovery.md +0 -24
  605. package/docs/layout/auth-recovery/examples/password-recovery.tsx +0 -197
  606. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +0 -27
  607. package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +0 -156
  608. package/docs/layout/auth-recovery/index.md +0 -140
  609. package/docs/layout/auth-recovery/index.tsx +0 -96
  610. package/docs/layout/auth-shell-context.tsx +0 -103
  611. package/docs/layout/auth-shell-device.tsx +0 -112
  612. package/docs/layout/auth-shell-registration.tsx +0 -338
  613. package/docs/layout/auth-shell-variants.tsx +0 -143
  614. package/docs/layout/auth-shell.tsx +0 -59
  615. package/docs/layout/auth-stack.tsx +0 -40
  616. package/docs/layout/centered-shell.tsx +0 -102
  617. package/docs/layout/draggable-panel.tsx +0 -127
  618. package/docs/layout/error-surface/examples/application-403.tsx +0 -84
  619. package/docs/layout/error-surface/examples/application-404.tsx +0 -77
  620. package/docs/layout/error-surface/examples/system-500.tsx +0 -47
  621. package/docs/layout/error-surface/examples/system-503.tsx +0 -48
  622. package/docs/layout/error-surface/index.md +0 -153
  623. package/docs/layout/error-surface/index.tsx +0 -239
  624. package/docs/layout/flex.tsx +0 -444
  625. package/docs/layout/legal-document-shell/_data.ts +0 -110
  626. package/docs/layout/legal-document-shell/examples/desktop-1440.md +0 -12
  627. package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +0 -83
  628. package/docs/layout/legal-document-shell/examples/mobile-390.md +0 -22
  629. package/docs/layout/legal-document-shell/examples/mobile-390.tsx +0 -70
  630. package/docs/layout/legal-document-shell/examples/tablet-1024.md +0 -3
  631. package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +0 -84
  632. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +0 -18
  633. package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +0 -61
  634. package/docs/layout/legal-document-shell/index.md +0 -51
  635. package/docs/layout/legal-document-shell/index.tsx +0 -101
  636. package/docs/layout/masonry.tsx +0 -291
  637. package/docs/layout/master-detail.tsx +0 -390
  638. package/docs/layout/mobile-shell.tsx +0 -106
  639. package/docs/layout/nav-list.tsx +0 -584
  640. package/docs/layout/org-switcher.tsx +0 -131
  641. package/docs/layout/page-container.tsx +0 -1020
  642. package/docs/layout/page-cover.tsx +0 -56
  643. package/docs/layout/resizable-panel.tsx +0 -419
  644. package/docs/layout/responsive-grid.tsx +0 -403
  645. package/docs/layout/separator.tsx +0 -327
  646. package/docs/layout/service-role-panel.tsx +0 -144
  647. package/docs/layout/sidebar.tsx +0 -689
  648. package/docs/layout/space-compact.tsx +0 -202
  649. package/docs/layout/split-pane.tsx +0 -532
  650. package/docs/layout/topbar-item.tsx +0 -233
  651. package/docs/layout/topbar.tsx +0 -360
  652. package/docs/navigation/anchor.tsx +0 -295
  653. package/docs/navigation/app-setting-picker.tsx +0 -178
  654. package/docs/navigation/app-setting-toggle.tsx +0 -111
  655. package/docs/navigation/breadcrumb.tsx +0 -207
  656. package/docs/navigation/card-tabs.tsx +0 -344
  657. package/docs/navigation/conversations.tsx +0 -176
  658. package/docs/navigation/dropdown-menu.tsx +0 -345
  659. package/docs/navigation/filter-bar.tsx +0 -247
  660. package/docs/navigation/mega-menu-panel.tsx +0 -86
  661. package/docs/navigation/mega-menu.tsx +0 -254
  662. package/docs/navigation/pagination.tsx +0 -293
  663. package/docs/navigation/steps.tsx +0 -315
  664. package/docs/navigation/tabs-rtl.tsx +0 -28
  665. package/docs/navigation/tabs.tsx +0 -755
  666. package/docs/navigation/toolbar.tsx +0 -347
  667. package/docs/providers/app-provider.tsx +0 -191
  668. package/docs/providers/format-date.tsx +0 -230
  669. package/docs/providers/theme-scope.tsx +0 -186
  670. package/docs/query/button-refetch.tsx +0 -161
  671. package/docs/query/data-state.tsx +0 -262
  672. package/docs/query/infinite-query-state.tsx +0 -97
  673. package/docs/query/mutation-feedback.tsx +0 -128
  674. package/docs/query/touch-actions.tsx +0 -68
  675. package/docs/react-router/prefetch-link.tsx +0 -262
  676. package/docs/roadmap/ai-chat-components.md +0 -206
  677. package/docs/roadmap/antd-parity.md +0 -155
  678. package/docs/roadmap/badge-tag-chip-count.md +0 -172
  679. package/docs/roadmap/list-masonry.md +0 -159
  680. package/docs/roadmap/parity-audit-data-display-feedback.md +0 -567
  681. package/docs/roadmap/parity-audit-data-entry.md +0 -368
  682. package/docs/roadmap/parity-audit-layout-navigation-general.md +0 -459
  683. package/docs/roadmap/parity-backlog.md +0 -77
  684. package/docs/roadmap/tree-components.md +0 -151
  685. package/docs/roadmap/website-components.md +0 -813
  686. package/docs/showcase/acme-portal.tsx +0 -461
  687. package/docs/showcase/acme-website.tsx +0 -499
  688. package/docs/showcase/caimono-price-comparison.tsx +0 -919
  689. package/docs/showcase/case1-warehouse-dashboard.tsx +0 -358
  690. package/docs/showcase/case2-employee-me.tsx +0 -438
  691. package/docs/showcase/case3-approval-workflow.tsx +0 -531
  692. package/docs/showcase/case4-login.tsx +0 -312
  693. package/docs/showcase/case5-shift-calendar.tsx +0 -702
  694. package/docs/showcase/case6-agency-handy.tsx +0 -1120
  695. package/docs/showcase/futurelastic-web.tsx +0 -441
  696. package/docs/showcase/marketing-page.tsx +0 -895
  697. package/docs/showcase/org-switcher.tsx +0 -320
  698. package/docs/showcase/permission-matrix.tsx +0 -354
  699. package/docs/showcase/public-landing.tsx +0 -210
  700. package/docs/showcase/settings-account-sections.tsx +0 -559
  701. package/docs/showcase/settings-security-mfa.tsx +0 -145
  702. package/docs/showcase/table-approval-queue.tsx +0 -199
  703. package/docs/showcase/table-bulk-actions.tsx +0 -468
  704. package/docs/showcase/table-compact-kintone.tsx +0 -438
  705. package/docs/showcase/table-conditional-format.tsx +0 -367
  706. package/docs/showcase/table-crud-list.tsx +0 -544
  707. package/docs/showcase/table-density.tsx +0 -349
  708. package/docs/showcase/table-expandable-rows.tsx +0 -496
  709. package/docs/showcase/table-filter-chips.tsx +0 -468
  710. package/docs/showcase/table-footer-totals.tsx +0 -328
  711. package/docs/showcase/table-grouped-subtotals.tsx +0 -398
  712. package/docs/showcase/table-master-detail.tsx +0 -482
  713. package/docs/showcase/table-pagination.tsx +0 -409
  714. package/docs/showcase/table-states.tsx +0 -371
  715. package/docs/showcase/table-sticky-columns.tsx +0 -377
  716. package/docs/showcase/table-tree-rows.tsx +0 -451
  717. package/docs/showcase/table-view-tabs.tsx +0 -488
  718. package/docs/showcase/tcgm-website.tsx +0 -1047
  719. package/docs/showcase/tenant-brand-color.tsx +0 -338
  720. package/docs/showcase/theme-customization.tsx +0 -1292
  721. package/docs/showcase/theme-lab.tsx +0 -2125
  722. package/docs/themes/flat.css +0 -466
  723. package/docs/themes/glassmorphism.css +0 -960
  724. package/docs/themes/index.ts +0 -219
  725. package/docs/themes/neubrutalism.css +0 -481
  726. /package/dist/components/navigation/{filter-bar.d.ts → toolbar.d.ts} +0 -0
  727. /package/dist/components/navigation/{filter-bar.js → toolbar.js} +0 -0
  728. /package/dist/{components/data-display → lab}/carousel.d.ts +0 -0
  729. /package/dist/{components/data-entry → lab}/emoji-data.d.ts +0 -0
  730. /package/dist/{components/data-entry → lab}/emoji-data.js +0 -0
  731. /package/dist/{components/data-display → lab}/marquee-reveal.d.ts +0 -0
  732. /package/dist/{components/data-display → lab}/marquee-reveal.js +0 -0
package/docs/DATETIME.md DELETED
@@ -1,78 +0,0 @@
1
- # formatDate — mandatory datetime display
2
-
3
- Package: `@godxjp/ui/datetime`
4
-
5
- ## Import
6
-
7
- ```tsx
8
- import { formatDate } from "@godxjp/ui/datetime";
9
- import { useDateTime } from "@godxjp/ui/app";
10
- ```
11
-
12
- ## Rules
13
-
14
- 1. **Never** use `date-fns/format`, `toLocaleString`, or raw ISO slices for UI.
15
- 2. **Always** wrap apps in `<AppProvider>` so defaults apply.
16
- 3. **Optional** per-call `timezone` override — global prefs unchanged.
17
-
18
- ## Defaults
19
-
20
- Omit `locale`, `timezone`, `timeFormat`, `dateFormat` → synced from AppProvider.
21
-
22
- ## dateFormat presets
23
-
24
- | value | Pattern | Default locale |
25
- | ----- | ------------ | -------------- |
26
- | `iso` | `yyyy-MM-dd` | — |
27
- | `ymd` | `yyyy/MM/dd` | ja |
28
- | `dmy` | `dd/MM/yyyy` | vi |
29
- | `mdy` | `MM/dd/yyyy` | en |
30
-
31
- `ymd` and `iso` are both year-first and are NOT interchangeable: a Japanese business document
32
- (請求書, 申請書) is written `2026/05/01`, never `2026-05-01`. `ja` defaulted to `iso` until a
33
- Japanese-first consumer shipped its own date formatter as an explicit stopgap purely to get the
34
- slashes — rule 1 above broken by this package's own default. Only the DEFAULT moved: a stored
35
- preference still wins, `defaultDateFormat` still pins any value, and `iso` is one option away in
36
- `<DateFormatPicker />`.
37
-
38
- Sent to backend as `x-date-format`. Pick with `<DateFormatPicker />`.
39
-
40
- ## kind presets
41
-
42
- | kind | Use |
43
- | ---------- | ---------------------------------------- |
44
- | `auto` | Default — detects date / time / datetime |
45
- | `datetime` | Audit logs, `created_at` |
46
- | `date` | `"2026-05-01"` fields |
47
- | `calendar` | `Date` from DatePicker |
48
- | `time` | `"14:30"` HH:mm |
49
- | `long` | Detail headings (PPP) |
50
- | `relative` | Activity feeds |
51
-
52
- ## ISO 8601 patterns
53
-
54
- Date order follows `dateFormat` from AppProvider (`iso` | `ymd` | `dmy` | `mdy`):
55
-
56
- - `iso`: `yyyy-MM-dd` + `yyyy-MM-dd HH:mm`
57
- - `ymd`: `yyyy/MM/dd` + `yyyy/MM/dd HH:mm`
58
- - `dmy`: `dd/MM/yyyy` + `dd/MM/yyyy HH:mm`
59
- - `mdy`: `MM/dd/yyyy` + `MM/dd/yyyy HH:mm`
60
-
61
- Time portion still follows `timeFormat` (24h vs 12h).
62
-
63
- ## Examples
64
-
65
- ```tsx
66
- formatDate("2026-05-01T14:30:00Z");
67
- formatDate("2026-05-01");
68
- formatDate("17:30", { kind: "time" });
69
- formatDate(pickedDate, { kind: "calendar" });
70
- formatDate(iso, { timezone: "Asia/Tokyo" });
71
- ```
72
-
73
- ## React
74
-
75
- ```tsx
76
- const { format } = useDateTime();
77
- return <td>{format(row.createdAt)}</td>;
78
- ```
@@ -1,269 +0,0 @@
1
- # Development Guideline — `@godxjp/ui`
2
-
3
- How to work **on** the design system (not just with it). If you only consume the framework from the app, read [the ten consumer rules](./CONSUMER-RULES.md) instead — this file is for people **editing `packages/godx-ui/`**.
4
-
5
- ---
6
-
7
- ## 0. What this package IS — and the boundary it must keep
8
-
9
- `@godxjp/ui` is **the** UI framework for every godx surface (admin, agency portal, handheld). It is shared, versioned infrastructure: one change here ripples to every screen and every consumer. Two consequences:
10
-
11
- 1. **Editing it needs explicit session permission** — the hard gate in [CLAUDE.md](../CLAUDE.md) (MANDATORY: read the component skill before touching UI). Treat the package as off-limits by default. 2. **It is generic and presentational only.** The framework knows about _tokens, layout, accessibility, and interaction_ — never about the app's data, routes, language files, or business rules.
12
-
13
- ### The hard boundary — consumer-layer concerns MUST NOT leak in
14
-
15
- A component in this package may **not** import or assume any of the following. These belong to the **consumer** (the app), which composes framework primitives around them:
16
-
17
- | ❌ Never inside `packages/godx-ui/` | ✅ Where it belongs |
18
- | ---------------------------------------------------------------- | ------------------------------------------------------------------- |
19
- | App i18n — `useTranslation`, `t()`, `resources/js/i18n` | App passes already-translated strings in as props |
20
- | Inertia — `router`, `usePage`, `<Form>`, `@inertiajs/*` | App wires navigation/submit; pass `onClick`/`href`/`onSubmit` props |
21
- | Wayfinder routes — `@/routes`, `@/actions`, `.url()` | App resolves the URL, passes a plain string |
22
- | Business entities / domain logic (Item, Packing, shipment rules) | App-level component in `resources/js/components/**` |
23
- | App copy / labels / placeholder text baked into the component | Comes in via props; framework ships no product wording |
24
- | Raw colors / hex / `hsl(...)` literals, `dark:` overrides | Semantic tokens (`var(--…)`, `bg-primary`, …) — see §3 |
25
- | A consumer's theme values redefined inside a component | Theme lives in `src/tokens/` (the framework default ships it) |
26
-
27
- > **Litmus test:** if a component can't render in a Storybook-style preview with
28
- > plain props and zero app context, it does **not** belong in this package. Keep it
29
- > app-level (`resources/js/components/admin/…`) and have it _compose_ framework
30
- > primitives. See the **`godx-ui-component-placement`** skill for the full decision.
31
-
32
- The framework ships its **own theme** (colors, fonts, type scale, wa-iro palette) in `src/tokens/foundation.css`, so consumers import `@godxjp/ui/styles` and need **zero** extra theme config. Do not push theme decisions back onto the consumer.
33
-
34
- ---
35
-
36
- ## 1. Architecture — the layers, bottom-up
37
-
38
- ```
39
- src/tokens/ Design tokens (the single source of values)
40
- foundation.css :root + .dark — colors, fonts, type scale, spacing, radius, wa-iro
41
- primitives/*.css Per-domain primitive tokens (card, table, control, badge, …)
42
- base.css Coordinates the token layer
43
- src/styles/ CSS that styles components by [data-slot] + density.css (the density knob)
44
- index.css Entry: @import fontsource → tailwindcss → @theme (token→utility map) → layout css
45
- src/components/ React components, grouped (data-display, data-entry, layout, …)
46
- src/props/ Prop type system — vocabulary/ (atomic) + components/ + registry.ts
47
- src/lib/ cn(), control-styles, variants — shared helpers
48
- examples/ *.preview.tsx — Storybook-style stories (preview app)
49
- docs/primitives/ <component>/index.tsx demo + examples/ + generated .md
50
- preview/ The preview app (vite) on :6008 that renders examples + docs
51
- ```
52
-
53
- **Token → utility flow:** a value is defined once as a CSS var in `tokens/foundation.css` (e.g. `--primary`), mapped to a Tailwind utility in the `@theme` block of `styles/index.css` (`--color-primary: hsl(var(--primary))`), and consumed as `bg-primary` / `hsl(var(--primary))`. Never skip a layer with a literal.
54
-
55
- ### The component pattern — markup emits slots, CSS owns styling
56
-
57
- Components render semantic structure and `data-slot` / `data-*` flags; **the spacing, padding, and chrome live in `src/styles/*-layout.css`**, keyed on those slots. This keeps density and theming centralized.
58
-
59
- ```tsx
60
- // component: emits slots + flags only
61
- <div data-slot="card" data-variant={variant} data-density={density} />
62
- ```
63
-
64
- ```css
65
- /* styles/card-layout.css: owns the look */
66
- [data-slot="card"] {
67
- border: 1px solid hsl(var(--card-border));
68
- border-radius: var(--card-radius);
69
- }
70
- [data-slot="card"][data-density="tight"] {
71
- --card-space-inset: var(--space-3);
72
- }
73
- ```
74
-
75
- Prefer this over hardcoding Tailwind padding inside the component. Use Tailwind utility classes for **one-off layout** (flex/grid/gap), not for re-theming.
76
-
77
- ### Density
78
-
79
- One knob — `.ui-density-{compact,default,comfortable}` in `styles/density.css` — retunes `--phi-unit`, control heights, and table row heights together. Components read the resulting tokens; never branch on density in component JS.
80
-
81
- ### The `ui/` layer
82
-
83
- `src/components/ui/*` are thin **re-exports** of the canonical implementation (`export * from "../data-display/card"`). They exist for shadcn-style import paths. Edit the canonical file under its group; the `ui/` path follows automatically.
84
-
85
- ---
86
-
87
- ## 2. Adding or changing a component (after you have §0 permission)
88
-
89
- Work in this order; only advance when the previous step genuinely can't express the need:
90
-
91
- 1. **Use** an existing primitive. 2. **Compose** primitives (Card + FormField + Flex…). 3. **Extend** an existing component — add a prop/slot (e.g. `labelAddon`, `accent`). Prefer this: one more prop beats one more component. 4. **Create** a new component — last resort.
92
-
93
- Document the decision (which promotion criteria it met) so review can check it — see [COMPOSITION-VS-COMPONENT.md](./COMPOSITION-VS-COMPONENT.md).
94
-
95
- ---
96
-
97
- ## 3. Rules for framework code
98
-
99
- - **Semantic tokens only.** No raw hex / `rgb()` / `hsl()` literals, no palette utilities (`bg-blue-500`), no `dark:` overrides — tokens adapt automatically. Structural literals (a `3px` accent stripe, `1px` borders) are fine; _color/size scale_ values come from tokens. - **No app coupling** (the §0 boundary table above). - **Props live in `src/props/`** — atomic concepts in `vocabulary/`, per-component interfaces in `components/`. Check `registry.ts` + `PROP_ALIASES_FORBIDDEN` before inventing a prop name.
100
-
101
- ---
102
-
103
- ## 4. Every component change ships its story + docs
104
-
105
- A change isn't done until its documentation reflects it:
106
-
107
- 1. **Preview story** — `examples/<group>/<Component>.preview.tsx` (Storybook-style). New props get a story (see `examples/data-display/Card.preview.tsx`: Surfaces / Density / AccentEdges). 2. **Docs demo** — `docs/primitives/<group>/<component>/index.tsx` shows the new capability; `examples/` holds focused per-feature demos. 3. **Regenerate props docs** — `pnpm docs:sync-primitives` regenerates the `.md` from source. Run it after prop changes so the tables stay accurate.
108
-
109
- > Docs are mid-migration to the `<component>/index.tsx (+ examples/)` shape. Do **not**
110
- > resurrect flat `docs/primitives/<component>.tsx` demos — they were dead orphans and
111
- > were removed.
112
-
113
- ---
114
-
115
- ## 5. Verify before finishing — scope the checks to the DIFF
116
-
117
- > **Read §5.0 before you run anything.** This section was rewritten after the owner watched a
118
- > two-file change take six minutes of gates and asked, correctly, _"bản chất chỉ sửa rất ít, check
119
- > diff đéo được hay sao? có phải release đâu mà run hết thế?"_ — it is not a release, so stop
120
- > running a release's worth of checks.
121
-
122
- ### 5.0 MEASURE FIRST, THEN COMPLAIN — the real cost table
123
-
124
- Every number below was measured on this repo, on an M-series Mac, warm. **Measure again before you
125
- believe them; a cost you assumed is how you end up optimising the wrong thing.**
126
-
127
- | command | cost | scope |
128
- | -------------------------- | --------------- | ------------------------------------------ |
129
- | `check:token-tiers` | **0.2s** | whole repo |
130
- | `audit` | **0.5s** | whole repo (~600 files) |
131
- | `typecheck:docs` | **0.7s** | whole `docs/` program |
132
- | `typecheck` | **1.3s** | whole `src/` program |
133
- | `build` | **1.5s** | whole package |
134
- | `preview:build` | **1.9s** | whole preview |
135
- | `lint` | **12.9s** | whole repo |
136
- | **`check:frame-overflow`** | **52s** (was 339s before it was parallelised, gh#851) | **199 frames x 2 viewports, in a browser** |
137
-
138
- **The lesson is the opposite of the intuition.** "Typecheck the whole system" sounds wasteful and
139
- costs **1.3 seconds** — typescript-7 is the native compiler, there is nothing to save there, and
140
- scoping it to changed files would cost more in ceremony than it saves in wall clock. Meanwhile the
141
- one command that _does_ cost real time is the browser sweep, and it is the one that looks innocent
142
- in a shell script.
143
-
144
- `check:frame-overflow` alone was **~96% of the wall clock** of a full local pass. It ran all 398
145
- navigations down a SINGLE page, in series. It now runs a pool of one page per core (capped at 8):
146
- **339s -> 52.3s, 6.5x**, byte-identical output, and a planted overflow is still caught at both
147
- viewports by both. `FRAME_CONCURRENCY=1` restores the serial run for debugging.
148
-
149
- > **Never argue about the cost of a gate you have not timed.** Time it:
150
- > `st=$(date +%s); pnpm <gate> >/dev/null 2>&1; echo $(( $(date +%s) - st ))s`
151
-
152
- ### 5.1 What to run, by what you touched
153
-
154
- Find the row that matches your diff. Run that row. Do not run the rows below it.
155
-
156
- | you changed | run | why |
157
- | ---------------------------------- | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------- |
158
- | a `.css` file only | `audit` · `check:token-tiers` · the component's own tests · `check:frame-overflow --only <slug>` | no TS changed, so `typecheck` has nothing to say |
159
- | a `.tsx`/`.ts` in `src/` | `typecheck` · `lint` · `audit` · that group's tests | 1.3s + 12.9s, both worth it |
160
- | a file in `docs/` | `typecheck:docs` · `audit` · `check:example-imports` | `typecheck` covers `src/`, not `docs/` |
161
- | a token in `src/tokens/` | + `check:token-tiers` · `src/tokens/__tests__` · `pnpm regen` twice (gh#847) | frozen tier tables go stale instantly |
162
- | a public export / prop | + `pnpm ship:surface` | 8 stacked generators; the list is derived, not remembered |
163
- | anything that moves LAYOUT | `check:frame-overflow --only <slug>` while you work; the FULL sweep once, before the PR | 17.5s vs 339s |
164
- | opening the PR / cutting a release | the full sweep, `verify:ci:static`, the full suite in CI | the only place "run everything" is right |
165
-
166
- ### 5.2 `--only` — the diff-scoped browser sweep
167
-
168
- Added in gh#851 for exactly this. The sweep had no filter at all: 199 frames or nothing.
169
-
170
- ```bash
171
- pnpm check:frame-overflow --only table # 9 frames, 17.5s
172
- pnpm check:frame-overflow --only '/^data-entry-(switch|segmented)/' # 3 frames
173
- pnpm check:frame-overflow # all 199, 52s
174
- ```
175
-
176
- Measured: `--only table` is **17.5s against the full sweep's 52.3s**. Both matter — the pool cut
177
- the full sweep 6.5x, and `--only` cuts what is left to the frames a diff can actually reach.
178
-
179
- Two guards, both deliberate:
180
-
181
- - **`--only` refuses `--update-baseline`.** A partial sweep does not know whether the frames it
182
- skipped are still clean, and recording that as the whole truth is how a baseline stops meaning
183
- anything. Rebaselining needs the full sweep.
184
- - **Its success line says `PARTIAL, not a release gate`** and prints how many frames it skipped, so
185
- a filtered green can never be pasted into a PR as if it were the real thing.
186
-
187
- ### 5.3 The commands, for reference
188
-
189
- ```bash
190
- pnpm lint # eslint — self-contained flat config 12.9s
191
- pnpm typecheck # tsc --noEmit over src/ 1.3s
192
- pnpm typecheck:docs # tsc --noEmit over docs/ 0.7s
193
- pnpm audit # godxjp-ui-audit — 0 errors for touched files 0.5s
194
- pnpm check:mcp-sync # MCP registry <-> library export drift guard
195
- pnpm vitest run src/components/<group>/__tests__ --maxWorkers=2 # ONLY what you touched
196
- pnpm check:frame-overflow --only <slug> # the frames your change can reach ~18s
197
- pnpm check:frame-overflow # all 199 — pre-PR and CI only 52s
198
- pnpm preview:build # integration test: examples + docs must build 1.9s
199
- pnpm test # FULL suite — CI only, never from an agent loop
200
- pnpm check:frame-axe # WCAG 2.2 AA over every frame — LOCAL ONLY, never in CI (FRAME-A11Y-CI.md)
201
- ```
202
-
203
- `pnpm verify` and `pnpm verify:release` run these together (verify:release also builds) — **both include the full suite, so both belong to CI.** Locally, run them at most once immediately before opening a PR, never inside an edit loop and never while other agents are working on the same machine. It needs `pnpm exec playwright install chromium` once locally; see [FRAME-A11Y-CI.md](./FRAME-A11Y-CI.md) for how to run/scope it, read the evidence, and regenerate its baseline after an accessibility fix.
204
-
205
- ### Reproducing one screen at one width — the frame routes
206
-
207
- Three gates and every bug report start here, so the addressing is written down rather than guessed
208
- (godx-jp/id#639 burned three attempts on `?frame=…`, which is not a thing):
209
-
210
- ```
211
- pnpm preview # :6008
212
- http://localhost:6008/isolate/<id> # the demo ALONE, at the real viewport — measure here
213
- http://localhost:6008/frame/<id> # the same demo inside the device-preset chrome
214
- ```
215
-
216
- `<id>` is the demo's path under `docs/`, minus `.tsx`, with `/` turned into `-`:
217
- `docs/layout/topbar.tsx` → `layout-topbar`, `docs/data-entry/date-picker.tsx` → `data-entry-date-picker`.
218
- A file may override it with a `slug` in its frontmatter. Both routes accept
219
- `?dir=rtl&density=compact&theme=dark&locale=ja`; `/frame/**` additionally takes `?preset=`/`?w=`/`?h=`/`?zoom=`.
220
-
221
- For an axe measurement at a given width, drive `/isolate/<id>` with Playwright at that viewport —
222
- that is what `scripts/topbar-collision-visual.mjs` and the other `test:visual:*` gates do.
223
-
224
- All gates are **self-contained** — no internal/external tooling package required. The eslint, prettier, and vitest setup live in the package (`eslint.config.js`, `prettier.config.mjs`, `vitest.config.ts`, `src/test/`), so a fresh checkout can lint/type-check/test without anything beyond the declared devDependencies.
225
-
226
- The app side additionally runs **`npm run ui:audit`** (the design-system linter) and must report 0 errors for touched files.
227
-
228
- ---
229
-
230
- ## 6. Releasing — the lib and its MCP, in lockstep
231
-
232
- This repo publishes **two packages** that must agree: `@godxjp/ui` (the browser component library, root `package.json`) and `@godxjp/ui-mcp` (the Node MCP server that tells agents how to use it, `mcp/`).
233
-
234
- ### The lockstep contract (issue #140)
235
-
236
- A consumer that installs `@godxjp/ui@16.10.x` but points its agent at `@godxjp/ui-mcp@16.7.x` gets prop/token/pattern guidance for a build it never installed. To make that impossible, the two packages carry **mutual, machine-readable compatibility metadata**:
237
-
238
- - root `package.json` → `"godxUiMcp": "<mcp version>"` — the catalog version this library ships with.
239
- - `mcp/package.json` → `"version"` (identical to the library) **and** `"godxUiCompatibility": "<maj>.<min>.x"` — the UI minor this catalog describes.
240
- - the MCP exposes it at runtime: `serverInfo.version` == package version, the `godx-ui://compatibility` resource, and the `check_compatibility` tool (an agent calls it with the app's installed `@godxjp/ui` version to get a match/mismatch verdict).
241
-
242
- - **Lockstep guard** (`pnpm check:mcp-lockstep` → `scripts/check-release-lockstep.mjs`) — asserts ui.version == mcp.version, ui.godxUiMcp == mcp.version, and mcp.godxUiCompatibility covers the UI version. Any split fails CI. - **Catalog drift guard** (`pnpm check:mcp-sync` / `check:mcp-orphans`) — every component the MCP catalogs must still be a real library export, and vice-versa. - **Packed-artifact guard** (`release-integrity` CI, step 4) — packs both tarballs and re-asserts lockstep on the **packed** manifests, i.e. the bytes that would actually ship.
243
-
244
- ### Coordinated release (`pnpm release`)
245
-
246
- ```bash
247
- pnpm release --ui minor --mcp sync # bump ui, republish mcp at the SAME new version — the norm
248
- pnpm release --mcp sync # mcp-only fix at the current ui version
249
- ```
250
-
251
- `--ui <bump>` **requires** `--mcp sync` (the tool refuses a ui-only release) so the two packages can never split. On a bump the tool refreshes both compatibility fields, runs `verify:release` (incl. all three guards) before publishing the lib, `npm publish`es each package, re-runs the lockstep check as a final fail-closed gate, then commits the version bumps.
252
-
253
- ### Recovery from a partial publish
254
-
255
- If a run publishes `@godxjp/ui` but the `@godxjp/ui-mcp` publish fails (npm hiccup, expired token), the two are momentarily split on npm. Recover:
256
-
257
- 1. Fix the cause (e.g. re-auth `npm whoami`), keep the working tree at the just-published version. 2. Re-run **only** the MCP half at that same version: `pnpm --dir mcp build && npm --prefix mcp version <ui-version> --allow-same-version && npm --prefix mcp publish --access public`. 3.
258
-
259
- npm versions are immutable, so you can never "fix" a bad published version in place — you can only publish the matching partner at the same number, or move both forward with a fresh `pnpm release --ui patch --mcp sync`. Never hand-publish one package and forget the other.
260
-
261
- ---
262
-
263
- ## See also
264
-
265
- - [README](../README.md) — overview, component groups, consumer setup.
266
- - [CONSUMER-RULES.md](./CONSUMER-RULES.md) — the ten rules every consumer follows (the audit enforces them).
267
- - `docs/TOKENS.md`, `docs/SPACING.md`, `docs/PROPS-VOCABULARY.md`, `docs/PROPS-REGISTRY.md`.
268
- - [FRAME-A11Y-CI.md](./FRAME-A11Y-CI.md) — per-frame axe a11y (**local only, never in CI**) + geometry + coverage gates.
269
- - **`godx-ui-component-placement`** skill — decide whether a component belongs here.
@@ -1,287 +0,0 @@
1
- # Per-frame accessibility — `check:frame-axe` (LOCAL ONLY)
2
-
3
- One ruler, run in the repository that owns the CSS — **on a developer machine, never in CI/CD.**
4
-
5
- > **Owner's standing rule (2026-09-17): axe must not run in any GitHub Actions workflow.** It is a
6
- > local measurement only. gh#643 had wired it into `ci-browser.yml` (four shards on every merge) and
7
- > `ci-browser-full.yml` (nightly); both jobs are removed. `check:gate-coverage` lists
8
- > `check:frame-axe` as EXEMPT with this reason, so its absence from the workflows is a declaration,
9
- > not a dead gate. **Do not re-wire it into a workflow.** The file keeps its historical name so
10
- > existing links still resolve.
11
-
12
- ## Why it exists (gh#643)
13
-
14
- `scripts/visual-audit.mjs` carries **eight** rules. A consumer's nightly runs `@axe-core/playwright`
15
- with **68**. Six of our eight are design-language opinions with no axe equivalent —
16
- `oversaturated-accent`, `sibling-card-gap`, `row-content-starved`, `emoji-rendered`,
17
- `alert-controls-misplaced`, `css-layers-missing` — and a design system **should** own those. The
18
- other sixty (names, roles, `aria-*`, contrast, focus order, target size) were checked **nowhere in
19
- this repository**, and only in a consumer that cannot fix the CSS, because the CSS is here.
20
-
21
- gh#639 is what that costs. A topbar shipped; every gate here said green; `target-size` failed in
22
- `godx-jp/id`'s nightly at 320px. And our own `target-size-min` could not have caught it at any
23
- threshold — it measures a **painted box**, and that failure was an **obscured** target (axe:
24
- `partiallyObscured`, 8×28). Two rulers, and the disagreement only ever surfaces downstream.
25
-
26
- ## What it does
27
-
28
- ```bash
29
- pnpm check:frame-axe # every frame, 3 viewports
30
- pnpm check:frame-axe -- --update # rewrite the baseline
31
- pnpm check:frame-axe -- --scope=showcase # the 30 whole-page frames only, 30s
32
- pnpm check:frame-axe -- /isolate/layout-topbar # one route, while fixing
33
- ```
34
-
35
- | | |
36
- | --------- | --------------------------------------------------------------------------------- |
37
- | tool | `@axe-core/playwright` |
38
- | tags | `wcag2a` · `wcag2aa` · `wcag21aa` · `wcag22aa` — **the consumer's set, verbatim** |
39
- | routes | every `/isolate/<id>` in `window.__STORY_MANIFEST__` + every `/showcase/<id>` |
40
- | viewports | 1440×900 · 375×667 · **320×568** |
41
- | states | as rendered, **plus** one overlay OPEN on the routes that declare `data-axe-open` |
42
-
43
- 320 is not decoration: it is WCAG 2.2 SC 1.4.10's reflow width, it is the width the consumer's
44
- nightly runs, and it is the width gh#639 failed at while 390 passed.
45
-
46
- Showcases are included on purpose. They are the only frames here shaped like a real screen — a whole
47
- page, a landmark tree, a focus order — which is precisely the class the component frames cannot
48
- reach and the consumer has been carrying alone.
49
-
50
- ## The overlay scope — opening the thing before measuring it
51
-
52
- A menu, dialog, listbox or popover that is closed at rest **paints nothing**. Every axe rule whose
53
- condition only exists while one is open was therefore outside this gate's field of view, not passing
54
- it. The gate shipped in 24.1.0 without this half; it is back (gh#643 item 4), rebuilt from the
55
- version #492 deleted.
56
-
57
- A demo opts in **declaratively**, from the demo itself:
58
-
59
- ```tsx
60
- // the trigger, when it forwards DOM props
61
- <DialogTrigger asChild>
62
- <Button data-axe-open size="sm">仕訳新規作成</Button>
63
- </DialogTrigger>
64
-
65
- // the region that owns it, when the component renders its own trigger
66
- <CardContent data-axe-open>
67
- <FormField id="status" label="状態"><Select … /></FormField>
68
- </CardContent>
69
-
70
- // right-click, for the gesture nothing else reaches
71
- <Button data-axe-open="contextmenu" variant="outline">…</Button>
72
- ```
73
-
74
- What the gate then does, per route/viewport, **after** the default-state scan (opening an overlay is
75
- destructive to the state that scan measures):
76
-
77
- 1. Take the **first** `[data-axe-open]` on the page. No declaration ⇒ the route skips this entirely
78
- and costs nothing.
79
- 2. Press **Escape** up to three times while any overlay is mounted. Several demos deliberately
80
- render one open at rest (`popover`'s anchored panel, `dropdown-menu`'s `defaultOpen` card), and a
81
- modal one makes the rest of the page unreachable. Dismissing first also makes the measurement a
82
- real **closed → open** transition rather than whatever the demo happened to leave mounted.
83
- 3. Resolve the click target: the declaring element itself when it matches
84
- `button, [role=button], [role=combobox], [role=menuitem], a[href], summary`, otherwise the first
85
- such control inside it. (`Select` and `DatePicker` own their trigger DOM and forward no `data-*`
86
- to it — hence the declare-on-the-region form. `DatePicker`'s combobox `<input>` is what opens the
87
- calendar, and it is what gets pressed.)
88
- 4. Click (or right-click), then wait until **one more** overlay is mounted
89
- (`[data-radix-popper-content-wrapper], [role=dialog], [role=alertdialog], [role=menu],
90
- [role=listbox]`) — never a bare timer.
91
- 5. Scan again, and key the rows `@<viewport>+open`:
92
-
93
- ```
94
- /isolate/data-entry-select-matrix @1440+open aria-required-children
95
- ```
96
-
97
- **A declaration whose overlay never opens is a gate FAILURE**, recorded as `overlay-did-not-open`
98
- and red on the spot. A broken declaration otherwise reads exactly like a clean frame, which is the
99
- one thing this scope exists to prevent.
100
-
101
- **Routes declaring an open step today — 7 declared, 7 open:** `data-entry-select`,
102
- `data-entry-select-matrix`, `data-entry-date-picker`, `data-display-popover`,
103
- `navigation-dropdown-menu`, `feedback-dialog`, `feedback-sheet`. (The old `navigation-context-menu`
104
- frame is gone — `ContextMenu` was folded into `DropdownMenu trigger={["contextMenu"]}` in v23 — so
105
- the right-click gesture is declared on that card of `navigation-dropdown-menu` instead.)
106
-
107
- ### What it found, and the proof it has teeth
108
-
109
- **`aria-required-children`, CRITICAL, on `/isolate/data-entry-select-matrix` at all three
110
- viewports.** `SelectSeparator` rendered react-aria's `<Separator>`, i.e. `role="separator"`, as a
111
- direct child of the viewport's `role="listbox"`. ARIA 1.2 lets a `listbox` own `option` and `group`
112
- and nothing else. Fixed in `src/components/data-entry/select.tsx` — the divider is decoration over a
113
- structure the two `SelectGroup`s already announce, so it now renders `aria-hidden` with no role.
114
- `menu` **does** own `separator`, so `DropdownMenuSeparator` is correct as it stands. Regression test:
115
- `src/components/data-entry/__tests__/select-groups.test.tsx`.
116
-
117
- The control run is the part worth keeping. On the **same defective build**:
118
-
119
- | declarations | result |
120
- | ------------ | --------------------------------------------------------------------------- |
121
- | removed | ✓ green, `0 route(s) opened a declared overlay` |
122
- | present | ✗ red, 3 × `aria-required-children` on `@1440+open / @375+open / @320+open` |
123
-
124
- A `data-axe-open` on a `Button` that opens nothing turns the gate red with three
125
- `overlay-did-not-open` rows, one per viewport.
126
-
127
- **The original 2026-09 proof no longer reproduces, and the reason matters more than the proof.** That
128
- commit disabled `src/components/general/inert-background.ts` and watched `aria-hidden-focus` go red
129
- on `select`, `dropdown-menu` and `context-menu`. Disabling it today changes nothing measurable:
130
- these overlays are **react-aria-components**, not Radix: react-aria inerts the background itself —
131
- `#root` plus three focus sentinels carry `inert` the moment a listbox opens, with no `aria-hidden`
132
- anywhere on them. Stripping every `inert` attribute immediately before the scan still leaves the
133
- page clean and `aria-hidden-focus` in axe's `passes` bucket, because that rule needs an
134
- `aria-hidden` ancestor to fire at all. No `src/` component imports `useInertHiddenBackground` any
135
- more; the only importer is the Radix parity fixture
136
- `src/components/data-entry/__tests__/radix-select.fixture.tsx`. So `inert-background.ts` is dead
137
- for `Select` and `DropdownMenu`, and the overlay scope's value is no longer the rule it was built
138
- for.
139
-
140
- Be careful with the stronger version of that claim, because the first draft of this paragraph made
141
- it and it is false: `data-aria-hidden` is **not** absent from the built preview. The `aria-hidden`
142
- npm package ships inside the `command` chunk (`cmdk`'s dependency tree), so the marker exists in
143
- the bundle even though no first-party overlay sets it. What is measured above is the narrow claim —
144
- `Select` and `DropdownMenu` background-inert via `inert`, not `aria-hidden` — not a repo-wide
145
- absence. It is still the rule class: `aria-required-children` is the same
146
- shape, and nothing else here could see it.
147
-
148
- ### What is still outside this scope, stated rather than hidden
149
-
150
- - Only the **first** declaration per route is exercised. A route with several distinct overlays is
151
- measured on one of them.
152
- - Only **one step deep**: submenus, an overlay opened from inside another, and the state after a
153
- selection are not reached.
154
- - **Keyboard opening is not exercised** — the gate clicks. A trigger that opens on click but not on
155
- `Enter`/`Space` passes.
156
- - The overlay's **focus trap and focus order** are not asserted; axe cannot see a JS focus trap.
157
-
158
- ## What it found on its first run — and what came of it
159
-
160
- 54 rows, **159 violation nodes**, on code that passed every other gate in this repository. Fixing
161
- them took it to **12 rows / 19 nodes**, and then to **0**:
162
-
163
- | rule | first run | now | what it was |
164
- | ----------------------- | --------: | --: | ---------------------------------------------------------------------------------------------------------------------------------------- |
165
- | `color-contrast` | 62 | 0 | text under 4.5:1 (SC 1.4.3) |
166
- | `target-size` | 28 | 0 | under 24×24 (SC 2.5.8) — `Carousel` dots, `SearchInput`'s clear button, `Attachments`' file input |
167
- | `aria-prohibited-attr` | 21 | 0 | `Badge`'s `aria-label` on a `generic` div — the name was dropped by every screen reader |
168
- | `button-name` | 18 | 0 | **`Select`'s trigger is `role="combobox"`, which cannot be named by its contents** — every unlabelled Select shipped a nameless combobox |
169
- | `aria-valid-attr-value` | 18 | 0 | `aria-controls` pointing at ids that do not exist |
170
- | `aria-conditional-attr` | 12 | 0 | `aria-expanded` on a `<tr>`, which only a `treegrid` row may carry |
171
-
172
- Four of those were LIBRARY defects, not demo slips — `Badge`, `Select`, `Carousel`, `SearchInput` —
173
- and the fifth produced a new vocabulary member: `tone="inherit"` on `Text` / `Heading` / `Title` /
174
- `Activity` / `Separator`, because every other tone is an absolute token and there was no way to put
175
- text on a coloured surface without fighting it.
176
-
177
- The `target-size` rows are the sharpest point about two rulers. Our own `target-size-min` was
178
- running on those same frames and reporting them clean, because it measures a painted box. And the
179
- fix axe wants is not the fix the standard wants: a centred `::after` genuinely makes the target
180
- 24×24 — `docs/MEASUREMENT-CONTRACT.md` records that under `expanders` — but axe reads
181
- `getBoundingClientRect()`, which cannot see a pseudo-element. Both fixes were tried; the boxes had
182
- to grow.
183
-
184
- ## The last twelve rows, and what each one turned out to be
185
-
186
- The table above is what the sweep found; this is what the remaining 12 rows / 19 nodes turned out
187
- to be once each was measured rather than reasoned about. The rows are kept, with the verdict this
188
- file used to carry quoted back, because four of the five were wrong: two had no diagnosis at all
189
- and two had one the measurement contradicted — and in both of those the guess pointed AWAY from
190
- this package.
191
-
192
- | rows | what | the measurement, and where it was fixed |
193
- | ---: | ------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
194
- | 3 | `foundation-colors` · `--success-foreground` on `--success`, `--attention-foreground` on `--attention` | Called "a PALETTE decision, an owner-level call". It was not the palette: the FILL was fine and the INK was wrong. Two of the light theme's eight fills carried a near-white ink their own lightness cannot support (2.19:1 / 3.32:1) while the sibling `--warning` had always used the near-black one on the equally pale 山吹, and the DARK theme already flipped both. `src/tokens/foundation.css`: ink only — success 2.19 → **7.08**, attention 3.32 → **4.68**. Guarded by `__tests__/status-fill-contrast.test.ts`. |
195
- | 3 | `case6-agency-handy` · a SELECTED `ToggleGroupItem` paints `--foreground` over `--primary` | "Cause not yet found." Found, with `CSS.getMatchedStylesForNode`: the demo wrote `text-[var(--font-size-xs)]`, and Tailwind v4 reads a bare `var()` in `text-*` as a COLOUR — it compiled to `color: var(--font-size-xs)` in the UTILITIES layer, an invalid colour that clobbered the component's own `color: hsl(var(--primary-foreground))` in `components` and left the trigger inheriting the page ink. The component rule was right all along. Demo fix (`text-[length:var(…)]`, 10 sites in `docs/`), plus the count pill: the hand-rolled `Text` at `opacity-70` measured 2.15:1 and `ToggleGroupItem`'s own `count` prop inverts to 6.32:1. |
196
- | 3 | `table-view-tabs` · a `Tab`'s `aria-controls` points at a `tabpanel` that is never rendered | A LIBRARY defect, and the composition is published: `Tabs` / `TabsList` / `TabsTrigger` are three separate exports, nothing in their types asks for a fourth, and the attribute could not be overridden (`withDomProps` puts RAC's props after the caller's). `TabsContent` now registers its value and a trigger claims a panel only when one is declared. No new public prop. `__tests__/tabs-panel-reference-643.test.tsx`. |
197
- | 2 | `futurelastic-web` @320/@375 · white ghost buttons read as 1.01:1 | "Probably a false positive." It was not. The tenant's `.fl-navbar-inner` was a fixed-height flex row with no wrap, so at 320 its content ran to **x=569.6 inside a 320px nav** — the links painted outside the navbar's own box, over the page behind it. A WCAG 2.2 SC 1.4.10 reflow failure reported by the contrast rule, because that is what an overflowing element looks like from the outside. Demo CSS + `Flex wrap`. |
198
- | 1 | `table-bulk-actions` @375 · `target-size` | "Not yet diagnosed." The left cluster carried `min-w-0 flex-1` — "squeeze me to nothing" — over children that refuse to shrink, so its box shrank to 113.6px while its content ran to x=462 and painted 一括承認 (264.6→360.2) under 解除 (272.3→341.0), leaving 19.2×30.2 unobscured against SC 2.5.8's 24×24. Demo: `wrap`, and no `min-w-0`. |
199
-
200
- Two of the five were library defects and three were genuine demo slips — a different split from the
201
- first sweep, where four of five were the library's. Which is the point of writing the number down
202
- next to each one: "it is the demo" and "it is the palette" are both cheap to say and neither
203
- survived a measurement here.
204
-
205
- ## The baseline is a debt ledger, not an allowlist
206
-
207
- The package did not start compliant, and a gate that fails the whole build on its first day gets
208
- deleted rather than obeyed. `frame-axe-baseline.json` records what was already failing when the gate
209
- landed, keyed one row per `(route, viewport, rule)`:
210
-
211
- ```
212
- "/isolate/layout-topbar @320 target-size": { "count": 2, "help": "…" }
213
- ```
214
-
215
- The gate fails on a key that is **not** in the baseline, and on a baselined key whose `count`
216
- **grows**. A key that stops firing is reported so it can be dropped.
217
-
218
- - **Delete rows as you fix them.** `--update` rewrites the file; the diff is the review.
219
- - **Never add a row by hand to turn a red build green.** That is the one move this file exists to
220
- make visible.
221
-
222
- ## What this gate does NOT do — stated, not hidden
223
-
224
- The gate deleted in #492 did three things this one does not. One is now back; two are still gaps:
225
-
226
- 1. ~~**No overlay scope.**~~ Restored — see [the overlay
227
- scope](#the-overlay-scope--opening-the-thing-before-measuring-it) above.
228
- 2. **No chrome/component split.** The old gate held the preview toolbar to zero violations and
229
- allowlisted the component scope separately. `/isolate/**` renders the demo alone, so there is
230
- little chrome to separate — but `/showcase/**` is scanned whole.
231
- 3. **No per-rule severity.** Every WCAG-tagged rule is treated alike.
232
-
233
- ## Determinism
234
-
235
- Two consecutive sweeps of identical code first disagreed on five `color-contrast` rows: a fade-in
236
- caught mid-flight renders text at partial opacity and axe scores whatever it finds. A gate that
237
- disagrees with itself gets ignored, so each page is pinned before the scan —
238
- `reducedMotion: "reduce"`, an injected stylesheet zeroing every animation and transition duration,
239
- and `document.fonts.ready` (web fonts change glyph geometry, which changes which boxes overlap,
240
- which changes what `color-contrast` resolves a background to). Two sweeps after that: identical.
241
-
242
- ## Cost
243
-
244
- | | |
245
- | ------------------------------------- | ----------------------------------------------------------------------------------- |
246
- | full sweep | **2m14s** locally, with the overlay scope — 215 routes × 3 viewports |
247
- | sequential | ~55 min — the three viewport passes run concurrently, which is the whole difference |
248
- | showcase only (`--scope=showcase`) | ~30s |
249
- | one route (`pnpm check:frame-axe /isolate/…`) | seconds — the loop to use while fixing |
250
-
251
- The overlay pass is bounded by declaration: only the 7 declaring routes pay it (21 extra scans plus
252
- their open steps), and no `/showcase/**` route declares one, so `--scope=showcase` is unchanged by it.
253
-
254
- ## Where it runs: your machine
255
-
256
- **Never in CI/CD** — see the rule at the top. The procedure:
257
-
258
- ```bash
259
- pnpm build && pnpm preview:build # the STATIC preview — not `pnpm dev` / `pnpm preview`
260
- pnpm check:frame-axe # full sweep; must end with 0 baselined entries, 0 nodes
261
- pnpm check:frame-axe /isolate/<frame> # one route, while fixing
262
- ```
263
-
264
- Run it before a PR that touches markup, ARIA, focus behaviour or colour, and commit what it writes —
265
- `audit-evidence/frame-axe/results.json` and, only when a full sweep genuinely changed it,
266
- `frame-axe-baseline.json`.
267
-
268
- **The static preview, not the dev server.** Against the vite dev server the sweep produces 1–3
269
- spurious `route-did-not-render` / `axe-did-not-run` rows on different routes each run — 30s
270
- `page.goto` timeouts while three viewport contexts hammer an on-demand-transforming server. Each is
271
- clean alone. The static build does not do this.
272
-
273
- **`--shard=i/n` and `--scope=` are for splitting a LOCAL run**, e.g. across two terminals. Two guards
274
- hold for both: `--update` refuses under either (a partial run would rewrite the ledger from a fraction
275
- of the frames and delete the rest), and the "no longer fires" report is suppressed on a partial run
276
- (every other partition's rows would read as fixed). Regenerate the baseline from a full sweep only.
277
-
278
- ### What leaving CI costs, stated rather than discovered
279
-
280
- A regression is now caught when someone runs this, not on merge. Nothing in the pipeline will turn
281
- red on a new `aria-*` defect, a nameless button or a sub-24px target. That is the trade the rule
282
- makes, and the only thing that closes it is the local run above actually happening before a PR.
283
-
284
- ## Related
285
-
286
- - [FRAME-COVERAGE-STANDARD.md](./FRAME-COVERAGE-STANDARD.md) — which frames must exist at all.
287
- - [DEVELOPMENT.md](./DEVELOPMENT.md) §5 — the `/isolate/<id>` · `/frame/<id>` addressing.