@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,40 +1,46 @@
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 { DateOnly } from "@simplysm/core-common";
5
5
  import { DatePicker } from "../../../../src/components/form-control/field/DatePicker";
6
+ import { I18nProvider } from "../../../../src/providers/i18n/I18nContext";
7
+ import { ConfigProvider } from "../../../../src/providers/ConfigContext";
6
8
 
7
9
  describe("DatePicker 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=number when unit=year", () => {
10
- const { container } = render(() => <DatePicker unit="year" />);
16
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="year" /></I18nProvider></ConfigProvider>);
11
17
  const input = container.querySelector("input") as HTMLInputElement;
12
18
  expect(input).toBeTruthy();
13
19
  expect(input.type).toBe("number");
14
20
  });
15
21
 
16
22
  it("renders input type=month when unit=month", () => {
17
- const { container } = render(() => <DatePicker unit="month" />);
23
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="month" /></I18nProvider></ConfigProvider>);
18
24
  const input = container.querySelector("input") as HTMLInputElement;
19
25
  expect(input).toBeTruthy();
20
26
  expect(input.type).toBe("month");
21
27
  });
22
28
 
23
29
  it("renders input type=date when unit=date", () => {
24
- const { container } = render(() => <DatePicker unit="date" />);
30
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" /></I18nProvider></ConfigProvider>);
25
31
  const input = container.querySelector("input") as HTMLInputElement;
26
32
  expect(input).toBeTruthy();
27
33
  expect(input.type).toBe("date");
28
34
  });
29
35
 
30
36
  it("defaults autocomplete to one-time-code", () => {
31
- const { container } = render(() => <DatePicker />);
37
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker /></I18nProvider></ConfigProvider>);
32
38
  const input = container.querySelector("input") as HTMLInputElement;
33
39
  expect(input.autocomplete).toBe("one-time-code");
34
40
  });
35
41
 
36
42
  it("defaults unit to date", () => {
37
- const { container } = render(() => <DatePicker />);
43
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker /></I18nProvider></ConfigProvider>);
38
44
  const input = container.querySelector("input") as HTMLInputElement;
39
45
  expect(input.type).toBe("date");
40
46
  });
