@godxjp/ui 5.0.2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +101 -142
  2. package/package.json +124 -128
  3. package/scripts/ui-audit.mjs +179 -0
  4. package/src/app/__tests__/app-provider.test.tsx +232 -0
  5. package/src/app/__tests__/date-format-labels.test.ts +36 -0
  6. package/src/app/__tests__/date-formats.test.ts +44 -0
  7. package/src/app/__tests__/timezones.test.ts +65 -0
  8. package/src/app/app-provider.tsx +227 -0
  9. package/src/app/date-format-labels.ts +21 -0
  10. package/src/app/date-formats.ts +30 -0
  11. package/src/app/index.ts +40 -0
  12. package/src/app/locales.ts +32 -0
  13. package/src/app/request-headers.ts +31 -0
  14. package/src/app/storage.ts +44 -0
  15. package/src/app/time-format-labels.ts +19 -0
  16. package/src/app/time-formats.ts +15 -0
  17. package/src/app/timezones.ts +208 -0
  18. package/src/app/types.ts +39 -0
  19. package/src/app/use-formatting.ts +47 -0
  20. package/src/components/__tests__/accessibility-primitives.test.tsx +65 -0
  21. package/src/components/__tests__/docs-parity.test.ts +41 -0
  22. package/src/components/__tests__/shadcn-release-guardrails.test.ts +71 -0
  23. package/src/components/__tests__/theme-axes-integration.test.tsx +242 -0
  24. package/src/components/admin/index.ts +76 -0
  25. package/src/components/data-display/__tests__/card-table.test.tsx +328 -0
  26. package/src/components/data-display/__tests__/data-display.test.tsx +73 -0
  27. package/src/components/data-display/__tests__/data-table.test.tsx +84 -0
  28. package/src/components/data-display/__tests__/popover.test.tsx +92 -0
  29. package/src/components/data-display/__tests__/scroll-area-collapsible.test.tsx +66 -0
  30. package/src/components/data-display/badge.tsx +27 -0
  31. package/src/components/data-display/card.tsx +194 -0
  32. package/src/components/data-display/code-badge.tsx +28 -0
  33. package/src/components/data-display/collapsible.tsx +5 -0
  34. package/src/components/data-display/data-table.tsx +476 -0
  35. package/src/components/data-display/empty-state.tsx +22 -0
  36. package/src/components/data-display/index.ts +41 -0
  37. package/src/components/data-display/key-value-grid.tsx +46 -0
  38. package/src/components/data-display/popover.tsx +62 -0
  39. package/src/components/data-display/progress-meter.tsx +20 -0
  40. package/src/components/data-display/scan-panel.tsx +16 -0
  41. package/src/components/data-display/scroll-area.tsx +42 -0
  42. package/src/components/data-display/status-badge.tsx +83 -0
  43. package/src/components/data-display/table.tsx +59 -0
  44. package/src/components/data-display/timeline.tsx +42 -0
  45. package/src/components/data-display/tree-list.tsx +42 -0
  46. package/src/components/data-entry/__fixtures__/tree-options.ts +80 -0
  47. package/src/components/data-entry/__tests__/cascader-tree-transfer.test.tsx +417 -0
  48. package/src/components/data-entry/__tests__/checkbox-group.test.tsx +40 -0
  49. package/src/components/data-entry/__tests__/checkbox.test.tsx +20 -0
  50. package/src/components/data-entry/__tests__/date-autocomplete.test.tsx +94 -0
  51. package/src/components/data-entry/__tests__/form-field.test.tsx +49 -0
  52. package/src/components/data-entry/__tests__/input-textarea.test.tsx +38 -0
  53. package/src/components/data-entry/__tests__/label-select.test.tsx +62 -0
  54. package/src/components/data-entry/__tests__/pickers.test.tsx +74 -0
  55. package/src/components/data-entry/__tests__/radio.test.tsx +46 -0
  56. package/src/components/data-entry/__tests__/search-input.test.tsx +32 -0
  57. package/src/components/data-entry/__tests__/switch-field.test.tsx +52 -0
  58. package/src/components/data-entry/__tests__/upload.test.tsx +125 -0
  59. package/src/components/data-entry/autocomplete.tsx +91 -0
  60. package/src/components/data-entry/calendar.tsx +90 -0
  61. package/src/components/data-entry/cascader.tsx +305 -0
  62. package/src/components/data-entry/checkbox-group.tsx +90 -0
  63. package/src/components/data-entry/checkbox.tsx +30 -0
  64. package/src/components/data-entry/choice-field.tsx +27 -0
  65. package/src/components/data-entry/choice-option.ts +20 -0
  66. package/src/components/data-entry/color-picker.tsx +75 -0
  67. package/src/components/data-entry/command.tsx +56 -0
  68. package/src/components/data-entry/country-select.tsx +88 -0
  69. package/src/components/data-entry/date-picker.tsx +69 -0
  70. package/src/components/data-entry/date-range-picker.tsx +75 -0
  71. package/src/components/data-entry/form-field.tsx +59 -0
  72. package/src/components/data-entry/index.ts +62 -0
  73. package/src/components/data-entry/input.tsx +26 -0
  74. package/src/components/data-entry/label.tsx +25 -0
  75. package/src/components/data-entry/radio.tsx +109 -0
  76. package/src/components/data-entry/search-input.tsx +103 -0
  77. package/src/components/data-entry/select.tsx +149 -0
  78. package/src/components/data-entry/slider.tsx +38 -0
  79. package/src/components/data-entry/switch-field.tsx +91 -0
  80. package/src/components/data-entry/switch.tsx +24 -0
  81. package/src/components/data-entry/textarea.tsx +12 -0
  82. package/src/components/data-entry/time-picker.tsx +214 -0
  83. package/src/components/data-entry/transfer.tsx +231 -0
  84. package/src/components/data-entry/tree-select-strategy.ts +6 -0
  85. package/src/components/data-entry/tree-select.tsx +279 -0
  86. package/src/components/data-entry/tree-utils.ts +221 -0
  87. package/src/components/data-entry/upload-crop-dialog.tsx +109 -0
  88. package/src/components/data-entry/upload-types.ts +86 -0
  89. package/src/components/data-entry/upload.tsx +498 -0
  90. package/src/components/data-entry/use-upload-draft.ts +93 -0
  91. package/src/components/feedback/__tests__/alert.test.tsx +127 -0
  92. package/src/components/feedback/__tests__/dialog.test.tsx +290 -0
  93. package/src/components/feedback/__tests__/sheet.test.tsx +94 -0
  94. package/src/components/feedback/__tests__/skeleton.test.tsx +25 -0
  95. package/src/components/feedback/__tests__/toast.test.tsx +52 -0
  96. package/src/components/feedback/alert.tsx +167 -0
  97. package/src/components/feedback/dialog.tsx +325 -0
  98. package/src/components/feedback/index.ts +53 -0
  99. package/src/components/feedback/sheet.tsx +130 -0
  100. package/src/components/feedback/skeleton.tsx +95 -0
  101. package/src/components/feedback/sonner.tsx +54 -0
  102. package/src/components/feedback/toaster.tsx +1 -0
  103. package/src/components/feedback/use-toast.ts +62 -0
  104. package/src/components/general/__tests__/button.test.tsx +71 -0
  105. package/src/components/general/button.tsx +61 -0
  106. package/src/components/general/index.ts +2 -0
  107. package/src/components/layout/__tests__/page-container.test.tsx +69 -0
  108. package/src/components/layout/__tests__/page-inset.test.tsx +14 -0
  109. package/src/components/layout/__tests__/stack-inline.test.tsx +39 -0
  110. package/src/components/layout/app-shell.tsx +42 -0
  111. package/src/components/layout/breadcrumb.tsx +35 -0
  112. package/src/components/layout/index.ts +31 -0
  113. package/src/components/layout/inline.tsx +13 -0
  114. package/src/components/layout/menu.tsx +34 -0
  115. package/src/components/layout/mobile-frame.tsx +57 -0
  116. package/src/components/layout/page-container.tsx +81 -0
  117. package/src/components/layout/page-inset.tsx +16 -0
  118. package/src/components/layout/responsive-grid.tsx +14 -0
  119. package/src/components/layout/shell-app.tsx +30 -0
  120. package/src/components/layout/sidebar.tsx +98 -0
  121. package/src/components/layout/split-pane.tsx +16 -0
  122. package/src/components/layout/stack.tsx +13 -0
  123. package/src/components/layout/topbar.tsx +108 -0
  124. package/src/components/navigation/__tests__/app-pickers.test.tsx +118 -0
  125. package/src/components/navigation/__tests__/dropdown-menu.test.tsx +104 -0
  126. package/src/components/navigation/__tests__/navigation.test.tsx +61 -0
  127. package/src/components/navigation/__tests__/pagination-steps-tabs.test.tsx +76 -0
  128. package/src/components/navigation/date-format-picker.tsx +55 -0
  129. package/src/components/navigation/dropdown-menu.tsx +190 -0
  130. package/src/components/navigation/filter-bar.tsx +38 -0
  131. package/src/components/navigation/index.ts +28 -0
  132. package/src/components/navigation/locale-picker.tsx +49 -0
  133. package/src/components/navigation/page-header.tsx +50 -0
  134. package/src/components/navigation/pagination-utils.ts +35 -0
  135. package/src/components/navigation/pagination.tsx +168 -0
  136. package/src/components/navigation/steps.tsx +163 -0
  137. package/src/components/navigation/tabs-items.tsx +69 -0
  138. package/src/components/navigation/tabs.tsx +67 -0
  139. package/src/components/navigation/time-format-picker.tsx +55 -0
  140. package/src/components/navigation/timezone-picker.tsx +63 -0
  141. package/src/components/query/__tests__/data-state.test.tsx +214 -0
  142. package/src/components/query/__tests__/infinite-prefetch.test.tsx +105 -0
  143. package/src/components/query/__tests__/query-helpers.test.tsx +61 -0
  144. package/src/components/query/data-state.tsx +58 -0
  145. package/src/components/query/index.ts +10 -0
  146. package/src/components/query/infinite-query-state.tsx +99 -0
  147. package/src/components/query/mutation-feedback.tsx +31 -0
  148. package/src/components/query/prefetch-link.tsx +45 -0
  149. package/src/components/query/query-refetch-button.tsx +41 -0
  150. package/src/components/ui/alert-dialog.tsx +1 -0
  151. package/src/components/ui/alert.tsx +1 -0
  152. package/src/components/ui/autocomplete.tsx +1 -0
  153. package/src/components/ui/badge.tsx +1 -0
  154. package/src/components/ui/button.tsx +1 -0
  155. package/src/components/ui/calendar.tsx +1 -0
  156. package/src/components/ui/card.tsx +1 -0
  157. package/src/components/ui/checkbox.tsx +1 -0
  158. package/src/components/ui/color-picker.tsx +1 -0
  159. package/src/components/ui/command.tsx +1 -0
  160. package/src/components/ui/date-picker.tsx +1 -0
  161. package/src/components/ui/date-range-picker.tsx +1 -0
  162. package/src/components/ui/dialog.tsx +1 -0
  163. package/src/components/ui/dropdown-menu.tsx +1 -0
  164. package/src/components/ui/index.tsx +31 -0
  165. package/src/components/ui/input.tsx +1 -0
  166. package/src/components/ui/label.tsx +1 -0
  167. package/src/components/ui/pagination.tsx +1 -0
  168. package/src/components/ui/popover.tsx +1 -0
  169. package/src/components/ui/radio.tsx +1 -0
  170. package/src/components/ui/scroll-area.tsx +1 -0
  171. package/src/components/ui/select.tsx +1 -0
  172. package/src/components/ui/sheet.tsx +1 -0
  173. package/src/components/ui/slider.tsx +1 -0
  174. package/src/components/ui/sonner.tsx +1 -0
  175. package/src/components/ui/switch.tsx +1 -0
  176. package/src/components/ui/table.tsx +1 -0
  177. package/src/components/ui/tabs-items.tsx +1 -0
  178. package/src/components/ui/tabs.tsx +1 -0
  179. package/src/components/ui/textarea.tsx +1 -0
  180. package/src/components/ui/time-picker.tsx +1 -0
  181. package/src/components/ui/upload.tsx +1 -0
  182. package/src/form/__tests__/use-zod-form.test.tsx +97 -0
  183. package/src/form/form-field-control.tsx +44 -0
  184. package/src/form/form-root.tsx +29 -0
  185. package/src/form/index.ts +7 -0
  186. package/src/form/use-zod-form.ts +29 -0
  187. package/src/i18n/__tests__/translate.test.ts +23 -0
  188. package/src/i18n/index.ts +9 -0
  189. package/src/i18n/messages/en.json +171 -0
  190. package/src/i18n/messages/ja.json +171 -0
  191. package/src/i18n/messages/vi.json +171 -0
  192. package/src/i18n/translate.ts +74 -0
  193. package/src/i18n/use-translation.ts +53 -0
  194. package/src/index.ts +3 -0
  195. package/src/lib/__tests__/control-styles.test.ts +78 -0
  196. package/src/lib/__tests__/datetime.test.ts +77 -0
  197. package/src/lib/__tests__/format-date.test.ts +97 -0
  198. package/src/lib/__tests__/format.test.ts +62 -0
  199. package/src/lib/__tests__/theme-tokens-audit.test.ts +176 -0
  200. package/src/lib/__tests__/theme-tokens-css.test.ts +118 -0
  201. package/src/lib/__tests__/token-governance.test.ts +191 -0
  202. package/src/lib/__tests__/variants.test.ts +18 -0
  203. package/src/lib/control-styles.ts +33 -0
  204. package/src/lib/datetime/detect.ts +25 -0
  205. package/src/lib/datetime/format-date.ts +100 -0
  206. package/src/lib/datetime/format.ts +140 -0
  207. package/src/lib/datetime/index.ts +25 -0
  208. package/src/lib/datetime/parse.ts +51 -0
  209. package/src/lib/datetime/sync.ts +48 -0
  210. package/src/lib/format.ts +114 -0
  211. package/src/lib/hooks.ts +54 -0
  212. package/src/lib/utils.ts +6 -0
  213. package/src/lib/variants.ts +40 -0
  214. package/src/props/components/app.prop.ts +99 -0
  215. package/src/props/components/data-display.prop.ts +73 -0
  216. package/src/props/components/data-entry.prop.ts +334 -0
  217. package/src/props/components/feedback.prop.ts +80 -0
  218. package/src/props/components/form.prop.ts +46 -0
  219. package/src/props/components/general.prop.ts +18 -0
  220. package/src/props/components/index.ts +99 -0
  221. package/src/props/components/layout.prop.ts +130 -0
  222. package/src/props/components/navigation.prop.ts +88 -0
  223. package/src/props/components/query.prop.ts +94 -0
  224. package/src/props/index.ts +17 -0
  225. package/src/props/registry.ts +603 -0
  226. package/src/props/vocabulary/content.prop.ts +35 -0
  227. package/src/props/vocabulary/data.prop.ts +46 -0
  228. package/src/props/vocabulary/index.ts +73 -0
  229. package/src/props/vocabulary/interaction.prop.ts +42 -0
  230. package/src/props/vocabulary/layout.prop.ts +25 -0
  231. package/src/props/vocabulary/navigation.prop.ts +19 -0
  232. package/src/props/vocabulary/shared.prop.ts +59 -0
  233. package/src/styles/alert-layout.css +191 -0
  234. package/src/styles/badge-layout.css +22 -0
  235. package/src/styles/card-layout.css +373 -0
  236. package/src/styles/control.css +504 -0
  237. package/src/styles/data-display-layout.css +246 -0
  238. package/src/styles/density.css +43 -0
  239. package/src/styles/dialog-layout.css +84 -0
  240. package/src/styles/index.css +105 -0
  241. package/src/styles/layout.css +479 -0
  242. package/src/styles/shell-layout.css +604 -0
  243. package/src/styles/table-layout.css +109 -0
  244. package/src/test/__tests__/render-loop-guard.test.tsx +38 -0
  245. package/src/test/jest-dom.d.ts +4 -0
  246. package/src/test/render-loop-guard.tsx +50 -0
  247. package/src/test/render.tsx +29 -0
  248. package/src/test/theme-globals.test.ts +77 -0
  249. package/src/test/theme-globals.ts +134 -0
  250. package/src/test/theme-test-utils.tsx +67 -0
  251. package/src/theme/example.service.css +37 -0
  252. package/src/tokens/base.css +13 -0
  253. package/src/tokens/foundation.css +151 -0
  254. package/src/tokens/primitives/badge.css +13 -0
  255. package/src/tokens/primitives/card.css +29 -0
  256. package/src/tokens/primitives/control.css +55 -0
  257. package/src/tokens/primitives/feedback.css +17 -0
  258. package/src/tokens/primitives/layout.css +20 -0
  259. package/src/tokens/primitives/navigation.css +13 -0
  260. package/src/tokens/primitives/table.css +10 -0
  261. package/BRAND.md +0 -296
  262. package/CHANGELOG.md +0 -668
  263. package/config/eslint.js +0 -54
  264. package/config/prettier.cjs +0 -20
  265. package/config/tsconfig.base.json +0 -22
  266. package/config/vitest.base.ts +0 -26
  267. package/dist/MiniMonth-YAmPGEpC.d.ts +0 -143
  268. package/dist/Table.types-BbsxoIYE.d.ts +0 -352
  269. package/dist/color-DO0qqUAb.d.ts +0 -38
  270. package/dist/components/composites.d.ts +0 -963
  271. package/dist/components/composites.js +0 -7343
  272. package/dist/components/composites.js.map +0 -1
  273. package/dist/components/primitives.d.ts +0 -2744
  274. package/dist/components/primitives.js +0 -7356
  275. package/dist/components/primitives.js.map +0 -1
  276. package/dist/components/shell.d.ts +0 -182
  277. package/dist/components/shell.js +0 -774
  278. package/dist/components/shell.js.map +0 -1
  279. package/dist/hooks.d.ts +0 -100
  280. package/dist/hooks.js +0 -558
  281. package/dist/hooks.js.map +0 -1
  282. package/dist/i18n.d.ts +0 -61
  283. package/dist/i18n.js +0 -860
  284. package/dist/i18n.js.map +0 -1
  285. package/dist/index.d.ts +0 -33
  286. package/dist/index.js +0 -13062
  287. package/dist/index.js.map +0 -1
  288. package/dist/padding-DY0JV5Ja.d.ts +0 -16
  289. package/dist/preferences.d.ts +0 -132
  290. package/dist/preferences.js +0 -262
  291. package/dist/preferences.js.map +0 -1
  292. package/dist/props.d.ts +0 -86
  293. package/dist/props.js +0 -16
  294. package/dist/props.js.map +0 -1
  295. package/dist/size-CQwNvOWd.d.ts +0 -19
  296. package/dist/types-LTj-2bl-.d.ts +0 -30
  297. package/dist/useTableViews-D5NIAJ7h.d.ts +0 -154
  298. package/src/tokens/tailwind.css +0 -158
