@godxjp/ui 6.0.0 → 6.0.2

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 (434) hide show
  1. package/dist/app/index.d.ts +140 -0
  2. package/dist/app/index.js +38 -0
  3. package/dist/app.prop-IobwLwaM.d.ts +90 -0
  4. package/dist/checkbox-NkFkqsQ8.d.ts +13 -0
  5. package/dist/chunk-2XW7J3EI.js +226 -0
  6. package/dist/chunk-3F2AKYRD.js +416 -0
  7. package/dist/chunk-3KPEZ5CF.js +37 -0
  8. package/dist/chunk-3UGU5TYP.js +89 -0
  9. package/{src/props/registry.ts → dist/chunk-6RA3KSVK.js} +118 -133
  10. package/dist/chunk-7NZFVD24.js +122 -0
  11. package/dist/chunk-7PWBC4BY.js +25 -0
  12. package/dist/chunk-7S7MYFXE.js +61 -0
  13. package/dist/chunk-7WRZG2IG.js +71 -0
  14. package/dist/chunk-B775Y6BE.js +1 -0
  15. package/dist/chunk-BHV2FUOA.js +111 -0
  16. package/dist/chunk-BI3HERR7.js +70 -0
  17. package/dist/chunk-BPSKQUL2.js +68 -0
  18. package/dist/chunk-CDWPQ5RP.js +187 -0
  19. package/dist/chunk-CP2LET6N.js +244 -0
  20. package/dist/chunk-CQBADMFG.js +20 -0
  21. package/dist/chunk-CRERCLIZ.js +33 -0
  22. package/dist/chunk-DU6ZYZRP.js +238 -0
  23. package/dist/chunk-DY5C44UP.js +55 -0
  24. package/dist/chunk-E4HJNQ62.js +117 -0
  25. package/dist/chunk-E76QIYSY.js +93 -0
  26. package/dist/chunk-F7PG4OEV.js +37 -0
  27. package/dist/chunk-GDSVW62T.js +171 -0
  28. package/dist/chunk-H2FHJOLU.js +178 -0
  29. package/dist/chunk-HJEBRCXL.js +55 -0
  30. package/dist/chunk-ICM6XBST.js +16 -0
  31. package/{src/components/data-entry/calendar.tsx → dist/chunk-IK7I3ABN.js} +33 -35
  32. package/dist/chunk-L6J44O74.js +144 -0
  33. package/dist/chunk-LDSLS6HE.js +1 -0
  34. package/dist/chunk-LVNUHUEZ.js +191 -0
  35. package/dist/chunk-M64MVRLS.js +92 -0
  36. package/dist/chunk-NGQW3KEM.js +402 -0
  37. package/dist/chunk-NZ4FOC5N.js +559 -0
  38. package/dist/chunk-PIIRNAXA.js +26 -0
  39. package/dist/chunk-S66TJXJU.js +33 -0
  40. package/dist/chunk-SMLKNECP.js +133 -0
  41. package/dist/chunk-TAHBM3F2.js +66 -0
  42. package/dist/chunk-TO33OY4L.js +150 -0
  43. package/dist/chunk-TO7URV7U.js +51 -0
  44. package/dist/chunk-TOO5AEKL.js +81 -0
  45. package/dist/chunk-U3GHAOIJ.js +299 -0
  46. package/dist/chunk-U7N2A7A3.js +9 -0
  47. package/dist/chunk-UX634MYF.js +123 -0
  48. package/dist/chunk-V6UWJKZF.js +28 -0
  49. package/{src/components/data-entry/input.tsx → dist/chunk-VOHTRR5X.js} +18 -16
  50. package/dist/chunk-WRFKVUPW.js +332 -0
  51. package/dist/chunk-WXW43RK5.js +24 -0
  52. package/{src/components/navigation/tabs.tsx → dist/chunk-XG7XDYIM.js} +46 -53
  53. package/dist/chunk-YFCQKO3B.js +842 -0
  54. package/dist/chunk-ZDWXGWLY.js +73 -0
  55. package/dist/chunk-ZLK5SPT6.js +11 -0
  56. package/dist/chunk-ZS6DTAM2.js +31 -0
  57. package/dist/chunk-ZT5UEUBO.js +1 -0
  58. package/dist/components/admin/index.d.ts +80 -0
  59. package/dist/components/admin/index.js +38 -0
  60. package/dist/components/data-display/badge.d.ts +12 -0
  61. package/dist/components/data-display/badge.js +3 -0
  62. package/dist/components/data-display/card.d.ts +87 -0
  63. package/dist/components/data-display/card.js +2 -0
  64. package/dist/components/data-display/index.d.ts +72 -0
  65. package/dist/components/data-display/index.js +89 -0
  66. package/dist/components/data-display/popover.d.ts +13 -0
  67. package/dist/components/data-display/popover.js +2 -0
  68. package/dist/components/data-display/scroll-area.d.ts +7 -0
  69. package/dist/components/data-display/scroll-area.js +2 -0
  70. package/dist/components/data-display/table.d.ts +10 -0
  71. package/dist/components/data-display/table.js +3 -0
  72. package/dist/components/data-entry/autocomplete.d.ts +16 -0
  73. package/dist/components/data-entry/autocomplete.js +8 -0
  74. package/dist/components/data-entry/calendar.d.ts +16 -0
  75. package/dist/components/data-entry/calendar.js +4 -0
  76. package/dist/components/data-entry/cascader.d.ts +32 -0
  77. package/dist/components/data-entry/cascader.js +13 -0
  78. package/dist/components/data-entry/checkbox.d.ts +13 -0
  79. package/dist/components/data-entry/checkbox.js +4 -0
  80. package/dist/components/data-entry/color-picker.d.ts +16 -0
  81. package/dist/components/data-entry/color-picker.js +6 -0
  82. package/dist/components/data-entry/command.d.ts +69 -0
  83. package/dist/components/data-entry/command.js +3 -0
  84. package/dist/components/data-entry/date-picker.d.ts +16 -0
  85. package/dist/components/data-entry/date-picker.js +8 -0
  86. package/dist/components/data-entry/date-range-picker.d.ts +16 -0
  87. package/dist/components/data-entry/date-range-picker.js +8 -0
  88. package/dist/components/data-entry/index.d.ts +53 -0
  89. package/dist/components/data-entry/index.js +152 -0
  90. package/dist/components/data-entry/input.d.ts +6 -0
  91. package/dist/components/data-entry/input.js +2 -0
  92. package/dist/components/data-entry/label.d.ts +8 -0
  93. package/dist/components/data-entry/label.js +2 -0
  94. package/dist/components/data-entry/radio.d.ts +24 -0
  95. package/dist/components/data-entry/radio.js +4 -0
  96. package/dist/components/data-entry/select.d.ts +18 -0
  97. package/dist/components/data-entry/select.js +3 -0
  98. package/dist/components/data-entry/slider.d.ts +16 -0
  99. package/dist/components/data-entry/slider.js +2 -0
  100. package/dist/components/data-entry/switch.d.ts +17 -0
  101. package/dist/components/data-entry/switch.js +2 -0
  102. package/dist/components/data-entry/textarea.d.ts +6 -0
  103. package/dist/components/data-entry/textarea.js +3 -0
  104. package/dist/components/data-entry/time-picker.d.ts +16 -0
  105. package/dist/components/data-entry/time-picker.js +7 -0
  106. package/dist/components/data-entry/transfer.d.ts +17 -0
  107. package/dist/components/data-entry/transfer.js +11 -0
  108. package/dist/components/data-entry/tree-select.d.ts +26 -0
  109. package/dist/components/data-entry/tree-select.js +13 -0
  110. package/dist/components/data-entry/upload.d.ts +42 -0
  111. package/dist/components/data-entry/upload.js +11 -0
  112. package/dist/components/feedback/alert.d.ts +60 -0
  113. package/dist/components/feedback/alert.js +7 -0
  114. package/dist/components/feedback/dialog.d.ts +64 -0
  115. package/dist/components/feedback/dialog.js +7 -0
  116. package/dist/components/feedback/index.d.ts +16 -0
  117. package/dist/components/feedback/index.js +14 -0
  118. package/dist/components/feedback/sheet.d.ts +24 -0
  119. package/dist/components/feedback/sheet.js +2 -0
  120. package/dist/components/feedback/sonner.d.ts +6 -0
  121. package/dist/components/feedback/sonner.js +1 -0
  122. package/dist/components/general/button.d.ts +20 -0
  123. package/dist/components/general/button.js +2 -0
  124. package/dist/components/general/index.d.ts +6 -0
  125. package/dist/components/general/index.js +2 -0
  126. package/dist/components/layout/index.d.ts +71 -0
  127. package/dist/components/layout/index.js +5 -0
  128. package/dist/components/navigation/dropdown-menu.d.ts +28 -0
  129. package/dist/components/navigation/dropdown-menu.js +2 -0
  130. package/dist/components/navigation/index.d.ts +32 -0
  131. package/dist/components/navigation/index.js +12 -0
  132. package/dist/components/navigation/pagination.d.ts +11 -0
  133. package/dist/components/navigation/pagination.js +7 -0
  134. package/dist/components/navigation/steps.d.ts +12 -0
  135. package/dist/components/navigation/steps.js +3 -0
  136. package/dist/components/navigation/tabs-items.d.ts +12 -0
  137. package/dist/components/navigation/tabs-items.js +3 -0
  138. package/dist/components/navigation/tabs.d.ts +12 -0
  139. package/dist/components/navigation/tabs.js +2 -0
  140. package/dist/components/query/index.d.ts +43 -0
  141. package/dist/components/query/index.js +8 -0
  142. package/dist/components/ui/index.d.ts +57 -0
  143. package/dist/components/ui/index.js +37 -0
  144. package/{src/props/vocabulary/content.prop.ts → dist/content.prop-D1Dd3TAc.d.ts} +16 -20
  145. package/dist/data-display.prop-DNTAzmDy.d.ts +58 -0
  146. package/dist/data-entry.prop-BEGA1lTq.d.ts +323 -0
  147. package/dist/data-table-D1u_rKLK.d.ts +83 -0
  148. package/dist/data.prop-BVvfKC_g.d.ts +41 -0
  149. package/dist/feedback.prop-BmxUlpAW.d.ts +64 -0
  150. package/dist/filter-bar-B7OGFO9S.d.ts +10 -0
  151. package/dist/form/index.d.ts +21 -0
  152. package/dist/form/index.js +4 -0
  153. package/dist/form.prop-BHgpuFFm.d.ts +41 -0
  154. package/dist/format-date-ByyZoqI5.d.ts +51 -0
  155. package/dist/general.prop-D7brMPNL.d.ts +16 -0
  156. package/dist/i18n/index.d.ts +217 -0
  157. package/dist/i18n/index.js +2 -0
  158. package/dist/index.d.ts +53 -0
  159. package/dist/index.js +39 -0
  160. package/dist/inline-C5u6ptJV.d.ts +10 -0
  161. package/dist/interaction.prop-Cdn7wOtq.d.ts +25 -0
  162. package/{src/props/vocabulary/layout.prop.ts → dist/layout.prop-4TCNvyQZ.d.ts} +9 -14
  163. package/dist/layout.prop-C795F0qg.d.ts +112 -0
  164. package/dist/lib/datetime/index.d.ts +31 -0
  165. package/dist/lib/datetime/index.js +1 -0
  166. package/dist/lib/utils.d.ts +5 -0
  167. package/dist/lib/utils.js +1 -0
  168. package/dist/navigation.prop-DpZqcXey.d.ts +78 -0
  169. package/dist/navigation.prop-DxBiClEH.d.ts +20 -0
  170. package/dist/props/components/index.d.ts +27 -0
  171. package/dist/props/components/index.js +1 -0
  172. package/dist/props/index.d.ts +28 -0
  173. package/dist/props/index.js +3 -0
  174. package/dist/props/registry.d.ts +649 -0
  175. package/dist/props/registry.js +1 -0
  176. package/dist/props/vocabulary/index.d.ts +7 -0
  177. package/dist/props/vocabulary/index.js +1 -0
  178. package/dist/query.prop-hIPrk2zI.d.ts +71 -0
  179. package/dist/search-input-uP01rY1L.d.ts +22 -0
  180. package/dist/shared.prop-BNRJc9K0.d.ts +45 -0
  181. package/{src → dist}/styles/control.css +1 -1
  182. package/dist/types-mvzYGrma.d.ts +37 -0
  183. package/dist/use-toast-Dol5bdY3.d.ts +34 -0
  184. package/package.json +234 -68
  185. package/src/app/__tests__/app-provider.test.tsx +0 -232
  186. package/src/app/__tests__/date-format-labels.test.ts +0 -36
  187. package/src/app/__tests__/date-formats.test.ts +0 -44
  188. package/src/app/__tests__/timezones.test.ts +0 -65
  189. package/src/app/app-provider.tsx +0 -227
  190. package/src/app/date-format-labels.ts +0 -21
  191. package/src/app/date-formats.ts +0 -30
  192. package/src/app/index.ts +0 -40
  193. package/src/app/locales.ts +0 -32
  194. package/src/app/request-headers.ts +0 -31
  195. package/src/app/storage.ts +0 -44
  196. package/src/app/time-format-labels.ts +0 -19
  197. package/src/app/time-formats.ts +0 -15
  198. package/src/app/timezones.ts +0 -208
  199. package/src/app/types.ts +0 -39
  200. package/src/app/use-formatting.ts +0 -47
  201. package/src/components/__tests__/accessibility-primitives.test.tsx +0 -65
  202. package/src/components/__tests__/docs-parity.test.ts +0 -41
  203. package/src/components/__tests__/shadcn-release-guardrails.test.ts +0 -71
  204. package/src/components/__tests__/theme-axes-integration.test.tsx +0 -242
  205. package/src/components/admin/index.ts +0 -76
  206. package/src/components/data-display/__tests__/card-table.test.tsx +0 -328
  207. package/src/components/data-display/__tests__/data-display.test.tsx +0 -73
  208. package/src/components/data-display/__tests__/data-table.test.tsx +0 -84
  209. package/src/components/data-display/__tests__/popover.test.tsx +0 -92
  210. package/src/components/data-display/__tests__/scroll-area-collapsible.test.tsx +0 -66
  211. package/src/components/data-display/badge.tsx +0 -27
  212. package/src/components/data-display/card.tsx +0 -194
  213. package/src/components/data-display/code-badge.tsx +0 -28
  214. package/src/components/data-display/collapsible.tsx +0 -5
  215. package/src/components/data-display/data-table.tsx +0 -476
  216. package/src/components/data-display/empty-state.tsx +0 -22
  217. package/src/components/data-display/index.ts +0 -41
  218. package/src/components/data-display/key-value-grid.tsx +0 -46
  219. package/src/components/data-display/popover.tsx +0 -62
  220. package/src/components/data-display/progress-meter.tsx +0 -20
  221. package/src/components/data-display/scan-panel.tsx +0 -16
  222. package/src/components/data-display/scroll-area.tsx +0 -42
  223. package/src/components/data-display/status-badge.tsx +0 -83
  224. package/src/components/data-display/table.tsx +0 -59
  225. package/src/components/data-display/timeline.tsx +0 -42
  226. package/src/components/data-display/tree-list.tsx +0 -42
  227. package/src/components/data-entry/__fixtures__/tree-options.ts +0 -80
  228. package/src/components/data-entry/__tests__/cascader-tree-transfer.test.tsx +0 -417
  229. package/src/components/data-entry/__tests__/checkbox-group.test.tsx +0 -40
  230. package/src/components/data-entry/__tests__/checkbox.test.tsx +0 -20
  231. package/src/components/data-entry/__tests__/date-autocomplete.test.tsx +0 -94
  232. package/src/components/data-entry/__tests__/form-field.test.tsx +0 -49
  233. package/src/components/data-entry/__tests__/input-textarea.test.tsx +0 -38
  234. package/src/components/data-entry/__tests__/label-select.test.tsx +0 -62
  235. package/src/components/data-entry/__tests__/pickers.test.tsx +0 -74
  236. package/src/components/data-entry/__tests__/radio.test.tsx +0 -46
  237. package/src/components/data-entry/__tests__/search-input.test.tsx +0 -32
  238. package/src/components/data-entry/__tests__/switch-field.test.tsx +0 -52
  239. package/src/components/data-entry/__tests__/upload.test.tsx +0 -125
  240. package/src/components/data-entry/autocomplete.tsx +0 -91
  241. package/src/components/data-entry/cascader.tsx +0 -305
  242. package/src/components/data-entry/checkbox-group.tsx +0 -90
  243. package/src/components/data-entry/checkbox.tsx +0 -30
  244. package/src/components/data-entry/choice-field.tsx +0 -27
  245. package/src/components/data-entry/choice-option.ts +0 -20
  246. package/src/components/data-entry/color-picker.tsx +0 -75
  247. package/src/components/data-entry/command.tsx +0 -56
  248. package/src/components/data-entry/country-select.tsx +0 -88
  249. package/src/components/data-entry/date-picker.tsx +0 -69
  250. package/src/components/data-entry/date-range-picker.tsx +0 -75
  251. package/src/components/data-entry/form-field.tsx +0 -59
  252. package/src/components/data-entry/index.ts +0 -62
  253. package/src/components/data-entry/label.tsx +0 -25
  254. package/src/components/data-entry/radio.tsx +0 -109
  255. package/src/components/data-entry/search-input.tsx +0 -103
  256. package/src/components/data-entry/select.tsx +0 -149
  257. package/src/components/data-entry/slider.tsx +0 -38
  258. package/src/components/data-entry/switch-field.tsx +0 -91
  259. package/src/components/data-entry/switch.tsx +0 -24
  260. package/src/components/data-entry/textarea.tsx +0 -12
  261. package/src/components/data-entry/time-picker.tsx +0 -214
  262. package/src/components/data-entry/transfer.tsx +0 -231
  263. package/src/components/data-entry/tree-select-strategy.ts +0 -6
  264. package/src/components/data-entry/tree-select.tsx +0 -279
  265. package/src/components/data-entry/tree-utils.ts +0 -221
  266. package/src/components/data-entry/upload-crop-dialog.tsx +0 -109
  267. package/src/components/data-entry/upload-types.ts +0 -86
  268. package/src/components/data-entry/upload.tsx +0 -498
  269. package/src/components/data-entry/use-upload-draft.ts +0 -93
  270. package/src/components/feedback/__tests__/alert.test.tsx +0 -127
  271. package/src/components/feedback/__tests__/dialog.test.tsx +0 -290
  272. package/src/components/feedback/__tests__/sheet.test.tsx +0 -94
  273. package/src/components/feedback/__tests__/skeleton.test.tsx +0 -25
  274. package/src/components/feedback/__tests__/toast.test.tsx +0 -52
  275. package/src/components/feedback/alert.tsx +0 -167
  276. package/src/components/feedback/dialog.tsx +0 -325
  277. package/src/components/feedback/index.ts +0 -53
  278. package/src/components/feedback/sheet.tsx +0 -130
  279. package/src/components/feedback/skeleton.tsx +0 -95
  280. package/src/components/feedback/sonner.tsx +0 -54
  281. package/src/components/feedback/toaster.tsx +0 -1
  282. package/src/components/feedback/use-toast.ts +0 -62
  283. package/src/components/general/__tests__/button.test.tsx +0 -71
  284. package/src/components/general/button.tsx +0 -61
  285. package/src/components/general/index.ts +0 -2
  286. package/src/components/layout/__tests__/page-container.test.tsx +0 -69
  287. package/src/components/layout/__tests__/page-inset.test.tsx +0 -14
  288. package/src/components/layout/__tests__/stack-inline.test.tsx +0 -39
  289. package/src/components/layout/app-shell.tsx +0 -42
  290. package/src/components/layout/breadcrumb.tsx +0 -35
  291. package/src/components/layout/index.ts +0 -31
  292. package/src/components/layout/inline.tsx +0 -13
  293. package/src/components/layout/menu.tsx +0 -34
  294. package/src/components/layout/mobile-frame.tsx +0 -57
  295. package/src/components/layout/page-container.tsx +0 -81
  296. package/src/components/layout/page-inset.tsx +0 -16
  297. package/src/components/layout/responsive-grid.tsx +0 -14
  298. package/src/components/layout/shell-app.tsx +0 -30
  299. package/src/components/layout/sidebar.tsx +0 -98
  300. package/src/components/layout/split-pane.tsx +0 -16
  301. package/src/components/layout/stack.tsx +0 -13
  302. package/src/components/layout/topbar.tsx +0 -108
  303. package/src/components/navigation/__tests__/app-pickers.test.tsx +0 -118
  304. package/src/components/navigation/__tests__/dropdown-menu.test.tsx +0 -104
  305. package/src/components/navigation/__tests__/navigation.test.tsx +0 -61
  306. package/src/components/navigation/__tests__/pagination-steps-tabs.test.tsx +0 -76
  307. package/src/components/navigation/date-format-picker.tsx +0 -55
  308. package/src/components/navigation/dropdown-menu.tsx +0 -190
  309. package/src/components/navigation/filter-bar.tsx +0 -38
  310. package/src/components/navigation/index.ts +0 -28
  311. package/src/components/navigation/locale-picker.tsx +0 -49
  312. package/src/components/navigation/page-header.tsx +0 -50
  313. package/src/components/navigation/pagination-utils.ts +0 -35
  314. package/src/components/navigation/pagination.tsx +0 -168
  315. package/src/components/navigation/steps.tsx +0 -163
  316. package/src/components/navigation/tabs-items.tsx +0 -69
  317. package/src/components/navigation/time-format-picker.tsx +0 -55
  318. package/src/components/navigation/timezone-picker.tsx +0 -63
  319. package/src/components/query/__tests__/data-state.test.tsx +0 -214
  320. package/src/components/query/__tests__/infinite-prefetch.test.tsx +0 -105
  321. package/src/components/query/__tests__/query-helpers.test.tsx +0 -61
  322. package/src/components/query/data-state.tsx +0 -58
  323. package/src/components/query/index.ts +0 -10
  324. package/src/components/query/infinite-query-state.tsx +0 -99
  325. package/src/components/query/mutation-feedback.tsx +0 -31
  326. package/src/components/query/prefetch-link.tsx +0 -45
  327. package/src/components/query/query-refetch-button.tsx +0 -41
  328. package/src/components/ui/alert-dialog.tsx +0 -1
  329. package/src/components/ui/alert.tsx +0 -1
  330. package/src/components/ui/autocomplete.tsx +0 -1
  331. package/src/components/ui/badge.tsx +0 -1
  332. package/src/components/ui/button.tsx +0 -1
  333. package/src/components/ui/calendar.tsx +0 -1
  334. package/src/components/ui/card.tsx +0 -1
  335. package/src/components/ui/checkbox.tsx +0 -1
  336. package/src/components/ui/color-picker.tsx +0 -1
  337. package/src/components/ui/command.tsx +0 -1
  338. package/src/components/ui/date-picker.tsx +0 -1
  339. package/src/components/ui/date-range-picker.tsx +0 -1
  340. package/src/components/ui/dialog.tsx +0 -1
  341. package/src/components/ui/dropdown-menu.tsx +0 -1
  342. package/src/components/ui/index.tsx +0 -31
  343. package/src/components/ui/input.tsx +0 -1
  344. package/src/components/ui/label.tsx +0 -1
  345. package/src/components/ui/pagination.tsx +0 -1
  346. package/src/components/ui/popover.tsx +0 -1
  347. package/src/components/ui/radio.tsx +0 -1
  348. package/src/components/ui/scroll-area.tsx +0 -1
  349. package/src/components/ui/select.tsx +0 -1
  350. package/src/components/ui/sheet.tsx +0 -1
  351. package/src/components/ui/slider.tsx +0 -1
  352. package/src/components/ui/sonner.tsx +0 -1
  353. package/src/components/ui/switch.tsx +0 -1
  354. package/src/components/ui/table.tsx +0 -1
  355. package/src/components/ui/tabs-items.tsx +0 -1
  356. package/src/components/ui/tabs.tsx +0 -1
  357. package/src/components/ui/textarea.tsx +0 -1
  358. package/src/components/ui/time-picker.tsx +0 -1
  359. package/src/components/ui/upload.tsx +0 -1
  360. package/src/form/__tests__/use-zod-form.test.tsx +0 -97
  361. package/src/form/form-field-control.tsx +0 -44
  362. package/src/form/form-root.tsx +0 -29
  363. package/src/form/index.ts +0 -7
  364. package/src/form/use-zod-form.ts +0 -29
  365. package/src/i18n/__tests__/translate.test.ts +0 -23
  366. package/src/i18n/index.ts +0 -9
  367. package/src/i18n/messages/en.json +0 -171
  368. package/src/i18n/messages/ja.json +0 -171
  369. package/src/i18n/messages/vi.json +0 -171
  370. package/src/i18n/translate.ts +0 -74
  371. package/src/i18n/use-translation.ts +0 -53
  372. package/src/index.ts +0 -3
  373. package/src/lib/__tests__/control-styles.test.ts +0 -78
  374. package/src/lib/__tests__/datetime.test.ts +0 -77
  375. package/src/lib/__tests__/format-date.test.ts +0 -97
  376. package/src/lib/__tests__/format.test.ts +0 -62
  377. package/src/lib/__tests__/theme-tokens-audit.test.ts +0 -176
  378. package/src/lib/__tests__/theme-tokens-css.test.ts +0 -118
  379. package/src/lib/__tests__/token-governance.test.ts +0 -191
  380. package/src/lib/__tests__/variants.test.ts +0 -18
  381. package/src/lib/control-styles.ts +0 -33
  382. package/src/lib/datetime/detect.ts +0 -25
  383. package/src/lib/datetime/format-date.ts +0 -100
  384. package/src/lib/datetime/format.ts +0 -140
  385. package/src/lib/datetime/index.ts +0 -25
  386. package/src/lib/datetime/parse.ts +0 -51
  387. package/src/lib/datetime/sync.ts +0 -48
  388. package/src/lib/format.ts +0 -114
  389. package/src/lib/hooks.ts +0 -54
  390. package/src/lib/utils.ts +0 -6
  391. package/src/lib/variants.ts +0 -40
  392. package/src/props/components/app.prop.ts +0 -99
  393. package/src/props/components/data-display.prop.ts +0 -73
  394. package/src/props/components/data-entry.prop.ts +0 -334
  395. package/src/props/components/feedback.prop.ts +0 -80
  396. package/src/props/components/form.prop.ts +0 -46
  397. package/src/props/components/general.prop.ts +0 -18
  398. package/src/props/components/index.ts +0 -99
  399. package/src/props/components/layout.prop.ts +0 -130
  400. package/src/props/components/navigation.prop.ts +0 -88
  401. package/src/props/components/query.prop.ts +0 -94
  402. package/src/props/index.ts +0 -17
  403. package/src/props/vocabulary/data.prop.ts +0 -46
  404. package/src/props/vocabulary/index.ts +0 -73
  405. package/src/props/vocabulary/interaction.prop.ts +0 -42
  406. package/src/props/vocabulary/navigation.prop.ts +0 -19
  407. package/src/props/vocabulary/shared.prop.ts +0 -59
  408. package/src/test/__tests__/render-loop-guard.test.tsx +0 -38
  409. package/src/test/jest-dom.d.ts +0 -4
  410. package/src/test/render-loop-guard.tsx +0 -50
  411. package/src/test/render.tsx +0 -29
  412. package/src/test/theme-globals.test.ts +0 -77
  413. package/src/test/theme-globals.ts +0 -134
  414. package/src/test/theme-test-utils.tsx +0 -67
  415. /package/{src → dist}/styles/alert-layout.css +0 -0
  416. /package/{src → dist}/styles/badge-layout.css +0 -0
  417. /package/{src → dist}/styles/card-layout.css +0 -0
  418. /package/{src → dist}/styles/data-display-layout.css +0 -0
  419. /package/{src → dist}/styles/density.css +0 -0
  420. /package/{src → dist}/styles/dialog-layout.css +0 -0
  421. /package/{src → dist}/styles/index.css +0 -0
  422. /package/{src → dist}/styles/layout.css +0 -0
  423. /package/{src → dist}/styles/shell-layout.css +0 -0
  424. /package/{src → dist}/styles/table-layout.css +0 -0
  425. /package/{src → dist}/theme/example.service.css +0 -0
  426. /package/{src → dist}/tokens/base.css +0 -0
  427. /package/{src → dist}/tokens/foundation.css +0 -0
  428. /package/{src → dist}/tokens/primitives/badge.css +0 -0
  429. /package/{src → dist}/tokens/primitives/card.css +0 -0
  430. /package/{src → dist}/tokens/primitives/control.css +0 -0
  431. /package/{src → dist}/tokens/primitives/feedback.css +0 -0
  432. /package/{src → dist}/tokens/primitives/layout.css +0 -0
  433. /package/{src → dist}/tokens/primitives/navigation.css +0 -0
  434. /package/{src → dist}/tokens/primitives/table.css +0 -0
