@godxjp/ui 6.0.0 → 6.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 (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/dist/types-mvzYGrma.d.ts +37 -0
  182. package/dist/use-toast-Dol5bdY3.d.ts +34 -0
  183. package/package.json +233 -67
  184. package/src/app/__tests__/app-provider.test.tsx +0 -232
  185. package/src/app/__tests__/date-format-labels.test.ts +0 -36
  186. package/src/app/__tests__/date-formats.test.ts +0 -44
  187. package/src/app/__tests__/timezones.test.ts +0 -65
  188. package/src/app/app-provider.tsx +0 -227
  189. package/src/app/date-format-labels.ts +0 -21
  190. package/src/app/date-formats.ts +0 -30
  191. package/src/app/index.ts +0 -40
  192. package/src/app/locales.ts +0 -32
  193. package/src/app/request-headers.ts +0 -31
  194. package/src/app/storage.ts +0 -44
  195. package/src/app/time-format-labels.ts +0 -19
  196. package/src/app/time-formats.ts +0 -15
  197. package/src/app/timezones.ts +0 -208
  198. package/src/app/types.ts +0 -39
  199. package/src/app/use-formatting.ts +0 -47
  200. package/src/components/__tests__/accessibility-primitives.test.tsx +0 -65
  201. package/src/components/__tests__/docs-parity.test.ts +0 -41
  202. package/src/components/__tests__/shadcn-release-guardrails.test.ts +0 -71
  203. package/src/components/__tests__/theme-axes-integration.test.tsx +0 -242
  204. package/src/components/admin/index.ts +0 -76
  205. package/src/components/data-display/__tests__/card-table.test.tsx +0 -328
  206. package/src/components/data-display/__tests__/data-display.test.tsx +0 -73
  207. package/src/components/data-display/__tests__/data-table.test.tsx +0 -84
  208. package/src/components/data-display/__tests__/popover.test.tsx +0 -92
  209. package/src/components/data-display/__tests__/scroll-area-collapsible.test.tsx +0 -66
  210. package/src/components/data-display/badge.tsx +0 -27
  211. package/src/components/data-display/card.tsx +0 -194
  212. package/src/components/data-display/code-badge.tsx +0 -28
  213. package/src/components/data-display/collapsible.tsx +0 -5
  214. package/src/components/data-display/data-table.tsx +0 -476
  215. package/src/components/data-display/empty-state.tsx +0 -22
  216. package/src/components/data-display/index.ts +0 -41
  217. package/src/components/data-display/key-value-grid.tsx +0 -46
  218. package/src/components/data-display/popover.tsx +0 -62
  219. package/src/components/data-display/progress-meter.tsx +0 -20
  220. package/src/components/data-display/scan-panel.tsx +0 -16
  221. package/src/components/data-display/scroll-area.tsx +0 -42
  222. package/src/components/data-display/status-badge.tsx +0 -83
  223. package/src/components/data-display/table.tsx +0 -59
  224. package/src/components/data-display/timeline.tsx +0 -42
  225. package/src/components/data-display/tree-list.tsx +0 -42
  226. package/src/components/data-entry/__fixtures__/tree-options.ts +0 -80
  227. package/src/components/data-entry/__tests__/cascader-tree-transfer.test.tsx +0 -417
  228. package/src/components/data-entry/__tests__/checkbox-group.test.tsx +0 -40
  229. package/src/components/data-entry/__tests__/checkbox.test.tsx +0 -20
  230. package/src/components/data-entry/__tests__/date-autocomplete.test.tsx +0 -94
  231. package/src/components/data-entry/__tests__/form-field.test.tsx +0 -49
  232. package/src/components/data-entry/__tests__/input-textarea.test.tsx +0 -38
  233. package/src/components/data-entry/__tests__/label-select.test.tsx +0 -62
  234. package/src/components/data-entry/__tests__/pickers.test.tsx +0 -74
  235. package/src/components/data-entry/__tests__/radio.test.tsx +0 -46
  236. package/src/components/data-entry/__tests__/search-input.test.tsx +0 -32
  237. package/src/components/data-entry/__tests__/switch-field.test.tsx +0 -52
  238. package/src/components/data-entry/__tests__/upload.test.tsx +0 -125
  239. package/src/components/data-entry/autocomplete.tsx +0 -91
  240. package/src/components/data-entry/cascader.tsx +0 -305
  241. package/src/components/data-entry/checkbox-group.tsx +0 -90
  242. package/src/components/data-entry/checkbox.tsx +0 -30
  243. package/src/components/data-entry/choice-field.tsx +0 -27
  244. package/src/components/data-entry/choice-option.ts +0 -20
  245. package/src/components/data-entry/color-picker.tsx +0 -75
  246. package/src/components/data-entry/command.tsx +0 -56
  247. package/src/components/data-entry/country-select.tsx +0 -88
  248. package/src/components/data-entry/date-picker.tsx +0 -69
  249. package/src/components/data-entry/date-range-picker.tsx +0 -75
  250. package/src/components/data-entry/form-field.tsx +0 -59
  251. package/src/components/data-entry/index.ts +0 -62
  252. package/src/components/data-entry/label.tsx +0 -25
  253. package/src/components/data-entry/radio.tsx +0 -109
  254. package/src/components/data-entry/search-input.tsx +0 -103
  255. package/src/components/data-entry/select.tsx +0 -149
  256. package/src/components/data-entry/slider.tsx +0 -38
  257. package/src/components/data-entry/switch-field.tsx +0 -91
  258. package/src/components/data-entry/switch.tsx +0 -24
  259. package/src/components/data-entry/textarea.tsx +0 -12
  260. package/src/components/data-entry/time-picker.tsx +0 -214
  261. package/src/components/data-entry/transfer.tsx +0 -231
  262. package/src/components/data-entry/tree-select-strategy.ts +0 -6
  263. package/src/components/data-entry/tree-select.tsx +0 -279
  264. package/src/components/data-entry/tree-utils.ts +0 -221
  265. package/src/components/data-entry/upload-crop-dialog.tsx +0 -109
  266. package/src/components/data-entry/upload-types.ts +0 -86
  267. package/src/components/data-entry/upload.tsx +0 -498
  268. package/src/components/data-entry/use-upload-draft.ts +0 -93
  269. package/src/components/feedback/__tests__/alert.test.tsx +0 -127
  270. package/src/components/feedback/__tests__/dialog.test.tsx +0 -290
  271. package/src/components/feedback/__tests__/sheet.test.tsx +0 -94
  272. package/src/components/feedback/__tests__/skeleton.test.tsx +0 -25
  273. package/src/components/feedback/__tests__/toast.test.tsx +0 -52
  274. package/src/components/feedback/alert.tsx +0 -167
  275. package/src/components/feedback/dialog.tsx +0 -325
  276. package/src/components/feedback/index.ts +0 -53
  277. package/src/components/feedback/sheet.tsx +0 -130
  278. package/src/components/feedback/skeleton.tsx +0 -95
  279. package/src/components/feedback/sonner.tsx +0 -54
  280. package/src/components/feedback/toaster.tsx +0 -1
  281. package/src/components/feedback/use-toast.ts +0 -62
  282. package/src/components/general/__tests__/button.test.tsx +0 -71
  283. package/src/components/general/button.tsx +0 -61
  284. package/src/components/general/index.ts +0 -2
  285. package/src/components/layout/__tests__/page-container.test.tsx +0 -69
  286. package/src/components/layout/__tests__/page-inset.test.tsx +0 -14
  287. package/src/components/layout/__tests__/stack-inline.test.tsx +0 -39
  288. package/src/components/layout/app-shell.tsx +0 -42
  289. package/src/components/layout/breadcrumb.tsx +0 -35
  290. package/src/components/layout/index.ts +0 -31
  291. package/src/components/layout/inline.tsx +0 -13
  292. package/src/components/layout/menu.tsx +0 -34
  293. package/src/components/layout/mobile-frame.tsx +0 -57
  294. package/src/components/layout/page-container.tsx +0 -81
  295. package/src/components/layout/page-inset.tsx +0 -16
  296. package/src/components/layout/responsive-grid.tsx +0 -14
  297. package/src/components/layout/shell-app.tsx +0 -30
  298. package/src/components/layout/sidebar.tsx +0 -98
  299. package/src/components/layout/split-pane.tsx +0 -16
  300. package/src/components/layout/stack.tsx +0 -13
  301. package/src/components/layout/topbar.tsx +0 -108
  302. package/src/components/navigation/__tests__/app-pickers.test.tsx +0 -118
  303. package/src/components/navigation/__tests__/dropdown-menu.test.tsx +0 -104
  304. package/src/components/navigation/__tests__/navigation.test.tsx +0 -61
  305. package/src/components/navigation/__tests__/pagination-steps-tabs.test.tsx +0 -76
  306. package/src/components/navigation/date-format-picker.tsx +0 -55
  307. package/src/components/navigation/dropdown-menu.tsx +0 -190
  308. package/src/components/navigation/filter-bar.tsx +0 -38
  309. package/src/components/navigation/index.ts +0 -28
  310. package/src/components/navigation/locale-picker.tsx +0 -49
  311. package/src/components/navigation/page-header.tsx +0 -50
  312. package/src/components/navigation/pagination-utils.ts +0 -35
  313. package/src/components/navigation/pagination.tsx +0 -168
  314. package/src/components/navigation/steps.tsx +0 -163
  315. package/src/components/navigation/tabs-items.tsx +0 -69
  316. package/src/components/navigation/time-format-picker.tsx +0 -55
  317. package/src/components/navigation/timezone-picker.tsx +0 -63
  318. package/src/components/query/__tests__/data-state.test.tsx +0 -214
  319. package/src/components/query/__tests__/infinite-prefetch.test.tsx +0 -105
  320. package/src/components/query/__tests__/query-helpers.test.tsx +0 -61
  321. package/src/components/query/data-state.tsx +0 -58
  322. package/src/components/query/index.ts +0 -10
  323. package/src/components/query/infinite-query-state.tsx +0 -99
  324. package/src/components/query/mutation-feedback.tsx +0 -31
  325. package/src/components/query/prefetch-link.tsx +0 -45
  326. package/src/components/query/query-refetch-button.tsx +0 -41
  327. package/src/components/ui/alert-dialog.tsx +0 -1
  328. package/src/components/ui/alert.tsx +0 -1
  329. package/src/components/ui/autocomplete.tsx +0 -1
  330. package/src/components/ui/badge.tsx +0 -1
  331. package/src/components/ui/button.tsx +0 -1
  332. package/src/components/ui/calendar.tsx +0 -1
  333. package/src/components/ui/card.tsx +0 -1
  334. package/src/components/ui/checkbox.tsx +0 -1
  335. package/src/components/ui/color-picker.tsx +0 -1
  336. package/src/components/ui/command.tsx +0 -1
  337. package/src/components/ui/date-picker.tsx +0 -1
  338. package/src/components/ui/date-range-picker.tsx +0 -1
  339. package/src/components/ui/dialog.tsx +0 -1
  340. package/src/components/ui/dropdown-menu.tsx +0 -1
  341. package/src/components/ui/index.tsx +0 -31
  342. package/src/components/ui/input.tsx +0 -1
  343. package/src/components/ui/label.tsx +0 -1
  344. package/src/components/ui/pagination.tsx +0 -1
  345. package/src/components/ui/popover.tsx +0 -1
  346. package/src/components/ui/radio.tsx +0 -1
  347. package/src/components/ui/scroll-area.tsx +0 -1
  348. package/src/components/ui/select.tsx +0 -1
  349. package/src/components/ui/sheet.tsx +0 -1
  350. package/src/components/ui/slider.tsx +0 -1
  351. package/src/components/ui/sonner.tsx +0 -1
  352. package/src/components/ui/switch.tsx +0 -1
  353. package/src/components/ui/table.tsx +0 -1
  354. package/src/components/ui/tabs-items.tsx +0 -1
  355. package/src/components/ui/tabs.tsx +0 -1
  356. package/src/components/ui/textarea.tsx +0 -1
  357. package/src/components/ui/time-picker.tsx +0 -1
  358. package/src/components/ui/upload.tsx +0 -1
  359. package/src/form/__tests__/use-zod-form.test.tsx +0 -97
  360. package/src/form/form-field-control.tsx +0 -44
  361. package/src/form/form-root.tsx +0 -29
  362. package/src/form/index.ts +0 -7
  363. package/src/form/use-zod-form.ts +0 -29
  364. package/src/i18n/__tests__/translate.test.ts +0 -23
  365. package/src/i18n/index.ts +0 -9
  366. package/src/i18n/messages/en.json +0 -171
  367. package/src/i18n/messages/ja.json +0 -171
  368. package/src/i18n/messages/vi.json +0 -171
  369. package/src/i18n/translate.ts +0 -74
  370. package/src/i18n/use-translation.ts +0 -53
  371. package/src/index.ts +0 -3
  372. package/src/lib/__tests__/control-styles.test.ts +0 -78
  373. package/src/lib/__tests__/datetime.test.ts +0 -77
  374. package/src/lib/__tests__/format-date.test.ts +0 -97
  375. package/src/lib/__tests__/format.test.ts +0 -62
  376. package/src/lib/__tests__/theme-tokens-audit.test.ts +0 -176
  377. package/src/lib/__tests__/theme-tokens-css.test.ts +0 -118
  378. package/src/lib/__tests__/token-governance.test.ts +0 -191
  379. package/src/lib/__tests__/variants.test.ts +0 -18
  380. package/src/lib/control-styles.ts +0 -33
  381. package/src/lib/datetime/detect.ts +0 -25
  382. package/src/lib/datetime/format-date.ts +0 -100
  383. package/src/lib/datetime/format.ts +0 -140
  384. package/src/lib/datetime/index.ts +0 -25
  385. package/src/lib/datetime/parse.ts +0 -51
  386. package/src/lib/datetime/sync.ts +0 -48
  387. package/src/lib/format.ts +0 -114
  388. package/src/lib/hooks.ts +0 -54
  389. package/src/lib/utils.ts +0 -6
  390. package/src/lib/variants.ts +0 -40
  391. package/src/props/components/app.prop.ts +0 -99
  392. package/src/props/components/data-display.prop.ts +0 -73
  393. package/src/props/components/data-entry.prop.ts +0 -334
  394. package/src/props/components/feedback.prop.ts +0 -80
  395. package/src/props/components/form.prop.ts +0 -46
  396. package/src/props/components/general.prop.ts +0 -18
  397. package/src/props/components/index.ts +0 -99
  398. package/src/props/components/layout.prop.ts +0 -130
  399. package/src/props/components/navigation.prop.ts +0 -88
  400. package/src/props/components/query.prop.ts +0 -94
  401. package/src/props/index.ts +0 -17
  402. package/src/props/vocabulary/data.prop.ts +0 -46
  403. package/src/props/vocabulary/index.ts +0 -73
  404. package/src/props/vocabulary/interaction.prop.ts +0 -42
  405. package/src/props/vocabulary/navigation.prop.ts +0 -19
  406. package/src/props/vocabulary/shared.prop.ts +0 -59
  407. package/src/test/__tests__/render-loop-guard.test.tsx +0 -38
  408. package/src/test/jest-dom.d.ts +0 -4
  409. package/src/test/render-loop-guard.tsx +0 -50
  410. package/src/test/render.tsx +0 -29
  411. package/src/test/theme-globals.test.ts +0 -77
  412. package/src/test/theme-globals.ts +0 -134
  413. package/src/test/theme-test-utils.tsx +0 -67
  414. /package/{src → dist}/styles/alert-layout.css +0 -0
  415. /package/{src → dist}/styles/badge-layout.css +0 -0
  416. /package/{src → dist}/styles/card-layout.css +0 -0
  417. /package/{src → dist}/styles/control.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
- }