package/dist/hooks.js DELETED
@@ -1,558 +0,0 @@
1
- import { useState, useEffect, useCallback, useSyncExternalStore, useMemo } from 'react';
2
- import i18next from 'i18next';
3
- import 'i18next-browser-languagedetector';
4
- import 'react-i18next';
5
-
6
- // src/hooks/useTweaks.ts
7
-
8
- // src/preferences/holder.ts
9
- var DEFAULT = {
10
- locale: "ja",
11
- timezone: "Asia/Tokyo"
12
- };
13
- var CURRENT = { ...DEFAULT };
14
- var subscribers = /* @__PURE__ */ new Set();
15
- function getGodxConfig() {
16
- return CURRENT;
17
- }
18
- function subscribeGodxConfig(fn) {
19
- subscribers.add(fn);
20
- return () => {
21
- subscribers.delete(fn);
22
- };
23
- }
24
-
25
- // src/i18n/format.ts
26
- function resolveLocale(opts) {
27
- return opts?.locale ?? getGodxConfig().locale;
28
- }
29
- function resolveTimezone(opts) {
30
- return opts?.timezone ?? getGodxConfig().timezone;
31
- }
32
- function toDate(value) {
33
- if (value instanceof Date) return value;
34
- if (typeof value === "number") return new Date(value);
35
- if (typeof value === "string") return new Date(value);
36
- if (typeof value === "object" && value !== null && "toDate" in value) {
37
- const v = value;
38
- return v.toDate(getGodxConfig().timezone);
39
- }
40
- throw new TypeError(`format helpers: unsupported value ${String(value)}`);
41
- }
42
- function extractIntlOpts(opts) {
43
- if (!opts) return {};
44
- const { locale: _l, timezone: _t, ...rest } = opts;
45
- return rest;
46
- }
47
- function formatDate(value, opts) {
48
- const locale = resolveLocale(opts);
49
- const timezone = resolveTimezone(opts);
50
- const intlOpts = {
51
- dateStyle: "medium",
52
- ...extractIntlOpts(opts),
53
- timeZone: timezone
54
- };
55
- return new Intl.DateTimeFormat(locale, intlOpts).format(toDate(value));
56
- }
57
- function formatTime(value, opts) {
58
- const locale = resolveLocale(opts);
59
- const timezone = resolveTimezone(opts);
60
- const intlOpts = {
61
- timeStyle: "short",
62
- ...extractIntlOpts(opts),
63
- timeZone: timezone
64
- };
65
- return new Intl.DateTimeFormat(locale, intlOpts).format(toDate(value));
66
- }
67
- function formatDateTime(value, opts) {
68
- const locale = resolveLocale(opts);
69
- const timezone = resolveTimezone(opts);
70
- const intlOpts = {
71
- dateStyle: "medium",
72
- timeStyle: "short",
73
- ...extractIntlOpts(opts),
74
- timeZone: timezone
75
- };
76
- return new Intl.DateTimeFormat(locale, intlOpts).format(toDate(value));
77
- }
78
- function formatNumber(value, opts) {
79
- const locale = resolveLocale(opts);
80
- return new Intl.NumberFormat(locale, extractIntlOpts(opts)).format(value);
81
- }
82
- function formatCurrency(value, opts) {
83
- const locale = resolveLocale(opts);
84
- const intlOpts = {
85
- style: "currency",
86
- ...extractIntlOpts(opts)
87
- };
88
- return new Intl.NumberFormat(locale, intlOpts).format(value);
89
- }
90
-
91
- // src/i18n/relative.ts
92
- var SECOND = 1e3;
93
- var MINUTE = 60 * SECOND;
94
- var HOUR = 60 * MINUTE;
95
- var DAY = 24 * HOUR;
96
- var WEEK = 7 * DAY;
97
- var MONTH = 30 * DAY;
98
- var YEAR = 365 * DAY;
99
- function toMs(value) {
100
- if (value instanceof Date) return value.getTime();
101
- if (typeof value === "number") return value;
102
- if (typeof value === "string") return new Date(value).getTime();
103
- if (typeof value === "object" && value !== null && "toDate" in value) {
104
- return value.toDate(getGodxConfig().timezone).getTime();
105
- }
106
- throw new TypeError(`formatRelative: unsupported value ${String(value)}`);
107
- }
108
- function formatRelative(value, opts = {}) {
109
- const locale = opts.locale ?? getGodxConfig().locale;
110
- const nowMs = opts.now instanceof Date ? opts.now.getTime() : opts.now ?? Date.now();
111
- const valueMs = toMs(value);
112
- const diffMs = valueMs - nowMs;
113
- const abs = Math.abs(diffMs);
114
- let unit;
115
- let amount;
116
- if (abs < MINUTE) {
117
- unit = "second";
118
- amount = Math.round(diffMs / SECOND);
119
- } else if (abs < HOUR) {
120
- unit = "minute";
121
- amount = Math.round(diffMs / MINUTE);
122
- } else if (abs < DAY) {
123
- unit = "hour";
124
- amount = Math.round(diffMs / HOUR);
125
- } else if (abs < WEEK) {
126
- unit = "day";
127
- amount = Math.round(diffMs / DAY);
128
- } else if (abs < MONTH) {
129
- unit = "week";
130
- amount = Math.round(diffMs / WEEK);
131
- } else if (abs < YEAR) {
132
- unit = "month";
133
- amount = Math.round(diffMs / MONTH);
134
- } else {
135
- unit = "year";
136
- amount = Math.round(diffMs / YEAR);
137
- }
138
- return new Intl.RelativeTimeFormat(locale, {
139
- numeric: opts.numeric ?? "auto",
140
- style: opts.style ?? "long"
141
- }).format(amount, unit);
142
- }
143
-
144
- // src/i18n/index.ts
145
- var GODX_LOCALE_STORAGE_KEY = "godx.locale";
146
- var i18n_default = i18next;
147
-
148
- // src/hooks/useTweaks.ts
149
- var STORAGE_KEY = "godx.tweaks";
150
- var DEFAULTS = {
151
- density: "default",
152
- theme: "light",
153
- tenant: "godx",
154
- locale: "ja",
155
- sidebarCollapsed: false
156
- };
157
- function loadInitial() {
158
- if (typeof window === "undefined") return DEFAULTS;
159
- try {
160
- const raw = window.localStorage.getItem(STORAGE_KEY);
161
- const stored = raw ? JSON.parse(raw) : {};
162
- const detected = i18n_default.language?.slice(0, 2) || "ja";
163
- return {
164
- ...DEFAULTS,
165
- ...stored,
166
- locale: stored.locale ?? detected
167
- };
168
- } catch {
169
- return DEFAULTS;
170
- }
171
- }
172
- function useTweaks() {
173
- const [tweaks, setTweaks] = useState(loadInitial);
174
- useEffect(() => {
175
- try {
176
- window.localStorage.setItem(STORAGE_KEY, JSON.stringify(tweaks));
177
- } catch {
178
- }
179
- }, [tweaks]);
180
- useEffect(() => {
181
- const html = document.documentElement;
182
- html.dataset.theme = tweaks.theme;
183
- html.dataset.density = tweaks.density;
184
- html.dataset.tenant = tweaks.tenant;
185
- html.lang = tweaks.locale;
186
- }, [tweaks.theme, tweaks.density, tweaks.tenant, tweaks.locale]);
187
- useEffect(() => {
188
- if (!i18n_default.isInitialized) return;
189
- if (i18n_default.language?.slice(0, 2) !== tweaks.locale) {
190
- void i18n_default.changeLanguage(tweaks.locale);
191
- try {
192
- window.localStorage.setItem(GODX_LOCALE_STORAGE_KEY, tweaks.locale);
193
- } catch {
194
- }
195
- }
196
- }, [tweaks.locale]);
197
- const setTweak = useCallback((key, value) => {
198
- setTweaks((prev) => ({ ...prev, [key]: value }));
199
- }, []);
200
- return { tweaks, setTweak, setTweaks };
201
- }
202
- function productOptions(products) {
203
- return products.map((p) => ({ value: p.tenant, label: p.name }));
204
- }
205
- var BP_ORDER = ["xxl", "xl", "lg", "md", "sm", "xs"];
206
- var BP_ORDER_ASC = ["xs", "sm", "md", "lg", "xl", "xxl"];
207
- var FALLBACK_WIDTH = {
208
- xs: "0px",
209
- sm: "640px",
210
- md: "768px",
211
- lg: "1024px",
212
- xl: "1280px",
213
- xxl: "1536px"
214
- };
215
- function widthOf(bp) {
216
- if (typeof window === "undefined") return FALLBACK_WIDTH[bp];
217
- const v = getComputedStyle(document.documentElement).getPropertyValue(`--breakpoint-${bp}`).trim();
218
- return v || FALLBACK_WIDTH[bp];
219
- }
220
- function currentBreakpoint() {
221
- if (typeof window === "undefined") return "xs";
222
- for (const bp of BP_ORDER) {
223
- if (window.matchMedia(`(min-width: ${widthOf(bp)})`).matches) {
224
- return bp;
225
- }
226
- }
227
- return "xs";
228
- }
229
- function useBreakpoint() {
230
- const [bp, setBp] = useState(() => currentBreakpoint());
231
- useEffect(() => {
232
- if (typeof window === "undefined") return;
233
- const mqls = BP_ORDER.map(
234
- (b) => window.matchMedia(`(min-width: ${widthOf(b)})`)
235
- );
236
- const update = () => setBp(currentBreakpoint());
237
- mqls.forEach((mql) => mql.addEventListener("change", update));
238
- update();
239
- return () => {
240
- mqls.forEach((mql) => mql.removeEventListener("change", update));
241
- };
242
- }, []);
243
- return bp;
244
- }
245
- function matchBreakpoint(current, target) {
246
- return BP_ORDER_ASC.indexOf(current) >= BP_ORDER_ASC.indexOf(target);
247
- }
248
- function useFormatters() {
249
- const { locale, timezone } = useSyncExternalStore(
250
- subscribeGodxConfig,
251
- getGodxConfig,
252
- getGodxConfig
253
- );
254
- return useMemo(
255
- () => ({
256
- locale,
257
- timezone,
258
- formatDate: (value, opts) => formatDate(value, { ...opts, locale, timezone }),
259
- formatTime: (value, opts) => formatTime(value, { ...opts, locale, timezone }),
260
- formatDateTime: (value, opts) => formatDateTime(value, { ...opts, locale, timezone }),
261
- formatRelative: (value, opts) => formatRelative(value, { ...opts, locale }),
262
- formatNumber: (value, opts) => formatNumber(value, { ...opts, locale }),
263
- formatCurrency: (value, opts) => formatCurrency(value, { ...opts, locale })
264
- }),
265
- [locale, timezone]
266
- );
267
- }
268
- function useTablePagination(options = {}) {
269
- const {
270
- defaultPage = 1,
271
- defaultPageSize = 20,
272
- page: controlledPage,
273
- pageSize: controlledPageSize,
274
- onChange
275
- } = options;
276
- const [internalPage, setInternalPage] = useState(defaultPage);
277
- const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);
278
- const page = controlledPage ?? internalPage;
279
- const pageSize = controlledPageSize ?? internalPageSize;
280
- const setPage = useCallback(
281
- (nextPage) => {
282
- if (controlledPage === void 0) setInternalPage(nextPage);
283
- onChange?.(nextPage, pageSize);
284
- },
285
- [controlledPage, onChange, pageSize]
286
- );
287
- const setPageSize = useCallback(
288
- (nextPageSize) => {
289
- if (controlledPageSize === void 0) setInternalPageSize(nextPageSize);
290
- if (controlledPage === void 0) setInternalPage(1);
291
- onChange?.(1, nextPageSize);
292
- },
293
- [controlledPage, controlledPageSize, onChange]
294
- );
295
- const handleChange = useCallback(
296
- (nextPage, nextPageSize) => {
297
- if (controlledPage === void 0) setInternalPage(nextPage);
298
- if (controlledPageSize === void 0) setInternalPageSize(nextPageSize);
299
- onChange?.(nextPage, nextPageSize);
300
- },
301
- [controlledPage, controlledPageSize, onChange]
302
- );
303
- const resetPage = useCallback(() => {
304
- if (controlledPage === void 0) setInternalPage(1);
305
- onChange?.(1, pageSize);
306
- }, [controlledPage, onChange, pageSize]);
307
- const reset = useCallback(() => {
308
- if (controlledPage === void 0) setInternalPage(defaultPage);
309
- if (controlledPageSize === void 0) setInternalPageSize(defaultPageSize);
310
- onChange?.(defaultPage, defaultPageSize);
311
- }, [
312
- controlledPage,
313
- controlledPageSize,
314
- defaultPage,
315
- defaultPageSize,
316
- onChange
317
- ]);
318
- return {
319
- page,
320
- pageSize,
321
- setPage,
322
- setPageSize,
323
- onChange: handleChange,
324
- resetPage,
325
- reset
326
- };
327
- }
328
- function useTableSelection(options = {}) {
329
- const {
330
- mode = "multiple",
331
- defaultSelected = [],
332
- selected: controlledSelected,
333
- onChange
334
- } = options;
335
- const [internal, setInternal] = useState(defaultSelected);
336
- const selectedRowKeys = controlledSelected ?? internal;
337
- const setSelectedRowKeys = useCallback(
338
- (next) => {
339
- if (controlledSelected === void 0) setInternal(next);
340
- onChange?.(next);
341
- },
342
- [controlledSelected, onChange]
343
- );
344
- const select = useCallback(
345
- (key) => {
346
- const next = mode === "single" ? [key] : selectedRowKeys.includes(key) ? selectedRowKeys : [...selectedRowKeys, key];
347
- if (next === selectedRowKeys) return;
348
- setSelectedRowKeys(next);
349
- },
350
- [mode, selectedRowKeys, setSelectedRowKeys]
351
- );
352
- const deselect = useCallback(
353
- (key) => {
354
- if (!selectedRowKeys.includes(key)) return;
355
- setSelectedRowKeys(selectedRowKeys.filter((k) => k !== key));
356
- },
357
- [selectedRowKeys, setSelectedRowKeys]
358
- );
359
- const toggle = useCallback(
360
- (key) => {
361
- if (selectedRowKeys.includes(key)) {
362
- setSelectedRowKeys(selectedRowKeys.filter((k) => k !== key));
363
- } else {
364
- setSelectedRowKeys(mode === "single" ? [key] : [...selectedRowKeys, key]);
365
- }
366
- },
367
- [mode, selectedRowKeys, setSelectedRowKeys]
368
- );
369
- const clear = useCallback(() => {
370
- if (selectedRowKeys.length === 0) return;
371
- setSelectedRowKeys([]);
372
- }, [selectedRowKeys.length, setSelectedRowKeys]);
373
- const isSelected = useCallback(
374
- (key) => selectedRowKeys.includes(key),
375
- [selectedRowKeys]
376
- );
377
- return {
378
- selectedRowKeys,
379
- setSelectedRowKeys,
380
- toggle,
381
- select,
382
- deselect,
383
- clear,
384
- isSelected,
385
- count: selectedRowKeys.length
386
- };
387
- }
388
- function readPersisted(storage, storageKey, currentVersion, migrate) {
389
- if (!storage) return void 0;
390
- try {
391
- const raw = storage.getItem(storageKey);
392
- if (raw === null) return void 0;
393
- const parsed = JSON.parse(raw);
394
- if (typeof parsed !== "object" || parsed === null) return void 0;
395
- const envelope = parsed;
396
- if (typeof envelope.version !== "number" || !("value" in envelope))
397
- return void 0;
398
- if (envelope.version === currentVersion) return envelope.value;
399
- if (migrate)
400
- return migrate({
401
- version: envelope.version,
402
- value: envelope.value
403
- });
404
- return void 0;
405
- } catch {
406
- return void 0;
407
- }
408
- }
409
- function writePersisted(storage, storageKey, version, value) {
410
- if (!storage) return;
411
- try {
412
- storage.setItem(
413
- storageKey,
414
- JSON.stringify({ version, value })
415
- );
416
- } catch {
417
- }
418
- }
419
- function resolveStorage(override) {
420
- if (override !== void 0) return override;
421
- if (typeof window === "undefined") return null;
422
- try {
423
- return window.localStorage;
424
- } catch {
425
- return null;
426
- }
427
- }
428
- function useTableState(options) {
429
- const {
430
- storageKey,
431
- defaultValue,
432
- version = 1,
433
- migrate,
434
- storage: storageOverride
435
- } = options;
436
- const storage = resolveStorage(storageOverride);
437
- const [value, setValue] = useState(() => {
438
- if (storageKey === void 0) return defaultValue;
439
- const persisted = readPersisted(storage, storageKey, version, migrate);
440
- return persisted !== void 0 ? persisted : defaultValue;
441
- });
442
- useEffect(() => {
443
- if (storageKey === void 0) return;
444
- writePersisted(storage, storageKey, version, value);
445
- }, [storage, storageKey, value, version]);
446
- const setNext = useCallback(
447
- (next) => {
448
- setValue(
449
- (prev) => typeof next === "function" ? next(prev) : next
450
- );
451
- },
452
- []
453
- );
454
- return [value, setNext];
455
- }
456
- var CUSTOM_KEY = "custom";
457
- function isPersistableLabel(label) {
458
- return typeof label === "string";
459
- }
460
- function generateKey() {
461
- if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
462
- return `view-${crypto.randomUUID()}`;
463
- }
464
- return `view-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
465
- }
466
- function useTableViews(options) {
467
- const {
468
- items: builtInItems,
469
- defaultActive,
470
- activeKey: controlledActiveKey,
471
- onActiveKeyChange,
472
- onSavedViewsChange,
473
- storageKey,
474
- maxSavedViews = 20
475
- } = options;
476
- const [internalActiveKey, setInternalActiveKey] = useState(
477
- defaultActive ?? builtInItems[0]?.key
478
- );
479
- const activeKey = controlledActiveKey ?? internalActiveKey;
480
- const [savedViews, setSavedViewsState] = useTableState({
481
- storageKey,
482
- defaultValue: [],
483
- version: 1
484
- });
485
- const updateSavedViews = useCallback(
486
- (next) => {
487
- setSavedViewsState((prev) => {
488
- const resolved = typeof next === "function" ? next(prev) : next;
489
- const trimmed = resolved.slice(-maxSavedViews);
490
- onSavedViewsChange?.(trimmed);
491
- return trimmed;
492
- });
493
- },
494
- [maxSavedViews, onSavedViewsChange, setSavedViewsState]
495
- );
496
- const setActiveKey = useCallback(
497
- (key) => {
498
- if (controlledActiveKey === void 0) setInternalActiveKey(key);
499
- onActiveKeyChange?.(key);
500
- },
501
- [controlledActiveKey, onActiveKeyChange]
502
- );
503
- const applyView = useCallback(
504
- (view) => {
505
- setActiveKey(view.key);
506
- return {
507
- filters: view.filters,
508
- sort: view.sort,
509
- columnVisibility: view.columnVisibility
510
- };
511
- },
512
- [setActiveKey]
513
- );
514
- const saveView = useCallback(
515
- (label, snapshot) => {
516
- const next = {
517
- key: generateKey(),
518
- label,
519
- ...snapshot,
520
- deletable: true
521
- };
522
- updateSavedViews((prev) => [...prev, next]);
523
- setActiveKey(next.key);
524
- return next;
525
- },
526
- [setActiveKey, updateSavedViews]
527
- );
528
- const deleteView = useCallback(
529
- (key) => {
530
- const target = savedViews.find((view) => view.key === key);
531
- if (!target || !isPersistableLabel(target.label)) return;
532
- updateSavedViews((prev) => prev.filter((view) => view.key !== key));
533
- if (activeKey === key) {
534
- const firstBuiltIn = builtInItems[0]?.key;
535
- if (firstBuiltIn !== void 0) setActiveKey(firstBuiltIn);
536
- }
537
- },
538
- [activeKey, builtInItems, savedViews, setActiveKey, updateSavedViews]
539
- );
540
- const markCustom = useCallback(() => {
541
- if (activeKey === CUSTOM_KEY) return;
542
- setActiveKey(CUSTOM_KEY);
543
- }, [activeKey, setActiveKey]);
544
- return {
545
- items: [...builtInItems, ...savedViews],
546
- savedViews,
547
- activeKey,
548
- setActiveKey,
549
- applyView,
550
- saveView,
551
- deleteView,
552
- markCustom
553
- };
554
- }
555
-
556
- export { matchBreakpoint, productOptions, useBreakpoint, useFormatters, useTablePagination, useTableSelection, useTableState, useTableViews, useTweaks };
557
- //# sourceMappingURL=hooks.js.map
558
- //# sourceMappingURL=hooks.js.map