@simplysm/solid 13.0.71 → 13.0.74

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 (215) hide show
  1. package/README.md +209 -202
  2. package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
  3. package/dist/components/data/calendar/Calendar.js +3 -11
  4. package/dist/components/data/calendar/Calendar.js.map +2 -2
  5. package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
  6. package/dist/components/data/sheet/DataSheet.js +13 -16
  7. package/dist/components/data/sheet/DataSheet.js.map +2 -2
  8. package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
  9. package/dist/components/data/sheet/DataSheet.styles.js +1 -1
  10. package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
  11. package/dist/components/data/sheet/DataSheetConfigDialog.d.ts.map +1 -1
  12. package/dist/components/data/sheet/DataSheetConfigDialog.js +27 -9
  13. package/dist/components/data/sheet/DataSheetConfigDialog.js.map +2 -2
  14. package/dist/components/disclosure/Dialog.d.ts +1 -1
  15. package/dist/components/disclosure/Dialog.d.ts.map +1 -1
  16. package/dist/components/disclosure/Dialog.js +5 -5
  17. package/dist/components/disclosure/Dialog.js.map +2 -2
  18. package/dist/components/disclosure/dialogZIndex.d.ts +1 -1
  19. package/dist/components/features/crud-detail/CrudDetail.js +23 -23
  20. package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
  21. package/dist/components/features/crud-sheet/CrudSheet.js +49 -49
  22. package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
  23. package/dist/components/features/crud-sheet/types.d.ts +4 -4
  24. package/dist/components/features/crud-sheet/types.d.ts.map +1 -1
  25. package/dist/components/features/data-select-button/DataSelectButton.d.ts +25 -7
  26. package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
  27. package/dist/components/features/data-select-button/DataSelectButton.js +27 -12
  28. package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
  29. package/dist/components/features/permission-table/PermissionTable.js +4 -4
  30. package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
  31. package/dist/components/features/shared-data/SharedDataSelect.d.ts +22 -10
  32. package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
  33. package/dist/components/features/shared-data/SharedDataSelect.js +113 -29
  34. package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
  35. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +3 -3
  36. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
  37. package/dist/components/features/shared-data/SharedDataSelectButton.js.map +1 -1
  38. package/dist/components/features/shared-data/SharedDataSelectList.js +5 -4
  39. package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
  40. package/dist/components/feedback/notification/NotificationBanner.js +3 -3
  41. package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
  42. package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
  43. package/dist/components/feedback/notification/NotificationBell.js +12 -5
  44. package/dist/components/feedback/notification/NotificationBell.js.map +2 -2
  45. package/dist/components/feedback/notification/NotificationProvider.d.ts.map +1 -1
  46. package/dist/components/feedback/notification/NotificationProvider.js +3 -1
  47. package/dist/components/feedback/notification/NotificationProvider.js.map +2 -2
  48. package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
  49. package/dist/components/form-control/ThemeToggle.js +9 -6
  50. package/dist/components/form-control/ThemeToggle.js.map +2 -2
  51. package/dist/components/form-control/checkbox/Checkbox.d.ts.map +1 -1
  52. package/dist/components/form-control/checkbox/Checkbox.js +3 -1
  53. package/dist/components/form-control/checkbox/Checkbox.js.map +2 -2
  54. package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
  55. package/dist/components/form-control/checkbox/CheckboxGroup.js.map +2 -2
  56. package/dist/components/form-control/checkbox/Radio.d.ts.map +1 -1
  57. package/dist/components/form-control/checkbox/Radio.js +3 -1
  58. package/dist/components/form-control/checkbox/Radio.js.map +2 -2
  59. package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
  60. package/dist/components/form-control/checkbox/RadioGroup.js.map +2 -2
  61. package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
  62. package/dist/components/form-control/color-picker/ColorPicker.js +3 -1
  63. package/dist/components/form-control/color-picker/ColorPicker.js.map +2 -2
  64. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  65. package/dist/components/form-control/combobox/Combobox.js +9 -5
  66. package/dist/components/form-control/combobox/Combobox.js.map +2 -2
  67. package/dist/components/form-control/date-range-picker/DateRangePicker.js +9 -9
  68. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
  69. package/dist/components/form-control/editor/EditorToolbar.js +3 -3
  70. package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
  71. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  72. package/dist/components/form-control/field/DatePicker.js +9 -3
  73. package/dist/components/form-control/field/DatePicker.js.map +2 -2
  74. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  75. package/dist/components/form-control/field/DateTimePicker.js +9 -3
  76. package/dist/components/form-control/field/DateTimePicker.js.map +2 -2
  77. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  78. package/dist/components/form-control/field/NumberInput.js +9 -3
  79. package/dist/components/form-control/field/NumberInput.js.map +2 -2
  80. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  81. package/dist/components/form-control/field/TextInput.js +10 -4
  82. package/dist/components/form-control/field/TextInput.js.map +2 -2
  83. package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
  84. package/dist/components/form-control/field/Textarea.js +9 -3
  85. package/dist/components/form-control/field/Textarea.js.map +2 -2
  86. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  87. package/dist/components/form-control/field/TimePicker.js +9 -3
  88. package/dist/components/form-control/field/TimePicker.js.map +2 -2
  89. package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
  90. package/dist/components/form-control/numpad/Numpad.js +5 -1
  91. package/dist/components/form-control/numpad/Numpad.js.map +2 -2
  92. package/dist/components/form-control/select/Select.js +7 -7
  93. package/dist/components/form-control/select/Select.js.map +2 -2
  94. package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
  95. package/dist/components/form-control/state-preset/StatePreset.js +42 -20
  96. package/dist/components/form-control/state-preset/StatePreset.js.map +2 -2
  97. package/dist/components/layout/sidebar/SidebarContainer.js +3 -3
  98. package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
  99. package/dist/components/layout/sidebar/SidebarMenu.d.ts.map +1 -1
  100. package/dist/components/layout/sidebar/SidebarMenu.js +5 -2
  101. package/dist/components/layout/sidebar/SidebarMenu.js.map +2 -2
  102. package/dist/components/layout/topbar/Topbar.js +3 -4
  103. package/dist/components/layout/topbar/Topbar.js.map +2 -2
  104. package/dist/components/layout/topbar/TopbarMenu.js +3 -3
  105. package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
  106. package/dist/hooks/createSelectionGroup.d.ts +2 -2
  107. package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
  108. package/dist/hooks/createSelectionGroup.js +5 -2
  109. package/dist/hooks/createSelectionGroup.js.map +2 -2
  110. package/dist/providers/i18n/I18nContext.d.ts +0 -4
  111. package/dist/providers/i18n/I18nContext.d.ts.map +1 -1
  112. package/dist/providers/i18n/I18nContext.js +1 -5
  113. package/dist/providers/i18n/I18nContext.js.map +2 -2
  114. package/dist/providers/i18n/locales/en.d.ts +38 -0
  115. package/dist/providers/i18n/locales/en.d.ts.map +1 -1
  116. package/dist/providers/i18n/locales/en.js +39 -1
  117. package/dist/providers/i18n/locales/en.js.map +1 -1
  118. package/dist/providers/i18n/locales/ko.d.ts +38 -0
  119. package/dist/providers/i18n/locales/ko.d.ts.map +1 -1
  120. package/dist/providers/i18n/locales/ko.js +39 -1
  121. package/dist/providers/i18n/locales/ko.js.map +1 -1
  122. package/package.json +6 -6
  123. package/src/components/data/calendar/Calendar.tsx +3 -4
  124. package/src/components/data/sheet/DataSheet.styles.ts +1 -1
  125. package/src/components/data/sheet/DataSheet.tsx +14 -15
  126. package/src/components/data/sheet/DataSheetConfigDialog.tsx +12 -10
  127. package/src/components/data/sheet/types.ts +1 -1
  128. package/src/components/disclosure/Dialog.tsx +10 -10
  129. package/src/components/disclosure/dialogZIndex.ts +1 -1
  130. package/src/components/features/crud-detail/CrudDetail.tsx +25 -25
  131. package/src/components/features/crud-sheet/CrudSheet.tsx +53 -53
  132. package/src/components/features/crud-sheet/types.ts +4 -4
  133. package/src/components/features/data-select-button/DataSelectButton.tsx +51 -21
  134. package/src/components/features/permission-table/PermissionTable.tsx +3 -3
  135. package/src/components/features/shared-data/SharedDataSelect.tsx +172 -33
  136. package/src/components/features/shared-data/SharedDataSelectButton.tsx +3 -2
  137. package/src/components/features/shared-data/SharedDataSelectList.tsx +4 -4
  138. package/src/components/feedback/notification/NotificationBanner.tsx +3 -3
  139. package/src/components/feedback/notification/NotificationBell.tsx +6 -4
  140. package/src/components/feedback/notification/NotificationProvider.tsx +3 -1
  141. package/src/components/form-control/ThemeToggle.tsx +10 -6
  142. package/src/components/form-control/checkbox/Checkbox.tsx +4 -1
  143. package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
  144. package/src/components/form-control/checkbox/Radio.tsx +4 -1
  145. package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
  146. package/src/components/form-control/color-picker/ColorPicker.tsx +4 -1
  147. package/src/components/form-control/combobox/Combobox.tsx +6 -3
  148. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +8 -8
  149. package/src/components/form-control/editor/EditorToolbar.tsx +23 -23
  150. package/src/components/form-control/field/DatePicker.tsx +6 -3
  151. package/src/components/form-control/field/DateTimePicker.tsx +6 -3
  152. package/src/components/form-control/field/NumberInput.tsx +6 -3
  153. package/src/components/form-control/field/TextInput.tsx +7 -4
  154. package/src/components/form-control/field/Textarea.tsx +6 -3
  155. package/src/components/form-control/field/TimePicker.tsx +6 -3
  156. package/src/components/form-control/numpad/Numpad.tsx +3 -1
  157. package/src/components/form-control/select/Select.tsx +7 -7
  158. package/src/components/form-control/state-preset/StatePreset.tsx +14 -12
  159. package/src/components/layout/sidebar/SidebarContainer.tsx +3 -3
  160. package/src/components/layout/sidebar/SidebarMenu.tsx +3 -1
  161. package/src/components/layout/topbar/Topbar.tsx +3 -3
  162. package/src/components/layout/topbar/TopbarMenu.tsx +3 -3
  163. package/src/hooks/createSelectionGroup.tsx +8 -4
  164. package/src/providers/i18n/I18nContext.tsx +0 -7
  165. package/src/providers/i18n/locales/en.ts +38 -0
  166. package/src/providers/i18n/locales/ko.ts +38 -0
  167. package/tailwind.config.ts +2 -2
  168. package/tests/components/data/kanban/Kanban.selection.spec.tsx +34 -24
  169. package/tests/components/disclosure/Dialog.spec.tsx +28 -28
  170. package/tests/components/disclosure/DialogProvider.spec.tsx +51 -25
  171. package/tests/components/features/address/AddressSearch.spec.tsx +12 -4
  172. package/tests/components/features/crud-detail/CrudDetail.spec.tsx +1 -0
  173. package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +30 -6
  174. package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +77 -56
  175. package/tests/components/features/permission-table/PermissionTable.spec.tsx +12 -8
  176. package/tests/components/features/shared-data/SharedDataSelect.spec.tsx +172 -0
  177. package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +14 -2
  178. package/tests/components/feedback/notification/LiveRegion.spec.tsx +20 -9
  179. package/tests/components/feedback/notification/NotificationBanner.spec.tsx +64 -46
  180. package/tests/components/feedback/notification/NotificationBell.spec.tsx +70 -51
  181. package/tests/components/feedback/notification/NotificationContext.spec.tsx +105 -78
  182. package/tests/components/form-control/checkbox/Checkbox.spec.tsx +25 -20
  183. package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +53 -30
  184. package/tests/components/form-control/checkbox/Radio.spec.tsx +25 -20
  185. package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +53 -30
  186. package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +24 -15
  187. package/tests/components/form-control/combobox/Combobox.spec.tsx +92 -59
  188. package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +2 -2
  189. package/tests/components/form-control/field/DatePicker.spec.tsx +50 -44
  190. package/tests/components/form-control/field/DateTimePicker.spec.tsx +51 -45
  191. package/tests/components/form-control/field/NumberInput.spec.tsx +53 -47
  192. package/tests/components/form-control/field/TextInput.spec.tsx +50 -44
  193. package/tests/components/form-control/field/Textarea.spec.tsx +35 -29
  194. package/tests/components/form-control/field/TimePicker.spec.tsx +43 -37
  195. package/tests/components/form-control/numpad/Numpad.spec.tsx +175 -25
  196. package/tests/components/form-control/select/Select.spec.tsx +5 -0
  197. package/tests/components/form-control/select/SelectItem.spec.tsx +1 -0
  198. package/tests/components/layout/sidebar/Sidebar.spec.tsx +79 -35
  199. package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +1 -0
  200. package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +28 -17
  201. package/tests/components/layout/topbar/TopbarActions.spec.tsx +41 -23
  202. package/tests/components/layout/topbar/createTopbarActions.spec.tsx +1 -0
  203. package/tests/hooks/usePrint.spec.tsx +1 -1
  204. package/tests/hooks/useRouterLink.spec.tsx +2 -0
  205. package/tests/hooks/useSyncConfig.spec.tsx +1 -0
  206. package/tests/providers/ErrorLoggerProvider.spec.tsx +1 -0
  207. package/tests/providers/PwaUpdateProvider.spec.tsx +16 -6
  208. package/tests/providers/ServiceClientContext.spec.tsx +40 -25
  209. package/tests/providers/i18n/I18nContext.spec.tsx +3 -4
  210. package/tests/providers/shared-data/SharedDataProvider.spec.tsx +2 -0
  211. package/dist/hooks/usePrint.d.ts +0 -3
  212. package/dist/hooks/usePrint.d.ts.map +0 -1
  213. package/dist/hooks/usePrint.js +0 -5
  214. package/dist/hooks/usePrint.js.map +0 -6
  215. package/src/hooks/usePrint.ts +0 -2