@@ -1,95 +0,0 @@
1
- // Skeleton family — shaped placeholders for loading states. Always pick the
2
- // shape closest to the final layout; spinner-overlay is forbidden.
3
- import * as React from "react";
4
-
5
- import { cn } from "../../lib/utils";
6
- import { tableCellPaddingClass, tableRowHeightClass } from "../../lib/control-styles";
7
-
8
- function SkeletonBlock({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
9
- return (
10
- <div
11
- aria-busy="true"
12
- aria-live="polite"
13
- className={cn("ui-skeleton-block", className)}
14
- {...props}
15
- />
16
- );
17
- }
18
-
19
- interface SkeletonRowsProps {
20
- rows?: number;
21
- columns?: number;
22
- className?: string;
23
- }
24
-
25
- /** Skeleton for a flat list of rows (use inside a Card or section). */
26
- export function SkeletonRows({ rows = 6, columns = 4, className }: SkeletonRowsProps) {
27
- return (
28
- <div className={cn("ui-skeleton-rows", className)} aria-busy="true">
29
- {Array.from({ length: rows }).map((_, i) => (
30
- <div key={i} className="ui-skeleton-row">
31
- {Array.from({ length: columns }).map((_, j) => (
32
- <SkeletonBlock
33
- key={j}
34
- className={cn("h-4", j === 0 ? "w-1/4" : j === columns - 1 ? "w-1/6" : "flex-1")}
35
- />
36
- ))}
37
- </div>
38
- ))}
39
- </div>
40
- );
41
- }
42
-
43
- /** Skeleton matching the DataTable layout — header row + N body rows. */
44
- export function SkeletonTable({ rows = 8, columns = 5 }: SkeletonRowsProps) {
45
- return (
46
- <div className="ui-skeleton-table" aria-busy="true">
47
- <div className={cn("ui-skeleton-table-head", tableCellPaddingClass, tableRowHeightClass)}>
48
- {Array.from({ length: columns }).map((_, j) => (
49
- <SkeletonBlock key={j} className={cn("h-3", j === 0 ? "w-1/5" : "flex-1")} />
50
- ))}
51
- </div>
52
- <div className="ui-skeleton-table-body">
53
- {Array.from({ length: rows }).map((_, i) => (
54
- <div
55
- key={i}
56
- className={cn("ui-skeleton-table-row", tableCellPaddingClass, tableRowHeightClass)}
57
- >
58
- {Array.from({ length: columns }).map((_, j) => (
59
- <SkeletonBlock key={j} className={cn("h-4", j === 0 ? "w-1/5" : "flex-1")} />
60
- ))}
61
- </div>
62
- ))}
63
- </div>
64
- </div>
65
- );
66
- }
67
-
68
- /** Skeleton matching a Card detail layout — title + 6 metadata rows. */
69
- export function SkeletonDetail() {
70
- return (
71
- <div className="ui-skeleton-detail ui-skeleton-detail-stack" aria-busy="true">
72
- <SkeletonBlock className="h-7 w-1/3" />
73
- <SkeletonBlock className="h-4 w-1/2" />
74
- <div className="ui-skeleton-detail-box ui-skeleton-detail-stack">
75
- {Array.from({ length: 6 }).map((_, i) => (
76
- <div key={i} className="ui-skeleton-detail-stack">
77
- <SkeletonBlock className="h-3 w-24" />
78
- <SkeletonBlock className="h-4 w-full max-w-md" />
79
- </div>
80
- ))}
81
- </div>
82
- </div>
83
- );
84
- }
85
-
86
- /** Skeleton matching a stat card / dashboard tile. */
87
- export function SkeletonCard() {
88
- return (
89
- <div className="ui-skeleton-card" aria-busy="true">
90
- <SkeletonBlock className="h-3 w-24" />
91
- <SkeletonBlock className="h-[length:var(--control-height)] w-32" />
92
- <SkeletonBlock className="h-3 w-20" />
93
- </div>
94
- );
95
- }
@@ -1,54 +0,0 @@
1
- // shadcn/ui Sonner — recommended toast (replaces deprecated Radix Toast).
2
- // @see https://ui.shadcn.com/docs/components/sonner
3
- import * as React from "react";
4
- import { CheckCircle2, Info, Loader2, OctagonX, TriangleAlert } from "lucide-react";
5
- import { Toaster as Sonner, type ToasterProps } from "sonner";
6
-
7
- function useDocumentTheme(): ToasterProps["theme"] {
8
- return React.useSyncExternalStore(
9
- (onStoreChange) => {
10
- if (typeof document === "undefined") return () => undefined;
11
- const mq = window.matchMedia("(prefers-color-scheme: dark)");
12
- mq.addEventListener("change", onStoreChange);
13
- const obs = new MutationObserver(onStoreChange);
14
- obs.observe(document.documentElement, { attributes: true, attributeFilter: ["class"] });
15
- return () => {
16
- mq.removeEventListener("change", onStoreChange);
17
- obs.disconnect();
18
- };
19
- },
20
- () => (document.documentElement.classList.contains("dark") ? "dark" : "light"),
21
- () => "light",
22
- );
23
- }
24
-
25
- function Toaster({ ...props }: ToasterProps) {
26
- const theme = useDocumentTheme();
27
-
28
- return (
29
- <Sonner
30
- theme={theme}
31
- className="toaster group"
32
- icons={{
33
- success: <CheckCircle2 className="size-4" aria-hidden="true" />,
34
- info: <Info className="size-4" aria-hidden="true" />,
35
- warning: <TriangleAlert className="size-4" aria-hidden="true" />,
36
- error: <OctagonX className="size-4" aria-hidden="true" />,
37
- loading: <Loader2 className="size-4 animate-spin" aria-hidden="true" />,
38
- }}
39
- style={
40
- {
41
- "--normal-bg": "var(--popover)",
42
- "--normal-text": "var(--popover-foreground)",
43
- "--normal-border": "var(--border)",
44
- "--border-radius": "var(--radius)",
45
- } as React.CSSProperties
46
- }
47
- position="bottom-right"
48
- mobileOffset={{ bottom: "16px", right: "16px" }}
49
- {...props}
50
- />
51
- );
52
- }
53
-
54
- export { Toaster };
@@ -1 +0,0 @@
1
- export { Toaster } from "./sonner";
@@ -1,62 +0,0 @@
1
- // Toast API — Sonner (shadcn recommended).
2
- //
3
- // `toast("msg")` / `toast.success("msg")` — Sonner native API (preferred).
4
- // `toast({ title, description, variant })` — legacy admin compat.
5
- import type * as React from "react";
6
- import { toast as sonnerToast, type ExternalToast } from "sonner";
7
-
8
- export type { ExternalToast } from "sonner";
9
- export { sonnerToast };
10
-
11
- export type LegacyToastOptions = ExternalToast & {
12
- title?: React.ReactNode;
13
- description?: React.ReactNode;
14
- variant?: "default" | "destructive" | "success";
15
- };
16
-
17
- function nodeText(value: React.ReactNode): string {
18
- if (value == null) return "";
19
- if (typeof value === "string") return value;
20
- if (typeof value === "number" || typeof value === "boolean") return String(value);
21
- return "";
22
- }
23
-
24
- function legacyToast(options: LegacyToastOptions) {
25
- const { title, description, variant, ...rest } = options;
26
- const titleText = nodeText(title);
27
- const descText = nodeText(description);
28
- const message = titleText || descText;
29
- const desc = titleText && descText ? descText : undefined;
30
- const sonnerOptions: ExternalToast = { ...rest, description: desc };
31
-
32
- switch (variant) {
33
- case "destructive":
34
- return sonnerToast.error(message, sonnerOptions);
35
- case "success":
36
- return sonnerToast.success(message, sonnerOptions);
37
- default:
38
- return sonnerToast(message, sonnerOptions);
39
- }
40
- }
41
-
42
- type ToastFn = typeof sonnerToast &
43
- ((options: LegacyToastOptions) => ReturnType<typeof sonnerToast>);
44
-
45
- /** Sonner toast + legacy `{ title, variant }` object form. */
46
- const toast = Object.assign((messageOrOptions: string | LegacyToastOptions) => {
47
- if (typeof messageOrOptions === "string") {
48
- return sonnerToast(messageOrOptions);
49
- }
50
- return legacyToast(messageOrOptions);
51
- }, sonnerToast) as ToastFn;
52
-
53
- /** Legacy hook — prefer `toast` import directly; kept for existing admin pages. */
54
- function useToast() {
55
- return {
56
- toast: (options: LegacyToastOptions) => legacyToast(options),
57
- dismiss: sonnerToast.dismiss,
58
- toasts: [] as const,
59
- };
60
- }
61
-
62
- export { toast, legacyToast, useToast };
@@ -1,71 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { renderWithUi, screen, userEvent } from "@/test/render";
3
- import { Button } from "../button";
4
-
5
- describe("Button", () => {
6
- it("renders children and default type=submit implicit button", () => {
7
- renderWithUi(<Button>Click me</Button>);
8
- const btn = screen.getByRole("button", { name: "Click me" });
9
- expect(btn).toBeInTheDocument();
10
- expect(btn.tagName).toBe("BUTTON");
11
- });
12
-
13
- it("calls onClick when clicked", async () => {
14
- const user = userEvent.setup();
15
- const onClick = vi.fn();
16
- renderWithUi(<Button onClick={onClick}>Go</Button>);
17
- await user.click(screen.getByRole("button", { name: "Go" }));
18
- expect(onClick).toHaveBeenCalledOnce();
19
- });
20
-
21
- it("does not fire onClick when disabled", async () => {
22
- const user = userEvent.setup();
23
- const onClick = vi.fn();
24
- renderWithUi(
25
- <Button disabled onClick={onClick}>
26
- Blocked
27
- </Button>,
28
- );
29
- await user.click(screen.getByRole("button", { name: "Blocked" }));
30
- expect(onClick).not.toHaveBeenCalled();
31
- });
32
-
33
- it.each(["destructive", "outline", "secondary", "ghost", "link"] as const)(
34
- "renders variant=%s",
35
- (variant) => {
36
- renderWithUi(<Button variant={variant}>V</Button>);
37
- expect(screen.getByRole("button", { name: "V" })).toBeInTheDocument();
38
- },
39
- );
40
-
41
- it.each(["xs", "sm", "lg", "icon", "icon-xs", "icon-sm", "icon-lg"] as const)(
42
- "renders size=%s",
43
- (size) => {
44
- renderWithUi(<Button size={size}>S</Button>);
45
- expect(screen.getByRole("button", { name: "S" })).toBeInTheDocument();
46
- },
47
- );
48
-
49
- it("exposes shadcn data-slot and state attributes", () => {
50
- renderWithUi(
51
- <Button variant="outline" size="sm" aria-invalid>
52
- State
53
- </Button>,
54
- );
55
- const btn = screen.getByRole("button", { name: "State" });
56
- expect(btn).toHaveAttribute("data-slot", "button");
57
- expect(btn).toHaveAttribute("data-variant", "outline");
58
- expect(btn).toHaveAttribute("data-size", "sm");
59
- expect(btn).toHaveClass("aria-invalid:border-destructive");
60
- });
61
-
62
- it("default size applies ui-button size token binding", () => {
63
- renderWithUi(<Button>Density</Button>);
64
- expect(screen.getByRole("button", { name: "Density" })).toHaveClass("ui-button--default-size");
65
- });
66
-
67
- it("default variant uses semantic button token class", () => {
68
- renderWithUi(<Button>Primary</Button>);
69
- expect(screen.getByRole("button", { name: "Primary" })).toHaveClass("ui-button--default");
70
- });
71
- });
@@ -1,61 +0,0 @@
1
- import * as React from "react";
2
- import { Slot } from "@radix-ui/react-slot";
3
- import { cva } from "class-variance-authority";
4
- import { cn } from "../../lib/utils";
5
- import type { ButtonProp } from "../../props/components/general.prop";
6
-
7
- const buttonVariants = cva("ui-button", {
8
- variants: {
9
- variant: {
10
- default: "ui-button--default bg-primary text-primary-foreground hover:bg-primary/90",
11
- destructive:
12
- "ui-button--destructive bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20",
13
- outline:
14
- "ui-button--outline border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground",
15
- secondary:
16
- "ui-button--secondary bg-secondary text-secondary-foreground hover:bg-secondary/80",
17
- ghost: "ui-button--ghost hover:bg-accent hover:text-accent-foreground",
18
- link: "ui-button--link text-primary underline-offset-4 hover:underline",
19
- },
20
- size: {
21
- default: "ui-button--default-size py-2 has-[>svg]:px-3",
22
- xs: "h-[calc(var(--control-height)-0.75rem)] gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
23
- sm: "ui-button--sm gap-1.5 rounded-md has-[>svg]:px-2.5",
24
- lg: "ui-button--lg rounded-md has-[>svg]:px-4",
25
- icon: "ui-button--icon",
26
- "icon-xs":
27
- "size-[calc(var(--control-height)-0.75rem)] rounded-md [&_svg:not([class*='size-'])]:size-3",
28
- "icon-sm": "size-[calc(var(--control-height)-0.5rem)]",
29
- "icon-lg": "size-[calc(var(--control-height)+0.25rem)]",
30
- },
31
- },
32
- defaultVariants: { variant: "default", size: "default" },
33
- });
34
-
35
- export type { ButtonProp, ButtonProp as ButtonProps } from "../../props/components/general.prop";
36
-
37
- export const Button = React.forwardRef<HTMLButtonElement, ButtonProp>(
38
- ({ className, variant, size, asChild = false, ...props }, ref) => {
39
- const Comp = asChild ? Slot : "button";
40
- return (
41
- <Comp
42
- data-slot="button"
43
- data-variant={variant ?? "default"}
44
- data-size={size ?? "default"}
45
- className={cn(
46
- "inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none",
47
- "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
48
- "disabled:pointer-events-none disabled:opacity-50",
49
- "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
50
- "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
51
- buttonVariants({ variant, size, className }),
52
- )}
53
- ref={ref}
54
- {...props}
55
- />
56
- );
57
- },
58
- );
59
- Button.displayName = "Button";
60
-
61
- export { buttonVariants };
@@ -1,2 +0,0 @@
1
- export { Button, buttonVariants } from "./button";
2
- export type { ButtonProps } from "./button";
@@ -1,69 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { renderWithUi, screen } from "@/test/render";
3
- import { PageContainer } from "../page-container";
4
- import { Button } from "../../general/button";
5
-
6
- describe("PageContainer", () => {
7
- it("renders title as h1", () => {
8
- renderWithUi(<PageContainer title="Customers" />);
9
- expect(screen.getByRole("heading", { level: 1, name: "Customers" })).toBeInTheDocument();
10
- });
11
-
12
- it("renders subtitle when provided", () => {
13
- renderWithUi(<PageContainer title="Customers" subtitle="CRM list" />);
14
- expect(screen.getByText("CRM list")).toHaveClass("ui-page-subtitle");
15
- });
16
-
17
- it("renders extra slot in header row", () => {
18
- renderWithUi(<PageContainer title="Customers" extra={<Button>Create</Button>} />);
19
- expect(screen.getByRole("button", { name: "Create" })).toBeInTheDocument();
20
- });
21
-
22
- it("renders footer slot", () => {
23
- renderWithUi(<PageContainer title="Edit" footer={<Button>Save</Button>} />);
24
- expect(screen.getByRole("contentinfo")).toContainElement(
25
- screen.getByRole("button", { name: "Save" }),
26
- );
27
- });
28
-
29
- it("renders breadcrumb trail with links", () => {
30
- renderWithUi(
31
- <PageContainer
32
- title="Detail"
33
- breadcrumb={[
34
- { label: "CRM", to: "/crm" },
35
- { label: "Customers", to: "/crm/customers" },
36
- { label: "Detail" },
37
- ]}
38
- />,
39
- );
40
- const nav = screen.getByRole("navigation", { name: "Breadcrumb" });
41
- expect(nav).toBeInTheDocument();
42
- expect(screen.getByRole("link", { name: "CRM" })).toHaveAttribute("href", "/crm");
43
- expect(nav).toHaveTextContent("Detail");
44
- });
45
-
46
- it("applies density class on root", () => {
47
- const { container } = renderWithUi(<PageContainer title="Compact" density="compact" />);
48
- expect(container.firstChild).toHaveClass("ui-density-compact");
49
- });
50
-
51
- it("applies variant modifier class", () => {
52
- const { container } = renderWithUi(<PageContainer title="List" variant="flush" />);
53
- expect(container.firstChild).toHaveClass("ui-page-container--flush");
54
- });
55
-
56
- it("applies sticky footer modifier when enabled", () => {
57
- const { container } = renderWithUi(<PageContainer title="Form" stickyFooter />);
58
- expect(container.firstChild).toHaveClass("ui-page-container--sticky-footer");
59
- });
60
-
61
- it("renders children in page body", () => {
62
- renderWithUi(
63
- <PageContainer title="Page">
64
- <p>Body content</p>
65
- </PageContainer>,
66
- );
67
- expect(screen.getByText("Body content")).toBeInTheDocument();
68
- });
69
- });
@@ -1,14 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { renderWithUi, screen } from "@/test/render";
3
- import { PageInset } from "../page-inset";
4
-
5
- describe("PageInset", () => {
6
- it("renders children with inset class", () => {
7
- renderWithUi(
8
- <PageInset>
9
- <p>Filter zone</p>
10
- </PageInset>,
11
- );
12
- expect(screen.getByText("Filter zone").parentElement).toHaveClass("ui-page-inset");
13
- });
14
- });
@@ -1,39 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { renderWithUi } from "@/test/render";
3
- import { Stack } from "../stack";
4
- import { Inline } from "../inline";
5
-
6
- describe("Stack", () => {
7
- it.each([
8
- ["xs", "ui-stack-xs"],
9
- ["sm", "ui-stack-sm"],
10
- ["md", "ui-stack-md"],
11
- ["lg", "ui-stack-lg"],
12
- ["xl", "ui-stack-xl"],
13
- ] as const)("applies gap=%s → %s", (gap, cls) => {
14
- const { container } = renderWithUi(
15
- <Stack gap={gap}>
16
- <span>a</span>
17
- <span>b</span>
18
- </Stack>,
19
- );
20
- expect(container.firstChild).toHaveClass(cls);
21
- });
22
- });
23
-
24
- describe("Inline", () => {
25
- it.each([
26
- ["xs", "ui-inline-xs"],
27
- ["sm", "ui-inline-sm"],
28
- ["md", "ui-inline-md"],
29
- ["lg", "ui-inline-lg"],
30
- ] as const)("applies gap=%s → %s", (gap, cls) => {
31
- const { container } = renderWithUi(
32
- <Inline gap={gap}>
33
- <span>a</span>
34
- <span>b</span>
35
- </Inline>,
36
- );
37
- expect(container.firstChild).toHaveClass(cls);
38
- });
39
- });
@@ -1,42 +0,0 @@
1
- import type { AppShellProp } from "../../props/components/layout.prop";
2
-
3
- export type {
4
- AppShellProp,
5
- AppShellProp as AppShellProps,
6
- } from "../../props/components/layout.prop";
7
-
8
- export function AppShell({
9
- sidebar,
10
- topbar,
11
- topbarLeft,
12
- topbarRight,
13
- logo,
14
- breadcrumb,
15
- footer,
16
- children,
17
- sidebarCollapsed = false,
18
- }: AppShellProp) {
19
- const resolvedTopbar =
20
- topbar !== undefined ? (
21
- topbar
22
- ) : (
23
- <div className="app-topbar-rail">
24
- {logo !== undefined && <div className="app-topbar-logo">{logo}</div>}
25
- {topbarLeft !== undefined && <div className="app-topbar-left">{topbarLeft}</div>}
26
- <div className="app-topbar-spacer" />
27
- {topbarRight !== undefined && <div className="app-topbar-right">{topbarRight}</div>}
28
- </div>
29
- );
30
-
31
- return (
32
- <div className="app-root" data-collapsed={sidebarCollapsed ? "true" : undefined}>
33
- <aside className="app-sidebar">{sidebar}</aside>
34
- <header className="app-topbar">{resolvedTopbar}</header>
35
- <main className="app-main">
36
- {breadcrumb !== undefined && <div className="app-breadcrumb">{breadcrumb}</div>}
37
- {children}
38
- </main>
39
- {footer !== undefined && <footer className="app-footer">{footer}</footer>}
40
- </div>
41
- );
42
- }
@@ -1,35 +0,0 @@
1
- import { ChevronRight } from "lucide-react";
2
- import { Link } from "react-router-dom";
3
-
4
- import type { BreadcrumbProp } from "../../props/vocabulary/navigation.prop";
5
-
6
- export type BreadcrumbProps = {
7
- items: BreadcrumbProp;
8
- };
9
-
10
- export function Breadcrumb({ items }: BreadcrumbProps) {
11
- return (
12
- <nav aria-label="Breadcrumb" className="ui-breadcrumb">
13
- <ol className="ui-breadcrumb-list">
14
- {items.map((item, index) => {
15
- const isLast = index === items.length - 1;
16
-
17
- return (
18
- <li key={item.to ?? index} className="ui-breadcrumb-item">
19
- {item.to && !isLast ? (
20
- <Link to={item.to} className="ui-breadcrumb-link">
21
- {item.label}
22
- </Link>
23
- ) : (
24
- <span className="ui-breadcrumb-current" aria-current={isLast ? "page" : undefined}>
25
- {item.label}
26
- </span>
27
- )}
28
- {!isLast ? <ChevronRight aria-hidden="true" /> : null}
29
- </li>
30
- );
31
- })}
32
- </ol>
33
- </nav>
34
- );
35
- }
@@ -1,31 +0,0 @@
1
- export { PageContainer } from "./page-container";
2
- export type {
3
- PageContainerProp,
4
- PageContainerProps,
5
- BreadcrumbItem,
6
- BreadcrumbItemProp,
7
- } from "./page-container";
8
- export { PageInset } from "./page-inset";
9
- export type { PageInsetProp, PageInsetProps } from "./page-inset";
10
- export { Stack } from "./stack";
11
- export type { StackProp, StackProps } from "./stack";
12
- export { Inline } from "./inline";
13
- export type { InlineProp, InlineProps } from "./inline";
14
- export { AppShell } from "./app-shell";
15
- export type { AppShellProps } from "./app-shell";
16
- export { ShellApp } from "./shell-app";
17
- export type { ShellAppProps } from "./shell-app";
18
- export { Menu } from "./menu";
19
- export type { MenuItem, MenuProps, MenuSection } from "./menu";
20
- export { Breadcrumb } from "./breadcrumb";
21
- export type { BreadcrumbProps } from "./breadcrumb";
22
- export { Sidebar } from "./sidebar";
23
- export type { SidebarItem, SidebarProduct, SidebarProps, SidebarSection } from "./sidebar";
24
- export { Topbar } from "./topbar";
25
- export type { TopbarProduct, TopbarProject, TopbarProps } from "./topbar";
26
- export { ResponsiveGrid } from "./responsive-grid";
27
- export type { ResponsiveGridProps } from "./responsive-grid";
28
- export { SplitPane } from "./split-pane";
29
- export type { SplitPaneProps } from "./split-pane";
30
- export { MobileFrame } from "./mobile-frame";
31
- export type { MobileFrameNavItem, MobileFrameProps } from "./mobile-frame";
@@ -1,13 +0,0 @@
1
- import { cn } from "../../lib/utils";
2
- import { inlineGapClass } from "../../lib/variants";
3
- import type { InlineProp } from "../../props/components/layout.prop";
4
-
5
- export type { InlineProp, InlineProp as InlineProps } from "../../props/components/layout.prop";
6
-
7
- export function Inline({ gap = "sm", className, children, ...props }: InlineProp) {
8
- return (
9
- <div className={cn(inlineGapClass[gap], className)} {...props}>
10
- {children}
11
- </div>
12
- );
13
- }
@@ -1,34 +0,0 @@
1
- import type { SidebarItem, SidebarSection } from "./sidebar";
2
- import { Sidebar } from "./sidebar";
3
-
4
- export type MenuItem = SidebarItem & {
5
- active?: boolean;
6
- };
7
-
8
- export type MenuSection = {
9
- label?: string;
10
- items: MenuItem[];
11
- };
12
-
13
- export type MenuProps = {
14
- items: MenuSection[];
15
- };
16
-
17
- export function Menu({ items }: MenuProps) {
18
- const sections: SidebarSection[] = items.map((section) => ({
19
- label: section.label,
20
- items: section.items.map(({ active: _active, ...item }) => item),
21
- }));
22
- const activeId =
23
- items.flatMap((section) => section.items).find((item) => item.active)?.id ??
24
- items[0]?.items[0]?.id ??
25
- "";
26
-
27
- return (
28
- <Sidebar
29
- activeId={activeId}
30
- sections={sections}
31
- product={{ name: "Acme Console", role: "Workspace", color: "hsl(var(--attention))" }}
32
- />
33
- );
34
- }