@@ -43,28 +49,28 @@ describe("DatePicker component", () => {
43
49
  describe("value conversion", () => {
44
50
  it("displays DateOnly in yyyy format for year type", () => {
45
51
  const dateOnly = new DateOnly(2025, 3, 15);
46
- const { container } = render(() => <DatePicker unit="year" value={dateOnly} />);
52
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="year" value={dateOnly} /></I18nProvider></ConfigProvider>);
47
53
  const input = container.querySelector("input") as HTMLInputElement;
48
54
  expect(input.value).toBe("2025");
49
55
  });
50
56
 
51
57
  it("displays DateOnly in yyyy-MM format for month type", () => {
52
58
  const dateOnly = new DateOnly(2025, 3, 15);
53
- const { container } = render(() => <DatePicker unit="month" value={dateOnly} />);
59
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="month" value={dateOnly} /></I18nProvider></ConfigProvider>);
54
60
  const input = container.querySelector("input") as HTMLInputElement;
55
61
  expect(input.value).toBe("2025-03");
56
62
  });
57
63
 
58
64
  it("displays DateOnly in yyyy-MM-dd format for date type", () => {
59
65
  const dateOnly = new DateOnly(2025, 3, 15);
60
- const { container } = render(() => <DatePicker unit="date" value={dateOnly} />);
66
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" value={dateOnly} /></I18nProvider></ConfigProvider>);
61
67
  const input = container.querySelector("input") as HTMLInputElement;
62
68
  expect(input.value).toBe("2025-03-15");
63
69
  });
64
70
 
65
71
  it("passes DateOnly converted from year input to onValueChange", () => {
66
72
  const handleChange = vi.fn();
67
- const { container } = render(() => <DatePicker unit="year" onValueChange={handleChange} />);
73
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="year" onValueChange={handleChange} /></I18nProvider></ConfigProvider>);
68
74
  const input = container.querySelector("input") as HTMLInputElement;
69
75
 
70
76
  fireEvent.change(input, { target: { value: "2025" } });
@@ -78,7 +84,7 @@ describe("DatePicker component", () => {
78
84
 
79
85
  it("passes DateOnly converted from month input to onValueChange", () => {
80
86
  const handleChange = vi.fn();
81
- const { container } = render(() => <DatePicker unit="month" onValueChange={handleChange} />);
87
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="month" onValueChange={handleChange} /></I18nProvider></ConfigProvider>);
82
88
  const input = container.querySelector("input") as HTMLInputElement;
83
89
 
84
90
  fireEvent.change(input, { target: { value: "2025-03" } });
@@ -92,7 +98,7 @@ describe("DatePicker component", () => {
92
98
 
93
99
  it("passes DateOnly converted from date input to onValueChange", () => {
94
100
  const handleChange = vi.fn();
95
- const { container } = render(() => <DatePicker unit="date" onValueChange={handleChange} />);
101
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" onValueChange={handleChange} /></I18nProvider></ConfigProvider>);
96
102
  const input = container.querySelector("input") as HTMLInputElement;
97
103
 
98
104
  fireEvent.change(input, { target: { value: "2025-03-15" } });
@@ -108,7 +114,7 @@ describe("DatePicker component", () => {
108
114
  const handleChange = vi.fn();
109
115
  const dateOnly = new DateOnly(2025, 3, 15);
110
116
  const { container } = render(() => (
111
- <DatePicker unit="date" value={dateOnly} onValueChange={handleChange} />
117
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" value={dateOnly} onValueChange={handleChange} /></I18nProvider></ConfigProvider>
112
118
  ));
113
119
  const input = container.querySelector("input") as HTMLInputElement;
114
120
 
@@ -121,42 +127,42 @@ describe("DatePicker component", () => {
121
127
  describe("min/max props", () => {
122
128
  it("converts min to string for date type", () => {
123
129
  const minDate = new DateOnly(2025, 1, 1);
124
- const { container } = render(() => <DatePicker unit="date" min={minDate} />);
130
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" min={minDate} /></I18nProvider></ConfigProvider>);
125
131
  const input = container.querySelector("input") as HTMLInputElement;
126
132
  expect(input.min).toBe("2025-01-01");
127
133
  });
128
134
 
129
135
  it("converts max to string for date type", () => {
130
136
  const maxDate = new DateOnly(2025, 12, 31);
131
- const { container } = render(() => <DatePicker unit="date" max={maxDate} />);
137
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" max={maxDate} /></I18nProvider></ConfigProvider>);
132
138
  const input = container.querySelector("input") as HTMLInputElement;
133
139
  expect(input.max).toBe("2025-12-31");
134
140
  });
135
141
 
136
142
  it("converts min to yyyy-MM format for month type", () => {
137
143
  const minDate = new DateOnly(2025, 1, 15);
138
- const { container } = render(() => <DatePicker unit="month" min={minDate} />);
144
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="month" min={minDate} /></I18nProvider></ConfigProvider>);
139
145
  const input = container.querySelector("input") as HTMLInputElement;
140
146
  expect(input.min).toBe("2025-01");
141
147
  });
142
148
 
143
149
  it("converts max to yyyy-MM format for month type", () => {
144
150
  const maxDate = new DateOnly(2025, 12, 15);
145
- const { container } = render(() => <DatePicker unit="month" max={maxDate} />);
151
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="month" max={maxDate} /></I18nProvider></ConfigProvider>);
146
152
  const input = container.querySelector("input") as HTMLInputElement;
147
153
  expect(input.max).toBe("2025-12");
148
154
  });
149
155
 
150
156
  it("converts min to number for year type", () => {
151
157
  const minDate = new DateOnly(2020, 1, 1);
152
- const { container } = render(() => <DatePicker unit="year" min={minDate} />);
158
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="year" min={minDate} /></I18nProvider></ConfigProvider>);
153
159
  const input = container.querySelector("input") as HTMLInputElement;
154
160
  expect(input.min).toBe("2020");
155
161
  });
156
162
 
157
163
  it("converts max to number for year type", () => {
158
164
  const maxDate = new DateOnly(2030, 12, 31);
159
- const { container } = render(() => <DatePicker unit="year" max={maxDate} />);
165
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="year" max={maxDate} /></I18nProvider></ConfigProvider>);
160
166
  const input = container.querySelector("input") as HTMLInputElement;
161
167
  expect(input.max).toBe("2030");
162
168
  });
@@ -166,7 +172,7 @@ describe("DatePicker component", () => {
166
172
  it("updates input value when external state changes", () => {
167
173
  const [value, setValue] = createSignal<DateOnly | undefined>(new DateOnly(2025, 1, 1));
168
174
  const { container } = render(() => (
169
- <DatePicker unit="date" value={value()} onValueChange={setValue} />
175
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" value={value()} onValueChange={setValue} /></I18nProvider></ConfigProvider>
170
176
  ));
171
177
  const input = container.querySelector("input") as HTMLInputElement;
172
178
 
@@ -180,7 +186,7 @@ describe("DatePicker component", () => {
180
186
  describe("uncontrolled pattern", () => {
181
187
  it("manages value internally without onValueChange", () => {
182
188
  const { container } = render(() => (
183
- <DatePicker unit="date" value={new DateOnly(2025, 1, 1)} />
189
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" value={new DateOnly(2025, 1, 1)} /></I18nProvider></ConfigProvider>
184
190
  ));
185
191
  const input = container.querySelector("input") as HTMLInputElement;
186
192
 
@@ -193,7 +199,7 @@ describe("DatePicker component", () => {
193
199
 
194
200
  describe("disabled state", () => {
195
201
  it("renders as div when disabled=true", () => {
196
- const { container } = render(() => <DatePicker disabled value={new DateOnly(2025, 3, 15)} />);
202
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker disabled value={new DateOnly(2025, 3, 15)} /></I18nProvider></ConfigProvider>);
197
203
  const input = container.querySelector("input:not([aria-hidden])");
198
204
  const div = container.querySelector("div.sd-date-field");
199
205
 
@@ -203,13 +209,13 @@ describe("DatePicker component", () => {
203
209
 
204
210
  it("displays value when disabled", () => {
205
211
  const { getByText } = render(() => (
206
- <DatePicker unit="date" disabled value={new DateOnly(2025, 3, 15)} />
212
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" disabled value={new DateOnly(2025, 3, 15)} /></I18nProvider></ConfigProvider>
207
213
  ));
208
214
  expect(getByText("2025-03-15")).toBeTruthy();
209
215
  });
210
216
 
211
217
  it("applies disabled style", () => {
212
- const { container } = render(() => <DatePicker disabled value={new DateOnly(2025, 3, 15)} />);
218
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker disabled value={new DateOnly(2025, 3, 15)} /></I18nProvider></ConfigProvider>);
213
219
  const div = container.querySelector("div.sd-date-field") as HTMLElement;
214
220
  expect(div.classList.contains("bg-base-100")).toBe(true);
215
221
  });
@@ -217,7 +223,7 @@ describe("DatePicker component", () => {
217
223
 
218
224
  describe("readonly state", () => {
219
225
  it("renders as div when readonly=true", () => {
220
- const { container } = render(() => <DatePicker readonly value={new DateOnly(2025, 3, 15)} />);
226
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker readonly value={new DateOnly(2025, 3, 15)} /></I18nProvider></ConfigProvider>);
221
227
  const input = container.querySelector("input:not([aria-hidden])");
222
228
  const div = container.querySelector("div.sd-date-field");
223
229
 
@@ -227,7 +233,7 @@ describe("DatePicker component", () => {
227
233
 
228
234
  it("displays value when readonly", () => {
229
235
  const { getByText } = render(() => (
230
- <DatePicker unit="date" readonly value={new DateOnly(2025, 3, 15)} />
236
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker unit="date" readonly value={new DateOnly(2025, 3, 15)} /></I18nProvider></ConfigProvider>
231
237
  ));
232
238
  expect(getByText("2025-03-15")).toBeTruthy();
233
239
  });
@@ -235,13 +241,13 @@ describe("DatePicker component", () => {
235
241
 
236
242
  describe("size option", () => {
237
243
  it("applies small padding when size=sm", () => {
238
- const { container } = render(() => <DatePicker size="sm" />);
244
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker size="sm" /></I18nProvider></ConfigProvider>);
239
245
  const wrapper = container.firstChild as HTMLElement;
240
246
  expect(wrapper.classList.contains("py-0.5")).toBe(true);
241
247
  });
242
248
 
243
249
  it("applies large padding when size=lg", () => {
244
- const { container } = render(() => <DatePicker size="lg" />);
250
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker size="lg" /></I18nProvider></ConfigProvider>);
245
251
  const wrapper = container.firstChild as HTMLElement;
246
252
  expect(wrapper.classList.contains("py-2")).toBe(true);
247
253
  });
@@ -249,7 +255,7 @@ describe("DatePicker component", () => {
249
255
 
250
256
  describe("inset style", () => {
251
257
  it("applies relative to outer and inset style to content when inset=true", () => {
252
- const { container } = render(() => <DatePicker inset />);
258
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker inset /></I18nProvider></ConfigProvider>);
253
259
  const outer = container.firstChild as HTMLElement;
254
260
  expect(outer.classList.contains("relative")).toBe(true);
255
261
  expect(outer.classList.contains("border-none")).toBe(false);
@@ -261,7 +267,7 @@ describe("DatePicker component", () => {
261
267
 
262
268
  it("shows content div and no input when inset + readonly", () => {
263
269
  const { container } = render(() => (
264
- <DatePicker inset readonly value={new DateOnly(2025, 3, 15)} />
270
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker inset readonly value={new DateOnly(2025, 3, 15)} /></I18nProvider></ConfigProvider>
265
271
  ));
266
272
  const outer = container.firstChild as HTMLElement;
267
273
  expect(outer.classList.contains("relative")).toBe(true);
@@ -274,7 +280,7 @@ describe("DatePicker component", () => {
274
280
  });
275
281
 
276
282
  it("shows hidden content div and input when inset + editable", () => {
277
- const { container } = render(() => <DatePicker inset value={new DateOnly(2025, 3, 15)} />);
283
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker inset value={new DateOnly(2025, 3, 15)} /></I18nProvider></ConfigProvider>);
278
284
  const outer = container.firstChild as HTMLElement;
279
285
 
280
286
  const contentDiv = outer.querySelector("[data-date-field-content]") as HTMLElement;
@@ -287,7 +293,7 @@ describe("DatePicker component", () => {
287
293
  });
288
294
 
289
295
  it("shows NBSP in content div when inset + empty value", () => {
290
- const { container } = render(() => <DatePicker inset readonly />);
296
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker inset readonly /></I18nProvider></ConfigProvider>);
291
297
  const outer = container.firstChild as HTMLElement;
292
298
  const contentDiv = outer.querySelector("[data-date-field-content]") as HTMLElement;
293
299
  expect(contentDiv.textContent).toBe("\u00A0");
@@ -296,13 +302,13 @@ describe("DatePicker component", () => {
296
302
 
297
303
  describe("dark mode style", () => {
298
304
  it("applies dark mode border style", () => {
299
- const { container } = render(() => <DatePicker />);
305
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker /></I18nProvider></ConfigProvider>);
300
306
  const wrapper = container.firstChild as HTMLElement;
301
307
  expect(wrapper.classList.contains("dark:border-base-700")).toBe(true);
302
308
  });
303
309
 
304
310
  it("applies dark mode background style", () => {
305
- const { container } = render(() => <DatePicker />);
311
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker /></I18nProvider></ConfigProvider>);
306
312
  const wrapper = container.firstChild as HTMLElement;
307
313
  expect(wrapper.classList.contains("dark:bg-primary-950/30")).toBe(true);
308
314
  });
@@ -311,7 +317,7 @@ describe("DatePicker component", () => {
311
317
  describe("class merging", () => {
312
318
  it("merges custom class with existing styles", () => {
313
319
  // eslint-disable-next-line tailwindcss/no-custom-classname
314
- const { container } = render(() => <DatePicker class="my-custom-class" />);
320
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker class="my-custom-class" /></I18nProvider></ConfigProvider>);
315
321
  const wrapper = container.firstChild as HTMLElement;
316
322
  expect(wrapper.classList.contains("my-custom-class")).toBe(true);
317
323
  });
@@ -319,20 +325,20 @@ describe("DatePicker component", () => {
319
325
 
320
326
  describe("validation", () => {
321
327
  it("sets error message when required and value is empty", () => {
322
- const { container } = render(() => <DatePicker required value={undefined} />);
328
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker required value={undefined} /></I18nProvider></ConfigProvider>);
323
329
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
324
- expect(hiddenInput.validationMessage).toBe("This field is required");
330
+ expect(hiddenInput.validationMessage).toBe("This is a required field");
325
331
  });
326
332
 
327
333
  it("is valid when required and value exists", () => {
328
- const { container } = render(() => <DatePicker required value={new DateOnly(2024, 1, 1)} />);
334
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DatePicker required value={new DateOnly(2024, 1, 1)} /></I18nProvider></ConfigProvider>);
329
335
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
330
336
  expect(hiddenInput.validity.valid).toBe(true);
331
337
  });
332
338
 
333
339
  it("sets error message when min is violated", () => {
334
340
  const { container } = render(() => (
335
- <DatePicker min={new DateOnly(2024, 6, 1)} value={new DateOnly(2024, 1, 1)} />
341
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker min={new DateOnly(2024, 6, 1)} value={new DateOnly(2024, 1, 1)} /></I18nProvider></ConfigProvider>
336
342
  ));
337
343
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
338
344
  expect(hiddenInput.validationMessage).not.toBe("");
@@ -340,7 +346,7 @@ describe("DatePicker component", () => {
340
346
 
341
347
  it("is valid when min is satisfied", () => {
342
348
  const { container } = render(() => (
343
- <DatePicker min={new DateOnly(2024, 1, 1)} value={new DateOnly(2024, 6, 1)} />
349
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker min={new DateOnly(2024, 1, 1)} value={new DateOnly(2024, 6, 1)} /></I18nProvider></ConfigProvider>
344
350
  ));
345
351
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
346
352
  expect(hiddenInput.validity.valid).toBe(true);
@@ -348,7 +354,7 @@ describe("DatePicker component", () => {
348
354
 
349
355
  it("sets error message when max is violated", () => {
350
356
  const { container } = render(() => (
351
- <DatePicker max={new DateOnly(2024, 6, 1)} value={new DateOnly(2024, 12, 1)} />
357
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker max={new DateOnly(2024, 6, 1)} value={new DateOnly(2024, 12, 1)} /></I18nProvider></ConfigProvider>
352
358
  ));
353
359
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
354
360
  expect(hiddenInput.validationMessage).not.toBe("");
@@ -356,7 +362,7 @@ describe("DatePicker component", () => {
356
362
 
357
363
  it("is valid when max is satisfied", () => {
358
364
  const { container } = render(() => (
359
- <DatePicker max={new DateOnly(2024, 12, 31)} value={new DateOnly(2024, 6, 1)} />
365
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker max={new DateOnly(2024, 12, 31)} value={new DateOnly(2024, 6, 1)} /></I18nProvider></ConfigProvider>
360
366
  ));
361
367
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
362
368
  expect(hiddenInput.validity.valid).toBe(true);
@@ -364,7 +370,7 @@ describe("DatePicker component", () => {
364
370
 
365
371
  it("sets error message returned by validate function", () => {
366
372
  const { container } = render(() => (
367
- <DatePicker value={new DateOnly(2024, 1, 1)} validate={() => "커스텀 에러"} />
373
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker value={new DateOnly(2024, 1, 1)} validate={() => "커스텀 에러"} /></I18nProvider></ConfigProvider>
368
374
  ));
369
375
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
370
376
  expect(hiddenInput.validationMessage).toBe("커스텀 에러");
@@ -372,7 +378,7 @@ describe("DatePicker component", () => {
372
378
 
373
379
  it("is valid when validate function returns undefined", () => {
374
380
  const { container } = render(() => (
375
- <DatePicker value={new DateOnly(2024, 1, 1)} validate={() => undefined} />
381
+ <ConfigProvider clientName="test"><I18nProvider><DatePicker value={new DateOnly(2024, 1, 1)} validate={() => undefined} /></I18nProvider></ConfigProvider>
376
382
  ));
377
383
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
378
384
  expect(hiddenInput.validity.valid).toBe(true);