@@ -1,45 +1,51 @@
1
1
  import { render, fireEvent } from "@solidjs/testing-library";
2
- import { describe, it, expect, vi } from "vitest";
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
3
  import { createSignal } from "solid-js";
4
4
  import { DateTime } from "@simplysm/core-common";
5
5
  import { DateTimePicker } from "../../../../src/components/form-control/field/DateTimePicker";
6
+ import { I18nProvider } from "../../../../src/providers/i18n/I18nContext";
7
+ import { ConfigProvider } from "../../../../src/providers/ConfigContext";
6
8
 
7
9
  describe("DateTimePicker component", () => {
10
+ beforeEach(() => {
11
+ localStorage.setItem("test.i18n-locale", JSON.stringify("en"));
12
+ });
13
+
8
14
  describe("basic rendering", () => {
9
15
  it("renders input type=datetime-local when unit=minute", () => {
10
- const { container } = render(() => <DateTimePicker unit="minute" />);
16
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" /></I18nProvider></ConfigProvider>);
11
17
  const input = container.querySelector("input") as HTMLInputElement;
12
18
  expect(input).toBeTruthy();
13
19
  expect(input.type).toBe("datetime-local");
14
20
  });
15
21
 
16
22
  it("renders input type=datetime-local when unit=second", () => {
17
- const { container } = render(() => <DateTimePicker unit="second" />);
23
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" /></I18nProvider></ConfigProvider>);
18
24
  const input = container.querySelector("input") as HTMLInputElement;
19
25
  expect(input).toBeTruthy();
20
26
  expect(input.type).toBe("datetime-local");
21
27
  });
22
28
 
23
29
  it("defaults unit to minute", () => {
24
- const { container } = render(() => <DateTimePicker />);
30
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
25
31
  const input = container.querySelector("input") as HTMLInputElement;
26
32
  expect(input.type).toBe("datetime-local");
27
33
  });
28
34
 
29
35
  it("defaults autocomplete to one-time-code", () => {
30
- const { container } = render(() => <DateTimePicker />);
36
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
31
37
  const input = container.querySelector("input") as HTMLInputElement;
32
38
  expect(input.autocomplete).toBe("one-time-code");
33
39
  });
34
40
 
35
41
  it("sets step=1 when unit=second", () => {
36
- const { container } = render(() => <DateTimePicker unit="second" />);
42
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" /></I18nProvider></ConfigProvider>);
37
43
  const input = container.querySelector("input") as HTMLInputElement;
38
44
  expect(input.step).toBe("1");
39
45
  });
40
46
 
41
47
  it("does not set step when unit=minute", () => {
42
- const { container } = render(() => <DateTimePicker unit="minute" />);
48
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" /></I18nProvider></ConfigProvider>);
43
49
  const input = container.querySelector("input") as HTMLInputElement;
44
50
  expect(input.step).toBe("");
45
51
  });
@@ -48,14 +54,14 @@ describe("DateTimePicker component", () => {
48
54
  describe("value conversion", () => {
49
55
  it("displays DateTime in yyyy-MM-ddTHH:mm format for minute unit", () => {
50
56
  const dateTime = new DateTime(2025, 3, 15, 10, 30, 45);
51
- const { container } = render(() => <DateTimePicker unit="minute" value={dateTime} />);
57
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={dateTime} /></I18nProvider></ConfigProvider>);
52
58
  const input = container.querySelector("input") as HTMLInputElement;
53
59
  expect(input.value).toBe("2025-03-15T10:30");
54
60
  });
55
61
 
56
62
  it("displays DateTime in yyyy-MM-ddTHH:mm:ss format for second unit", () => {
57
63
  const dateTime = new DateTime(2025, 3, 15, 10, 30, 45);
58
- const { container } = render(() => <DateTimePicker unit="second" value={dateTime} />);
64
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" value={dateTime} /></I18nProvider></ConfigProvider>);
59
65
  const input = container.querySelector("input") as HTMLInputElement;
60
66
  expect(input.value).toBe("2025-03-15T10:30:45");
61
67
  });
@@ -63,7 +69,7 @@ describe("DateTimePicker component", () => {
63
69
  it("passes DateTime converted from minute input to onValueChange", () => {
64
70
  const handleChange = vi.fn();
65
71
  const { container } = render(() => (
66
- <DateTimePicker unit="minute" onValueChange={handleChange} />
72
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" onValueChange={handleChange} /></I18nProvider></ConfigProvider>
67
73
  ));
68
74
  const input = container.querySelector("input") as HTMLInputElement;
69
75
 
@@ -82,7 +88,7 @@ describe("DateTimePicker component", () => {
82
88
  it("passes DateTime converted from second input to onValueChange", () => {
83
89
  const handleChange = vi.fn();
84
90
  const { container } = render(() => (
85
- <DateTimePicker unit="second" onValueChange={handleChange} />
91
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" onValueChange={handleChange} /></I18nProvider></ConfigProvider>
86
92
  ));
87
93
  const input = container.querySelector("input") as HTMLInputElement;
88
94
 
@@ -102,7 +108,7 @@ describe("DateTimePicker component", () => {
102
108
  const handleChange = vi.fn();
103
109
  const dateTime = new DateTime(2025, 3, 15, 10, 30, 45);
104
110
  const { container } = render(() => (
105
- <DateTimePicker unit="minute" value={dateTime} onValueChange={handleChange} />
111
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={dateTime} onValueChange={handleChange} /></I18nProvider></ConfigProvider>
106
112
  ));
107
113
  const input = container.querySelector("input") as HTMLInputElement;
108
114
 
@@ -115,28 +121,28 @@ describe("DateTimePicker component", () => {
115
121
  describe("min/max props", () => {
116
122
  it("converts min to string for minute unit", () => {
117
123
  const minDateTime = new DateTime(2025, 1, 1, 0, 0, 0);
118
- const { container } = render(() => <DateTimePicker unit="minute" min={minDateTime} />);
124
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" min={minDateTime} /></I18nProvider></ConfigProvider>);
119
125
  const input = container.querySelector("input") as HTMLInputElement;
120
126
  expect(input.min).toBe("2025-01-01T00:00");
121
127
  });
122
128
 
123
129
  it("converts max to string for minute unit", () => {
124
130
  const maxDateTime = new DateTime(2025, 12, 31, 23, 59, 0);
125
- const { container } = render(() => <DateTimePicker unit="minute" max={maxDateTime} />);
131
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" max={maxDateTime} /></I18nProvider></ConfigProvider>);
126
132
  const input = container.querySelector("input") as HTMLInputElement;
127
133
  expect(input.max).toBe("2025-12-31T23:59");
128
134
  });
129
135
 
130
136
  it("includes seconds in min for second unit", () => {
131
137
  const minDateTime = new DateTime(2025, 1, 1, 0, 0, 30);
132
- const { container } = render(() => <DateTimePicker unit="second" min={minDateTime} />);
138
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" min={minDateTime} /></I18nProvider></ConfigProvider>);
133
139
  const input = container.querySelector("input") as HTMLInputElement;
134
140
  expect(input.min).toBe("2025-01-01T00:00:30");
135
141
  });
136
142
 
137
143
  it("includes seconds in max for second unit", () => {
138
144
  const maxDateTime = new DateTime(2025, 12, 31, 23, 59, 59);
139
- const { container } = render(() => <DateTimePicker unit="second" max={maxDateTime} />);
145
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" max={maxDateTime} /></I18nProvider></ConfigProvider>);
140
146
  const input = container.querySelector("input") as HTMLInputElement;
141
147
  expect(input.max).toBe("2025-12-31T23:59:59");
142
148
  });
@@ -148,7 +154,7 @@ describe("DateTimePicker component", () => {
148
154
  new DateTime(2025, 1, 1, 10, 0, 0),
149
155
  );
150
156
  const { container } = render(() => (
151
- <DateTimePicker unit="minute" value={value()} onValueChange={setValue} />
157
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={value()} onValueChange={setValue} /></I18nProvider></ConfigProvider>
152
158
  ));
153
159
  const input = container.querySelector("input") as HTMLInputElement;
154
160
 
@@ -162,7 +168,7 @@ describe("DateTimePicker component", () => {
162
168
  describe("uncontrolled pattern", () => {
163
169
  it("manages value internally without onValueChange", () => {
164
170
  const { container } = render(() => (
165
- <DateTimePicker unit="minute" value={new DateTime(2025, 1, 1, 10, 0, 0)} />
171
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={new DateTime(2025, 1, 1, 10, 0, 0)} /></I18nProvider></ConfigProvider>
166
172
  ));
167
173
  const input = container.querySelector("input") as HTMLInputElement;
168
174
 
@@ -176,7 +182,7 @@ describe("DateTimePicker component", () => {
176
182
  describe("disabled state", () => {
177
183
  it("renders as div when disabled=true", () => {
178
184
  const { container } = render(() => (
179
- <DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} />
185
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
180
186
  ));
181
187
  const input = container.querySelector("input:not([aria-hidden])");
182
188
  const div = container.querySelector("div.sd-datetime-field");
@@ -187,14 +193,14 @@ describe("DateTimePicker component", () => {
187
193
 
188
194
  it("displays value when disabled", () => {
189
195
  const { getByText } = render(() => (
190
- <DateTimePicker unit="minute" disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} />
196
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
191
197
  ));
192
198
  expect(getByText("2025-03-15T10:30")).toBeTruthy();
193
199
  });
194
200
 
195
201
  it("applies disabled style", () => {
196
202
  const { container } = render(() => (
197
- <DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} />
203
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
198
204
  ));
199
205
  const div = container.querySelector("div.sd-datetime-field") as HTMLElement;
200
206
  expect(div.classList.contains("bg-base-100")).toBe(true);
@@ -204,7 +210,7 @@ describe("DateTimePicker component", () => {
204
210
  describe("readonly state", () => {
205
211
  it("renders as div when readonly=true", () => {
206
212
  const { container } = render(() => (
207
- <DateTimePicker readonly value={new DateTime(2025, 3, 15, 10, 30, 0)} />
213
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker readonly value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
208
214
  ));
209
215
  const input = container.querySelector("input:not([aria-hidden])");
210
216
  const div = container.querySelector("div.sd-datetime-field");
@@ -215,7 +221,7 @@ describe("DateTimePicker component", () => {
215
221
 
216
222
  it("displays value when readonly", () => {
217
223
  const { getByText } = render(() => (
218
- <DateTimePicker unit="minute" readonly value={new DateTime(2025, 3, 15, 10, 30, 0)} />
224
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" readonly value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
219
225
  ));
220
226
  expect(getByText("2025-03-15T10:30")).toBeTruthy();
221
227
  });
@@ -223,13 +229,13 @@ describe("DateTimePicker component", () => {
223
229
 
224
230
  describe("size option", () => {
225
231
  it("applies small padding when size=sm", () => {
226
- const { container } = render(() => <DateTimePicker size="sm" />);
232
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker size="sm" /></I18nProvider></ConfigProvider>);
227
233
  const wrapper = container.firstChild as HTMLElement;
228
234
  expect(wrapper.classList.contains("py-0.5")).toBe(true);
229
235
  });
230
236
 
231
237
  it("applies large padding when size=lg", () => {
232
- const { container } = render(() => <DateTimePicker size="lg" />);
238
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker size="lg" /></I18nProvider></ConfigProvider>);
233
239
  const wrapper = container.firstChild as HTMLElement;
234
240
  expect(wrapper.classList.contains("py-2")).toBe(true);
235
241
  });
@@ -237,7 +243,7 @@ describe("DateTimePicker component", () => {
237
243
 
238
244
  describe("inset style", () => {
239
245
  it("applies relative to outer and inset style to content when inset=true", () => {
240
- const { container } = render(() => <DateTimePicker inset />);
246
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset /></I18nProvider></ConfigProvider>);
241
247
  const outer = container.firstChild as HTMLElement;
242
248
  expect(outer.classList.contains("relative")).toBe(true);
243
249
  expect(outer.classList.contains("border-none")).toBe(false);
@@ -249,7 +255,7 @@ describe("DateTimePicker component", () => {
249
255
 
250
256
  it("shows content div and no input when inset + readonly", () => {
251
257
  const { container } = render(() => (
252
- <DateTimePicker inset readonly value={new DateTime(2025, 3, 15, 14, 30, 0)} />
258
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset readonly value={new DateTime(2025, 3, 15, 14, 30, 0)} /></I18nProvider></ConfigProvider>
253
259
  ));
254
260
  const outer = container.firstChild as HTMLElement;
255
261
  expect(outer.classList.contains("relative")).toBe(true);
@@ -263,7 +269,7 @@ describe("DateTimePicker component", () => {
263
269
 
264
270
  it("shows hidden content div and input when inset + editable", () => {
265
271
  const { container } = render(() => (
266
- <DateTimePicker inset value={new DateTime(2025, 3, 15, 14, 30, 0)} />
272
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset value={new DateTime(2025, 3, 15, 14, 30, 0)} /></I18nProvider></ConfigProvider>
267
273
  ));
268
274
  const outer = container.firstChild as HTMLElement;
269
275
 
@@ -275,7 +281,7 @@ describe("DateTimePicker component", () => {
275
281
  });
276
282
 
277
283
  it("shows NBSP in content div when inset + empty value", () => {
278
- const { container } = render(() => <DateTimePicker inset readonly />);
284
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset readonly /></I18nProvider></ConfigProvider>);
279
285
  const outer = container.firstChild as HTMLElement;
280
286
  const contentDiv = outer.querySelector("[data-datetime-field-content]") as HTMLElement;
281
287
  expect(contentDiv.textContent).toBe("\u00A0");
@@ -284,13 +290,13 @@ describe("DateTimePicker component", () => {
284
290
 
285
291
  describe("dark mode style", () => {
286
292
  it("applies dark mode border style", () => {
287
- const { container } = render(() => <DateTimePicker />);
293
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
288
294
  const wrapper = container.firstChild as HTMLElement;
289
295
  expect(wrapper.classList.contains("dark:border-base-700")).toBe(true);
290
296
  });
291
297
 
292
298
  it("applies dark mode background style", () => {
293
- const { container } = render(() => <DateTimePicker />);
299
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
294
300
  const wrapper = container.firstChild as HTMLElement;
295
301
  expect(wrapper.classList.contains("dark:bg-primary-950/30")).toBe(true);
296
302
  });
@@ -299,7 +305,7 @@ describe("DateTimePicker component", () => {
299
305
  describe("class merging", () => {
300
306
  it("merges custom class with existing styles", () => {
301
307
  // eslint-disable-next-line tailwindcss/no-custom-classname
302
- const { container } = render(() => <DateTimePicker class="my-custom-class" />);
308
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker class="my-custom-class" /></I18nProvider></ConfigProvider>);
303
309
  const wrapper = container.firstChild as HTMLElement;
304
310
  expect(wrapper.classList.contains("my-custom-class")).toBe(true);
305
311
  });
@@ -307,14 +313,14 @@ describe("DateTimePicker component", () => {
307
313
 
308
314
  describe("validation", () => {
309
315
  it("sets error message when required and value is empty", () => {
310
- const { container } = render(() => <DateTimePicker required value={undefined} />);
316
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker required value={undefined} /></I18nProvider></ConfigProvider>);
311
317
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
312
- expect(hiddenInput.validationMessage).toBe("This field is required");
318
+ expect(hiddenInput.validationMessage).toBe("This is a required field");
313
319
  });
314
320
 
315
321
  it("is valid when required and value exists", () => {
316
322
  const { container } = render(() => (
317
- <DateTimePicker required value={new DateTime(2024, 1, 1, 0, 0, 0)} />
323
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker required value={new DateTime(2024, 1, 1, 0, 0, 0)} /></I18nProvider></ConfigProvider>
318
324
  ));
319
325
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
320
326
  expect(hiddenInput.validity.valid).toBe(true);
@@ -322,10 +328,10 @@ describe("DateTimePicker component", () => {
322
328
 
323
329
  it("sets error message when min is violated", () => {
324
330
  const { container } = render(() => (
325
- <DateTimePicker
331
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker
326
332
  min={new DateTime(2024, 6, 1, 0, 0, 0)}
327
333
  value={new DateTime(2024, 1, 1, 0, 0, 0)}
328
- />
334
+ /></I18nProvider></ConfigProvider>
329
335
  ));
330
336
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
331
337
  expect(hiddenInput.validationMessage).not.toBe("");
@@ -333,10 +339,10 @@ describe("DateTimePicker component", () => {
333
339
 
334
340
  it("is valid when min is satisfied", () => {
335
341
  const { container } = render(() => (
336
- <DateTimePicker
342
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker
337
343
  min={new DateTime(2024, 1, 1, 0, 0, 0)}
338
344
  value={new DateTime(2024, 6, 1, 0, 0, 0)}
339
- />
345
+ /></I18nProvider></ConfigProvider>
340
346
  ));
341
347
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
342
348
  expect(hiddenInput.validity.valid).toBe(true);
@@ -344,10 +350,10 @@ describe("DateTimePicker component", () => {
344
350
 
345
351
  it("sets error message when max is violated", () => {
346
352
  const { container } = render(() => (
347
- <DateTimePicker
353
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker
348
354
  max={new DateTime(2024, 6, 1, 0, 0, 0)}
349
355
  value={new DateTime(2024, 12, 1, 0, 0, 0)}
350
- />
356
+ /></I18nProvider></ConfigProvider>
351
357
  ));
352
358
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
353
359
  expect(hiddenInput.validationMessage).not.toBe("");
@@ -355,10 +361,10 @@ describe("DateTimePicker component", () => {
355
361
 
356
362
  it("is valid when max is satisfied", () => {
357
363
  const { container } = render(() => (
358
- <DateTimePicker
364
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker
359
365
  max={new DateTime(2024, 12, 31, 23, 59, 59)}
360
366
  value={new DateTime(2024, 6, 1, 0, 0, 0)}
361
- />
367
+ /></I18nProvider></ConfigProvider>
362
368
  ));
363
369
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
364
370
  expect(hiddenInput.validity.valid).toBe(true);
@@ -366,7 +372,7 @@ describe("DateTimePicker component", () => {
366
372
 
367
373
  it("sets error message returned by validate function", () => {
368
374
  const { container } = render(() => (
369
- <DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => "커스텀 에러"} />
375
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => "커스텀 에러"} /></I18nProvider></ConfigProvider>
370
376
  ));
371
377
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
372
378
  expect(hiddenInput.validationMessage).toBe("커스텀 에러");
@@ -374,7 +380,7 @@ describe("DateTimePicker component", () => {
374
380
 
375
381
  it("is valid when validate function returns undefined", () => {
376
382
  const { container } = render(() => (
377
- <DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => undefined} />
383
+ <ConfigProvider clientName="test"><I18nProvider><DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => undefined} /></I18nProvider></ConfigProvider>
378
384
  ));
379
385
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
380
386
  expect(hiddenInput.validity.valid).toBe(true);