@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
@@ -3,6 +3,7 @@ import { createRoot } from "solid-js";
3
3
  import { render, waitFor } from "@solidjs/testing-library";
4
4
  import { NotificationProvider } from "../../../../src/components/feedback/notification/NotificationProvider";
5
5
  import { ConfigContext } from "../../../../src/providers/ConfigContext";
6
+ import { I18nProvider } from "../../../../src/providers/i18n/I18nContext";
6
7
  import {
7
8
  useNotification,
8
9
  type NotificationContextValue,
@@ -27,12 +28,14 @@ describe("NotificationProvider", () => {
27
28
 
28
29
  render(() => (
29
30
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
30
- <NotificationProvider>
31
- {(() => {
32
- notification = useNotification();
33
- return null;
34
- })()}
35
- </NotificationProvider>
31
+ <I18nProvider>
32
+ <NotificationProvider>
33
+ {(() => {
34
+ notification = useNotification();
35
+ return null;
36
+ })()}
37
+ </NotificationProvider>
38
+ </I18nProvider>
36
39
  </ConfigContext.Provider>
37
40
  ));
38
41
 
@@ -45,12 +48,14 @@ describe("NotificationProvider", () => {
45
48
 
46
49
  render(() => (
47
50
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
48
- <NotificationProvider>
49
- {(() => {
50
- notification = useNotification();
51
- return null;
52
- })()}
53
- </NotificationProvider>
51
+ <I18nProvider>
52
+ <NotificationProvider>
53
+ {(() => {
54
+ notification = useNotification();
55
+ return null;
56
+ })()}
57
+ </NotificationProvider>
58
+ </I18nProvider>
54
59
  </ConfigContext.Provider>
55
60
  ));
56
61
 
@@ -70,12 +75,14 @@ describe("NotificationProvider", () => {
70
75
 
71
76
  render(() => (
72
77
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
73
- <NotificationProvider>
74
- {(() => {
75
- notification = useNotification();
76
- return null;
77
- })()}
78
- </NotificationProvider>
78
+ <I18nProvider>
79
+ <NotificationProvider>
80
+ {(() => {
81
+ notification = useNotification();
82
+ return null;
83
+ })()}
84
+ </NotificationProvider>
85
+ </I18nProvider>
79
86
  </ConfigContext.Provider>
80
87
  ));
81
88
 
@@ -96,12 +103,14 @@ describe("NotificationProvider", () => {
96
103
 
97
104
  render(() => (
98
105
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
99
- <NotificationProvider>
100
- {(() => {
101
- notification = useNotification();
102
- return null;
103
- })()}
104
- </NotificationProvider>
106
+ <I18nProvider>
107
+ <NotificationProvider>
108
+ {(() => {
109
+ notification = useNotification();
110
+ return null;
111
+ })()}
112
+ </NotificationProvider>
113
+ </I18nProvider>
105
114
  </ConfigContext.Provider>
106
115
  ));
107
116
 
@@ -125,12 +134,14 @@ describe("NotificationProvider", () => {
125
134
 
126
135
  render(() => (
127
136
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
128
- <NotificationProvider>
129
- {(() => {
130
- notification = useNotification();
131
- return null;
132
- })()}
133
- </NotificationProvider>
137
+ <I18nProvider>
138
+ <NotificationProvider>
139
+ {(() => {
140
+ notification = useNotification();
141
+ return null;
142
+ })()}
143
+ </NotificationProvider>
144
+ </I18nProvider>
134
145
  </ConfigContext.Provider>
135
146
  ));
136
147
 
@@ -153,12 +164,14 @@ describe("NotificationProvider", () => {
153
164
 
154
165
  render(() => (
155
166
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
156
- <NotificationProvider>
157
- {(() => {
158
- notification = useNotification();
159
- return null;
160
- })()}
161
- </NotificationProvider>
167
+ <I18nProvider>
168
+ <NotificationProvider>
169
+ {(() => {
170
+ notification = useNotification();
171
+ return null;
172
+ })()}
173
+ </NotificationProvider>
174
+ </I18nProvider>
162
175
  </ConfigContext.Provider>
163
176
  ));
164
177
 
@@ -179,12 +192,14 @@ describe("NotificationProvider", () => {
179
192
 
180
193
  render(() => (
181
194
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
182
- <NotificationProvider>
183
- {(() => {
184
- notification = useNotification();
185
- return null;
186
- })()}
187
- </NotificationProvider>
195
+ <I18nProvider>
196
+ <NotificationProvider>
197
+ {(() => {
198
+ notification = useNotification();
199
+ return null;
200
+ })()}
201
+ </NotificationProvider>
202
+ </I18nProvider>
188
203
  </ConfigContext.Provider>
189
204
  ));
190
205
 
@@ -201,12 +216,14 @@ describe("NotificationProvider", () => {
201
216
 
202
217
  render(() => (
203
218
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
204
- <NotificationProvider>
205
- {(() => {
206
- notification = useNotification();
207
- return null;
208
- })()}
209
- </NotificationProvider>
219
+ <I18nProvider>
220
+ <NotificationProvider>
221
+ {(() => {
222
+ notification = useNotification();
223
+ return null;
224
+ })()}
225
+ </NotificationProvider>
226
+ </I18nProvider>
210
227
  </ConfigContext.Provider>
211
228
  ));
212
229
 
@@ -232,12 +249,14 @@ describe("NotificationProvider", () => {
232
249
 
233
250
  render(() => (
234
251
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
235
- <NotificationProvider>
236
- {(() => {
237
- notification = useNotification();
238
- return null;
239
- })()}
240
- </NotificationProvider>
252
+ <I18nProvider>
253
+ <NotificationProvider>
254
+ {(() => {
255
+ notification = useNotification();
256
+ return null;
257
+ })()}
258
+ </NotificationProvider>
259
+ </I18nProvider>
241
260
  </ConfigContext.Provider>
242
261
  ));
243
262
 
@@ -254,12 +273,14 @@ describe("NotificationProvider", () => {
254
273
 
255
274
  render(() => (
256
275
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
257
- <NotificationProvider>
258
- {(() => {
259
- notification = useNotification();
260
- return null;
261
- })()}
262
- </NotificationProvider>
276
+ <I18nProvider>
277
+ <NotificationProvider>
278
+ {(() => {
279
+ notification = useNotification();
280
+ return null;
281
+ })()}
282
+ </NotificationProvider>
283
+ </I18nProvider>
263
284
  </ConfigContext.Provider>
264
285
  ));
265
286
 
@@ -279,12 +300,14 @@ describe("NotificationProvider", () => {
279
300
 
280
301
  render(() => (
281
302
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
282
- <NotificationProvider>
283
- {(() => {
284
- notification = useNotification();
285
- return null;
286
- })()}
287
- </NotificationProvider>
303
+ <I18nProvider>
304
+ <NotificationProvider>
305
+ {(() => {
306
+ notification = useNotification();
307
+ return null;
308
+ })()}
309
+ </NotificationProvider>
310
+ </I18nProvider>
288
311
  </ConfigContext.Provider>
289
312
  ));
290
313
 
@@ -308,12 +331,14 @@ describe("NotificationProvider", () => {
308
331
 
309
332
  render(() => (
310
333
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
311
- <NotificationProvider>
312
- {(() => {
313
- notification = useNotification();
314
- return null;
315
- })()}
316
- </NotificationProvider>
334
+ <I18nProvider>
335
+ <NotificationProvider>
336
+ {(() => {
337
+ notification = useNotification();
338
+ return null;
339
+ })()}
340
+ </NotificationProvider>
341
+ </I18nProvider>
317
342
  </ConfigContext.Provider>
318
343
  ));
319
344
 
@@ -337,12 +362,14 @@ describe("NotificationProvider", () => {
337
362
 
338
363
  render(() => (
339
364
  <ConfigContext.Provider value={{ clientName: "testApp" }}>
340
- <NotificationProvider>
341
- {(() => {
342
- notification = useNotification();
343
- return null;
344
- })()}
345
- </NotificationProvider>
365
+ <I18nProvider>
366
+ <NotificationProvider>
367
+ {(() => {
368
+ notification = useNotification();
369
+ return null;
370
+ })()}
371
+ </NotificationProvider>
372
+ </I18nProvider>
346
373
  </ConfigContext.Provider>
347
374
  ));
348
375
 
@@ -1,29 +1,34 @@
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 { Checkbox } from "../../../../src/components/form-control/checkbox/Checkbox";
5
+ import { I18nProvider } from "../../../../src/providers/i18n/I18nContext";
6
+ import { ConfigProvider } from "../../../../src/providers/ConfigContext";
5
7
 
6
8
  describe("Checkbox component", () => {
9
+ beforeEach(() => {
10
+ localStorage.setItem("test.i18n-locale", JSON.stringify("en"));
11
+ });
7
12
  describe("basic rendering", () => {
8
13
  it("renders with checkbox role", () => {
9
- const { getByRole } = render(() => <Checkbox />);
14
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox /></I18nProvider></ConfigProvider>);
10
15
  expect(getByRole("checkbox")).toBeTruthy();
11
16
  });
12
17
 
13
18
  it("renders children as label", () => {
14
- const { getByText } = render(() => <Checkbox>동의합니다</Checkbox>);
19
+ const { getByText } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox>동의합니다</Checkbox></I18nProvider></ConfigProvider>);
15
20
  expect(getByText("동의합니다")).toBeTruthy();
16
21
  });
17
22
 
18
23
  it("defaults to unchecked", () => {
19
- const { getByRole } = render(() => <Checkbox />);
24
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox /></I18nProvider></ConfigProvider>);
20
25
  expect(getByRole("checkbox").getAttribute("aria-checked")).toBe("false");
21
26
  });
22
27
  });
23
28
 
24
29
  describe("click behavior", () => {
25
30
  it("toggles checked state on click", () => {
26
- const { getByRole } = render(() => <Checkbox />);
31
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox /></I18nProvider></ConfigProvider>);
27
32
  const checkbox = getByRole("checkbox");
28
33
 
29
34
  fireEvent.click(checkbox);
@@ -34,7 +39,7 @@ describe("Checkbox component", () => {
34
39
  });
35
40
 
36
41
  it("does not change when disabled", () => {
37
- const { getByRole } = render(() => <Checkbox disabled />);
42
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox disabled /></I18nProvider></ConfigProvider>);
38
43
  const checkbox = getByRole("checkbox");
39
44
 
40
45
  fireEvent.click(checkbox);
@@ -44,7 +49,7 @@ describe("Checkbox component", () => {
44
49
 
45
50
  describe("keyboard behavior", () => {
46
51
  it("toggles with Space key", () => {
47
- const { getByRole } = render(() => <Checkbox />);
52
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox /></I18nProvider></ConfigProvider>);
48
53
  const checkbox = getByRole("checkbox");
49
54
 
50
55
  fireEvent.keyDown(checkbox, { key: " " });
@@ -57,13 +62,13 @@ describe("Checkbox component", () => {
57
62
 
58
63
  describe("controlled pattern", () => {
59
64
  it("reflects value prop as checked state", () => {
60
- const { getByRole } = render(() => <Checkbox value={true} />);
65
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox value={true} /></I18nProvider></ConfigProvider>);
61
66
  expect(getByRole("checkbox").getAttribute("aria-checked")).toBe("true");
62
67
  });
63
68
 
64
69
  it("calls onValueChange on click", () => {
65
70
  const handleChange = vi.fn();
66
- const { getByRole } = render(() => <Checkbox value={false} onValueChange={handleChange} />);
71
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox value={false} onValueChange={handleChange} /></I18nProvider></ConfigProvider>);
67
72
 
68
73
  fireEvent.click(getByRole("checkbox"));
69
74
  expect(handleChange).toHaveBeenCalledWith(true);
@@ -71,7 +76,7 @@ describe("Checkbox component", () => {
71
76
 
72
77
  it("updates when external state changes", () => {
73
78
  const [value, setValue] = createSignal(false);
74
- const { getByRole } = render(() => <Checkbox value={value()} onValueChange={setValue} />);
79
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox value={value()} onValueChange={setValue} /></I18nProvider></ConfigProvider>);
75
80
 
76
81
  expect(getByRole("checkbox").getAttribute("aria-checked")).toBe("false");
77
82
 
@@ -82,21 +87,21 @@ describe("Checkbox component", () => {
82
87
 
83
88
  describe("style variants", () => {
84
89
  it("applies different styles per size", () => {
85
- const { getByRole: getDefault } = render(() => <Checkbox />);
86
- const { getByRole: getSm } = render(() => <Checkbox size="sm" />);
90
+ const { getByRole: getDefault } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox /></I18nProvider></ConfigProvider>);
91
+ const { getByRole: getSm } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox size="sm" /></I18nProvider></ConfigProvider>);
87
92
 
88
93
  expect(getDefault("checkbox").className).not.toBe(getSm("checkbox").className);
89
94
  });
90
95
 
91
96
  it("applies different styles when inset", () => {
92
- const { getByRole: getDefault } = render(() => <Checkbox />);
93
- const { getByRole: getInset } = render(() => <Checkbox inset />);
97
+ const { getByRole: getDefault } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox /></I18nProvider></ConfigProvider>);
98
+ const { getByRole: getInset } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox inset /></I18nProvider></ConfigProvider>);
94
99
 
95
100
  expect(getDefault("checkbox").className).not.toBe(getInset("checkbox").className);
96
101
  });
97
102
 
98
103
  it("applies disabled style", () => {
99
- const { getByRole } = render(() => <Checkbox disabled />);
104
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox disabled /></I18nProvider></ConfigProvider>);
100
105
  expect(getByRole("checkbox").classList.contains("opacity-30")).toBe(true);
101
106
  });
102
107
  });
@@ -104,32 +109,32 @@ describe("Checkbox component", () => {
104
109
  describe("class merging", () => {
105
110
  it("merges custom classes", () => {
106
111
  // eslint-disable-next-line tailwindcss/no-custom-classname
107
- const { getByRole } = render(() => <Checkbox class="my-custom-class" />);
112
+ const { getByRole } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox class="my-custom-class" /></I18nProvider></ConfigProvider>);
108
113
  expect(getByRole("checkbox").classList.contains("my-custom-class")).toBe(true);
109
114
  });
110
115
  });
111
116
 
112
117
  describe("validation", () => {
113
118
  it("sets error message when required and unchecked", () => {
114
- const { container } = render(() => <Checkbox required value={false} />);
119
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox required value={false} /></I18nProvider></ConfigProvider>);
115
120
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
116
121
  expect(hiddenInput.validationMessage).toBe("This is a required selection");
117
122
  });
118
123
 
119
124
  it("is valid when required and checked", () => {
120
- const { container } = render(() => <Checkbox required value={true} />);
125
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox required value={true} /></I18nProvider></ConfigProvider>);
121
126
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
122
127
  expect(hiddenInput.validity.valid).toBe(true);
123
128
  });
124
129
 
125
130
  it("sets error message returned by validate function", () => {
126
- const { container } = render(() => <Checkbox value={true} validate={() => "커스텀 에러"} />);
131
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox value={true} validate={() => "커스텀 에러"} /></I18nProvider></ConfigProvider>);
127
132
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
128
133
  expect(hiddenInput.validationMessage).toBe("커스텀 에러");
129
134
  });
130
135
 
131
136
  it("is valid when validate function returns undefined", () => {
132
- const { container } = render(() => <Checkbox value={true} validate={() => undefined} />);
137
+ const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><Checkbox value={true} validate={() => undefined} /></I18nProvider></ConfigProvider>);
133
138
  const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
134
139
  expect(hiddenInput.validity.valid).toBe(true);
135
140
  });
@@ -1,25 +1,34 @@
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 { CheckboxGroup } from "../../../../src/components/form-control/checkbox/CheckboxGroup";
5
+ import { I18nProvider } from "../../../../src/providers/i18n/I18nContext";
6
+ import { ConfigProvider } from "../../../../src/providers/ConfigContext";
5
7
 
6
8
  describe("CheckboxGroup component", () => {
9
+ beforeEach(() => {
10
+ localStorage.setItem("test.i18n-locale", JSON.stringify("en"));
11
+ });
7
12
  describe("basic rendering", () => {
8
13
  it("renders the container", () => {
9
14
  const { container } = render(() => (
10
- <CheckboxGroup>
11
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
12
- </CheckboxGroup>
15
+ <ConfigProvider clientName="test"><I18nProvider>
16
+ <CheckboxGroup>
17
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
18
+ </CheckboxGroup>
19
+ </I18nProvider></ConfigProvider>
13
20
  ));
14
21
  expect(container.querySelector("div")).toBeTruthy();
15
22
  });
16
23
 
17
24
  it("renders items as checkboxes", () => {
18
25
  const { getAllByRole } = render(() => (
19
- <CheckboxGroup>
20
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
21
- <CheckboxGroup.Item value="b">B</CheckboxGroup.Item>
22
- </CheckboxGroup>
26
+ <ConfigProvider clientName="test"><I18nProvider>
27
+ <CheckboxGroup>
28
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
29
+ <CheckboxGroup.Item value="b">B</CheckboxGroup.Item>
30
+ </CheckboxGroup>
31
+ </I18nProvider></ConfigProvider>
23
32
  ));
24
33
  expect(getAllByRole("checkbox").length).toBe(2);
25
34
  });
@@ -28,10 +37,12 @@ describe("CheckboxGroup component", () => {
28
37
  describe("controlled pattern", () => {
29
38
  it("reflects value prop as selected state", () => {
30
39
  const { getAllByRole } = render(() => (
31
- <CheckboxGroup value={["a"]}>
32
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
33
- <CheckboxGroup.Item value="b">B</CheckboxGroup.Item>
34
- </CheckboxGroup>
40
+ <ConfigProvider clientName="test"><I18nProvider>
41
+ <CheckboxGroup value={["a"]}>
42
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
43
+ <CheckboxGroup.Item value="b">B</CheckboxGroup.Item>
44
+ </CheckboxGroup>
45
+ </I18nProvider></ConfigProvider>
35
46
  ));
36
47
  const checkboxes = getAllByRole("checkbox");
37
48
  expect(checkboxes[0].getAttribute("aria-checked")).toBe("true");
@@ -41,9 +52,11 @@ describe("CheckboxGroup component", () => {
41
52
  it("calls onValueChange on toggle", () => {
42
53
  const handleChange = vi.fn();
43
54
  const { getAllByRole } = render(() => (
44
- <CheckboxGroup value={[]} onValueChange={handleChange}>
45
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
46
- </CheckboxGroup>
55
+ <ConfigProvider clientName="test"><I18nProvider>
56
+ <CheckboxGroup value={[]} onValueChange={handleChange}>
57
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
58
+ </CheckboxGroup>
59
+ </I18nProvider></ConfigProvider>
47
60
  ));
48
61
  fireEvent.click(getAllByRole("checkbox")[0]);
49
62
  expect(handleChange).toHaveBeenCalledWith(["a"]);
@@ -52,9 +65,11 @@ describe("CheckboxGroup component", () => {
52
65
  it("updates when external state changes", () => {
53
66
  const [value, setValue] = createSignal<string[]>([]);
54
67
  const { getAllByRole } = render(() => (
55
- <CheckboxGroup value={value()} onValueChange={setValue}>
56
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
57
- </CheckboxGroup>
68
+ <ConfigProvider clientName="test"><I18nProvider>
69
+ <CheckboxGroup value={value()} onValueChange={setValue}>
70
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
71
+ </CheckboxGroup>
72
+ </I18nProvider></ConfigProvider>
58
73
  ));
59
74
  expect(getAllByRole("checkbox")[0].getAttribute("aria-checked")).toBe("false");
60
75
  setValue(["a"]);
@@ -71,36 +86,44 @@ describe("CheckboxGroup component", () => {
71
86
 
72
87
  it("sets error message when required and no item selected", () => {
73
88
  const { container } = render(() => (
74
- <CheckboxGroup required value={[]}>
75
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
76
- </CheckboxGroup>
89
+ <ConfigProvider clientName="test"><I18nProvider>
90
+ <CheckboxGroup required value={[]}>
91
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
92
+ </CheckboxGroup>
93
+ </I18nProvider></ConfigProvider>
77
94
  ));
78
95
  expect(getGroupHiddenInput(container).validationMessage).toBe("Please select an item");
79
96
  });
80
97
 
81
98
  it("is valid when required and item is selected", () => {
82
99
  const { container } = render(() => (
83
- <CheckboxGroup required value={["a"]}>
84
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
85
- </CheckboxGroup>
100
+ <ConfigProvider clientName="test"><I18nProvider>
101
+ <CheckboxGroup required value={["a"]}>
102
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
103
+ </CheckboxGroup>
104
+ </I18nProvider></ConfigProvider>
86
105
  ));
87
106
  expect(getGroupHiddenInput(container).validity.valid).toBe(true);
88
107
  });
89
108
 
90
109
  it("sets error message returned by validate function", () => {
91
110
  const { container } = render(() => (
92
- <CheckboxGroup value={["a"]} validate={() => "커스텀 에러"}>
93
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
94
- </CheckboxGroup>
111
+ <ConfigProvider clientName="test"><I18nProvider>
112
+ <CheckboxGroup value={["a"]} validate={() => "커스텀 에러"}>
113
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
114
+ </CheckboxGroup>
115
+ </I18nProvider></ConfigProvider>
95
116
  ));
96
117
  expect(getGroupHiddenInput(container).validationMessage).toBe("커스텀 에러");
97
118
  });
98
119
 
99
120
  it("is valid when validate function returns undefined", () => {
100
121
  const { container } = render(() => (
101
- <CheckboxGroup value={["a"]} validate={() => undefined}>
102
- <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
103
- </CheckboxGroup>
122
+ <ConfigProvider clientName="test"><I18nProvider>
123
+ <CheckboxGroup value={["a"]} validate={() => undefined}>
124
+ <CheckboxGroup.Item value="a">A</CheckboxGroup.Item>
125
+ </CheckboxGroup>
126
+ </I18nProvider></ConfigProvider>
104
127
  ));
105
128
  expect(getGroupHiddenInput(container).validity.valid).toBe(true);
106
129
  });