@simplysm/solid 13.0.69 → 13.0.71

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 (495) hide show
  1. package/README.md +168 -195
  2. package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
  3. package/dist/components/data/calendar/Calendar.js +15 -2
  4. package/dist/components/data/calendar/Calendar.js.map +2 -2
  5. package/dist/components/data/kanban/KanbanContext.js +2 -2
  6. package/dist/components/data/kanban/KanbanContext.js.map +1 -1
  7. package/dist/components/data/list/List.d.ts +8 -8
  8. package/dist/components/data/list/ListContext.d.ts +1 -1
  9. package/dist/components/data/list/ListItem.d.ts +15 -15
  10. package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
  11. package/dist/components/data/sheet/DataSheet.js +6 -4
  12. package/dist/components/data/sheet/DataSheet.js.map +2 -2
  13. package/dist/components/data/sheet/DataSheetConfigDialog.js +8 -8
  14. package/dist/components/data/sheet/DataSheetConfigDialog.js.map +1 -1
  15. package/dist/components/data/sheet/types.d.ts +4 -4
  16. package/dist/components/data/sheet/types.d.ts.map +1 -1
  17. package/dist/components/disclosure/Collapse.d.ts +4 -4
  18. package/dist/components/disclosure/Dialog.d.ts +24 -24
  19. package/dist/components/disclosure/Dialog.d.ts.map +1 -1
  20. package/dist/components/disclosure/Dialog.js +7 -2
  21. package/dist/components/disclosure/Dialog.js.map +2 -2
  22. package/dist/components/disclosure/DialogContext.d.ts +25 -25
  23. package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
  24. package/dist/components/disclosure/DialogContext.js +1 -1
  25. package/dist/components/disclosure/DialogContext.js.map +1 -1
  26. package/dist/components/disclosure/DialogInstanceContext.d.ts +7 -7
  27. package/dist/components/disclosure/DialogInstanceContext.d.ts.map +1 -1
  28. package/dist/components/disclosure/DialogProvider.d.ts +3 -3
  29. package/dist/components/disclosure/Dropdown.d.ts +26 -24
  30. package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
  31. package/dist/components/disclosure/Dropdown.js +24 -8
  32. package/dist/components/disclosure/Dropdown.js.map +2 -2
  33. package/dist/components/disclosure/Tabs.js +1 -1
  34. package/dist/components/disclosure/Tabs.js.map +1 -1
  35. package/dist/components/disclosure/dialogZIndex.d.ts +9 -7
  36. package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
  37. package/dist/components/disclosure/dialogZIndex.js +4 -0
  38. package/dist/components/disclosure/dialogZIndex.js.map +1 -1
  39. package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
  40. package/dist/components/features/crud-detail/CrudDetail.js +34 -22
  41. package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
  42. package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
  43. package/dist/components/features/crud-sheet/CrudSheet.js +48 -33
  44. package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
  45. package/dist/components/features/crudRegistry.d.ts +16 -0
  46. package/dist/components/features/crudRegistry.d.ts.map +1 -0
  47. package/dist/components/features/crudRegistry.js +37 -0
  48. package/dist/components/features/crudRegistry.js.map +6 -0
  49. package/dist/components/features/data-select-button/DataSelectButton.d.ts +14 -14
  50. package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
  51. package/dist/components/features/data-select-button/DataSelectButton.js +27 -9
  52. package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
  53. package/dist/components/features/permission-table/PermissionTable.d.ts +3 -3
  54. package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
  55. package/dist/components/features/permission-table/PermissionTable.js +74 -85
  56. package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
  57. package/dist/components/features/shared-data/SharedDataSelect.d.ts +12 -12
  58. package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
  59. package/dist/components/features/shared-data/SharedDataSelect.js +10 -6
  60. package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
  61. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +10 -10
  62. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
  63. package/dist/components/features/shared-data/SharedDataSelectList.d.ts +23 -15
  64. package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
  65. package/dist/components/features/shared-data/SharedDataSelectList.js +191 -65
  66. package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
  67. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts +15 -0
  68. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts.map +1 -0
  69. package/dist/components/features/shared-data/SharedDataSelectListContext.js +27 -0
  70. package/dist/components/features/shared-data/SharedDataSelectListContext.js.map +6 -0
  71. package/dist/components/feedback/Progress.d.ts +1 -1
  72. package/dist/components/feedback/Progress.d.ts.map +1 -1
  73. package/dist/components/feedback/busy/BusyContainer.d.ts +2 -2
  74. package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -1
  75. package/dist/components/feedback/busy/BusyContext.d.ts +11 -11
  76. package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
  77. package/dist/components/feedback/busy/BusyContext.js +1 -1
  78. package/dist/components/feedback/busy/BusyContext.js.map +1 -1
  79. package/dist/components/feedback/busy/BusyProvider.d.ts +6 -6
  80. package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
  81. package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
  82. package/dist/components/feedback/notification/NotificationBanner.js +7 -3
  83. package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
  84. package/dist/components/feedback/notification/NotificationBell.js +2 -2
  85. package/dist/components/feedback/notification/NotificationBell.js.map +1 -1
  86. package/dist/components/feedback/notification/NotificationContext.d.ts +22 -22
  87. package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
  88. package/dist/components/feedback/notification/NotificationContext.js +1 -1
  89. package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
  90. package/dist/components/feedback/notification/NotificationProvider.d.ts +5 -5
  91. package/dist/components/feedback/notification/NotificationProvider.js +1 -1
  92. package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
  93. package/dist/components/feedback/print/PrintContext.js +1 -1
  94. package/dist/components/feedback/print/PrintContext.js.map +1 -1
  95. package/dist/components/form-control/DropdownTrigger.styles.d.ts +1 -1
  96. package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
  97. package/dist/components/form-control/ThemeToggle.d.ts +7 -7
  98. package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
  99. package/dist/components/form-control/ThemeToggle.js +3 -3
  100. package/dist/components/form-control/checkbox/Checkbox.js +1 -1
  101. package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
  102. package/dist/components/form-control/checkbox/Radio.js +1 -1
  103. package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
  104. package/dist/components/form-control/color-picker/ColorPicker.d.ts +12 -12
  105. package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
  106. package/dist/components/form-control/color-picker/ColorPicker.js +2 -2
  107. package/dist/components/form-control/combobox/Combobox.d.ts +22 -22
  108. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  109. package/dist/components/form-control/combobox/Combobox.js +2 -2
  110. package/dist/components/form-control/combobox/ComboboxContext.d.ts +4 -4
  111. package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
  112. package/dist/components/form-control/combobox/ComboboxContext.js +1 -1
  113. package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
  114. package/dist/components/form-control/combobox/ComboboxItem.d.ts +3 -3
  115. package/dist/components/form-control/combobox/ComboboxItem.d.ts.map +1 -1
  116. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +14 -14
  117. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
  118. package/dist/components/form-control/date-range-picker/DateRangePicker.js +20 -9
  119. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
  120. package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
  121. package/dist/components/form-control/editor/EditorToolbar.js +65 -20
  122. package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
  123. package/dist/components/form-control/editor/RichTextEditor.d.ts +6 -6
  124. package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
  125. package/dist/components/form-control/editor/RichTextEditor.js +1 -1
  126. package/dist/components/form-control/editor/editor.css +5 -5
  127. package/dist/components/form-control/field/DatePicker.d.ts +22 -22
  128. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  129. package/dist/components/form-control/field/DatePicker.js +4 -4
  130. package/dist/components/form-control/field/DatePicker.js.map +1 -1
  131. package/dist/components/form-control/field/DateTimePicker.d.ts +21 -21
  132. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  133. package/dist/components/form-control/field/DateTimePicker.js +4 -4
  134. package/dist/components/form-control/field/DateTimePicker.js.map +1 -1
  135. package/dist/components/form-control/field/FieldPlaceholder.d.ts +1 -1
  136. package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -1
  137. package/dist/components/form-control/field/NumberInput.d.ts +23 -23
  138. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  139. package/dist/components/form-control/field/NumberInput.js +4 -4
  140. package/dist/components/form-control/field/NumberInput.js.map +1 -1
  141. package/dist/components/form-control/field/TextInput.d.ts +25 -25
  142. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  143. package/dist/components/form-control/field/TextInput.js +5 -5
  144. package/dist/components/form-control/field/TextInput.js.map +1 -1
  145. package/dist/components/form-control/field/Textarea.d.ts +19 -19
  146. package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
  147. package/dist/components/form-control/field/Textarea.js +4 -4
  148. package/dist/components/form-control/field/Textarea.js.map +1 -1
  149. package/dist/components/form-control/field/TimePicker.d.ts +20 -20
  150. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  151. package/dist/components/form-control/field/TimePicker.js +4 -4
  152. package/dist/components/form-control/field/TimePicker.js.map +1 -1
  153. package/dist/components/form-control/numpad/Numpad.d.ts +11 -11
  154. package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
  155. package/dist/components/form-control/select/Select.d.ts +26 -26
  156. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  157. package/dist/components/form-control/select/Select.js +34 -23
  158. package/dist/components/form-control/select/Select.js.map +2 -2
  159. package/dist/components/form-control/select/SelectContext.d.ts +7 -7
  160. package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
  161. package/dist/components/form-control/select/SelectContext.js +1 -1
  162. package/dist/components/form-control/select/SelectContext.js.map +1 -1
  163. package/dist/components/form-control/select/SelectItem.d.ts +4 -4
  164. package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
  165. package/dist/components/form-control/state-preset/StatePreset.js +8 -8
  166. package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
  167. package/dist/components/layout/FormTable.js +4 -4
  168. package/dist/components/layout/sidebar/Sidebar.d.ts +5 -5
  169. package/dist/components/layout/sidebar/SidebarContainer.d.ts +11 -11
  170. package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
  171. package/dist/components/layout/sidebar/SidebarContainer.js +6 -1
  172. package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
  173. package/dist/components/layout/sidebar/SidebarContext.d.ts +7 -7
  174. package/dist/components/layout/sidebar/SidebarContext.js +1 -1
  175. package/dist/components/layout/sidebar/SidebarContext.js.map +1 -1
  176. package/dist/components/layout/sidebar/SidebarMenu.d.ts +11 -11
  177. package/dist/components/layout/sidebar/SidebarUser.d.ts +14 -14
  178. package/dist/components/layout/topbar/Topbar.d.ts +6 -6
  179. package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
  180. package/dist/components/layout/topbar/Topbar.js +11 -6
  181. package/dist/components/layout/topbar/Topbar.js.map +2 -2
  182. package/dist/components/layout/topbar/TopbarContainer.d.ts +6 -6
  183. package/dist/components/layout/topbar/TopbarContext.js +2 -2
  184. package/dist/components/layout/topbar/TopbarContext.js.map +1 -1
  185. package/dist/components/layout/topbar/TopbarMenu.d.ts +11 -11
  186. package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
  187. package/dist/components/layout/topbar/TopbarMenu.js +5 -1
  188. package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
  189. package/dist/components/layout/topbar/TopbarUser.d.ts +9 -9
  190. package/dist/directives/ripple.d.ts +5 -5
  191. package/dist/helpers/createAppStructure.d.ts.map +1 -1
  192. package/dist/helpers/createAppStructure.js +7 -3
  193. package/dist/helpers/createAppStructure.js.map +1 -1
  194. package/dist/helpers/createHmrSafeContext.d.ts +3 -0
  195. package/dist/helpers/createHmrSafeContext.d.ts.map +1 -0
  196. package/dist/helpers/createHmrSafeContext.js +10 -0
  197. package/dist/helpers/createHmrSafeContext.js.map +6 -0
  198. package/dist/helpers/createSlotComponent.d.ts +3 -3
  199. package/dist/helpers/mergeStyles.d.ts +8 -8
  200. package/dist/hooks/createControllableSignal.d.ts +10 -10
  201. package/dist/hooks/createControllableStore.d.ts +6 -6
  202. package/dist/hooks/createIMEHandler.d.ts +7 -7
  203. package/dist/hooks/createMountTransition.d.ts +4 -4
  204. package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
  205. package/dist/hooks/createSelectionGroup.js +4 -3
  206. package/dist/hooks/createSelectionGroup.js.map +2 -2
  207. package/dist/hooks/createSlotSignal.d.ts +2 -2
  208. package/dist/hooks/useLocalStorage.d.ts +11 -11
  209. package/dist/hooks/useLogger.d.ts +1 -1
  210. package/dist/hooks/useLogger.d.ts.map +1 -1
  211. package/dist/hooks/useLogger.js +1 -1
  212. package/dist/hooks/useLogger.js.map +1 -1
  213. package/dist/hooks/useRouterLink.d.ts +10 -10
  214. package/dist/hooks/useRouterLink.d.ts.map +1 -1
  215. package/dist/index.d.ts +2 -1
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +2 -1
  218. package/dist/index.js.map +1 -1
  219. package/dist/providers/ClipboardProvider.d.ts +5 -5
  220. package/dist/providers/ConfigContext.d.ts +6 -6
  221. package/dist/providers/ConfigContext.js +2 -2
  222. package/dist/providers/ConfigContext.js.map +1 -1
  223. package/dist/providers/ErrorLoggerProvider.d.ts +3 -3
  224. package/dist/providers/LoggerContext.d.ts +13 -13
  225. package/dist/providers/PwaUpdateProvider.d.ts +4 -4
  226. package/dist/providers/PwaUpdateProvider.js +2 -2
  227. package/dist/providers/PwaUpdateProvider.js.map +1 -1
  228. package/dist/providers/ServiceClientContext.d.ts +8 -8
  229. package/dist/providers/ServiceClientContext.d.ts.map +1 -1
  230. package/dist/providers/ServiceClientContext.js +1 -1
  231. package/dist/providers/ServiceClientContext.js.map +1 -1
  232. package/dist/providers/ServiceClientProvider.d.ts +6 -6
  233. package/dist/providers/ServiceClientProvider.js +7 -7
  234. package/dist/providers/ServiceClientProvider.js.map +1 -1
  235. package/dist/providers/SyncStorageContext.d.ts +14 -14
  236. package/dist/providers/SystemProvider.d.ts.map +1 -1
  237. package/dist/providers/SystemProvider.js +21 -16
  238. package/dist/providers/SystemProvider.js.map +2 -2
  239. package/dist/providers/ThemeContext.d.ts +20 -20
  240. package/dist/providers/ThemeContext.d.ts.map +1 -1
  241. package/dist/providers/ThemeContext.js +1 -1
  242. package/dist/providers/ThemeContext.js.map +1 -1
  243. package/dist/providers/i18n/I18nContext.d.ts +44 -0
  244. package/dist/providers/i18n/I18nContext.d.ts.map +1 -0
  245. package/dist/providers/i18n/I18nContext.js +73 -0
  246. package/dist/providers/i18n/I18nContext.js.map +6 -0
  247. package/dist/providers/i18n/I18nContext.types.d.ts +28 -0
  248. package/dist/providers/i18n/I18nContext.types.d.ts.map +1 -0
  249. package/dist/providers/i18n/I18nContext.types.js +1 -0
  250. package/dist/providers/i18n/I18nContext.types.js.map +6 -0
  251. package/dist/providers/i18n/i18nUtils.d.ts +18 -0
  252. package/dist/providers/i18n/i18nUtils.d.ts.map +1 -0
  253. package/dist/providers/i18n/i18nUtils.js +25 -0
  254. package/dist/providers/i18n/i18nUtils.js.map +6 -0
  255. package/dist/providers/i18n/locales/en.d.ts +163 -0
  256. package/dist/providers/i18n/locales/en.d.ts.map +1 -0
  257. package/dist/providers/i18n/locales/en.js +165 -0
  258. package/dist/providers/i18n/locales/en.js.map +6 -0
  259. package/dist/providers/i18n/locales/ko.d.ts +163 -0
  260. package/dist/providers/i18n/locales/ko.d.ts.map +1 -0
  261. package/dist/providers/i18n/locales/ko.js +165 -0
  262. package/dist/providers/i18n/locales/ko.js.map +6 -0
  263. package/dist/providers/shared-data/SharedDataChangeEvent.d.ts +4 -4
  264. package/dist/providers/shared-data/SharedDataContext.d.ts +28 -28
  265. package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
  266. package/dist/providers/shared-data/SharedDataContext.js +1 -1
  267. package/dist/providers/shared-data/SharedDataContext.js.map +1 -1
  268. package/dist/providers/shared-data/SharedDataProvider.d.ts +9 -9
  269. package/dist/providers/shared-data/SharedDataProvider.js +4 -4
  270. package/dist/providers/shared-data/SharedDataProvider.js.map +1 -1
  271. package/package.json +9 -8
  272. package/src/components/data/calendar/Calendar.tsx +10 -4
  273. package/src/components/data/kanban/Kanban.tsx +14 -14
  274. package/src/components/data/kanban/KanbanContext.ts +3 -3
  275. package/src/components/data/list/List.tsx +10 -10
  276. package/src/components/data/list/ListContext.ts +1 -1
  277. package/src/components/data/list/ListItem.styles.ts +8 -8
  278. package/src/components/data/list/ListItem.tsx +15 -15
  279. package/src/components/data/sheet/DataSheet.styles.ts +22 -22
  280. package/src/components/data/sheet/DataSheet.tsx +52 -48
  281. package/src/components/data/sheet/DataSheetColumn.tsx +1 -1
  282. package/src/components/data/sheet/DataSheetConfigDialog.tsx +9 -9
  283. package/src/components/data/sheet/sheetUtils.ts +7 -7
  284. package/src/components/data/sheet/types.ts +16 -16
  285. package/src/components/disclosure/Collapse.tsx +11 -11
  286. package/src/components/disclosure/Dialog.tsx +60 -57
  287. package/src/components/disclosure/DialogContext.ts +26 -26
  288. package/src/components/disclosure/DialogInstanceContext.ts +7 -7
  289. package/src/components/disclosure/DialogProvider.tsx +5 -5
  290. package/src/components/disclosure/Dropdown.tsx +89 -75
  291. package/src/components/disclosure/Tabs.tsx +1 -1
  292. package/src/components/disclosure/dialogZIndex.ts +16 -11
  293. package/src/components/display/Echarts.tsx +4 -4
  294. package/src/components/features/address/AddressSearch.tsx +2 -2
  295. package/src/components/features/crud-detail/CrudDetail.tsx +34 -21
  296. package/src/components/features/crud-detail/CrudDetailAfter.tsx +1 -1
  297. package/src/components/features/crud-detail/CrudDetailBefore.tsx +1 -1
  298. package/src/components/features/crud-detail/CrudDetailTools.tsx +1 -1
  299. package/src/components/features/crud-sheet/CrudSheet.tsx +52 -40
  300. package/src/components/features/crud-sheet/CrudSheetColumn.tsx +1 -1
  301. package/src/components/features/crud-sheet/CrudSheetFilter.tsx +1 -1
  302. package/src/components/features/crud-sheet/CrudSheetHeader.tsx +1 -1
  303. package/src/components/features/crud-sheet/CrudSheetTools.tsx +1 -1
  304. package/src/components/features/crudRegistry.ts +60 -0
  305. package/src/components/features/data-select-button/DataSelectButton.tsx +34 -32
  306. package/src/components/features/permission-table/PermissionTable.tsx +70 -64
  307. package/src/components/features/shared-data/SharedDataSelect.tsx +24 -22
  308. package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
  309. package/src/components/features/shared-data/SharedDataSelectList.tsx +231 -59
  310. package/src/components/features/shared-data/SharedDataSelectListContext.ts +39 -0
  311. package/src/components/feedback/Progress.tsx +1 -1
  312. package/src/components/feedback/busy/BusyContainer.tsx +6 -6
  313. package/src/components/feedback/busy/BusyContext.ts +12 -12
  314. package/src/components/feedback/busy/BusyProvider.tsx +6 -6
  315. package/src/components/feedback/notification/NotificationBanner.tsx +3 -1
  316. package/src/components/feedback/notification/NotificationBell.tsx +4 -4
  317. package/src/components/feedback/notification/NotificationContext.ts +28 -28
  318. package/src/components/feedback/notification/NotificationProvider.tsx +9 -9
  319. package/src/components/feedback/print/PrintContext.ts +1 -1
  320. package/src/components/form-control/Button.tsx +1 -1
  321. package/src/components/form-control/DropdownTrigger.styles.ts +1 -1
  322. package/src/components/form-control/Invalid.tsx +5 -5
  323. package/src/components/form-control/ThemeToggle.tsx +10 -10
  324. package/src/components/form-control/checkbox/Checkbox.styles.ts +8 -8
  325. package/src/components/form-control/checkbox/Checkbox.tsx +2 -2
  326. package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
  327. package/src/components/form-control/checkbox/Radio.tsx +2 -2
  328. package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
  329. package/src/components/form-control/color-picker/ColorPicker.tsx +17 -17
  330. package/src/components/form-control/combobox/Combobox.tsx +55 -55
  331. package/src/components/form-control/combobox/ComboboxContext.ts +5 -5
  332. package/src/components/form-control/combobox/ComboboxItem.tsx +3 -3
  333. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +40 -26
  334. package/src/components/form-control/editor/EditorToolbar.tsx +52 -50
  335. package/src/components/form-control/editor/RichTextEditor.tsx +16 -16
  336. package/src/components/form-control/editor/editor.css +5 -5
  337. package/src/components/form-control/field/DatePicker.tsx +39 -39
  338. package/src/components/form-control/field/DateTimePicker.tsx +38 -38
  339. package/src/components/form-control/field/Field.styles.ts +11 -11
  340. package/src/components/form-control/field/FieldPlaceholder.tsx +1 -1
  341. package/src/components/form-control/field/NumberInput.tsx +63 -63
  342. package/src/components/form-control/field/TextInput.tsx +48 -48
  343. package/src/components/form-control/field/Textarea.tsx +32 -32
  344. package/src/components/form-control/field/TimePicker.tsx +37 -37
  345. package/src/components/form-control/numpad/Numpad.tsx +26 -26
  346. package/src/components/form-control/select/Select.tsx +82 -86
  347. package/src/components/form-control/select/SelectContext.ts +8 -8
  348. package/src/components/form-control/select/SelectItem.tsx +5 -5
  349. package/src/components/form-control/state-preset/StatePreset.tsx +13 -13
  350. package/src/components/layout/FormTable.tsx +4 -4
  351. package/src/components/layout/sidebar/Sidebar.tsx +8 -8
  352. package/src/components/layout/sidebar/SidebarContainer.tsx +19 -17
  353. package/src/components/layout/sidebar/SidebarContext.ts +8 -8
  354. package/src/components/layout/sidebar/SidebarMenu.tsx +19 -19
  355. package/src/components/layout/sidebar/SidebarUser.tsx +14 -14
  356. package/src/components/layout/topbar/Topbar.tsx +15 -13
  357. package/src/components/layout/topbar/TopbarContainer.tsx +6 -6
  358. package/src/components/layout/topbar/TopbarContext.ts +2 -2
  359. package/src/components/layout/topbar/TopbarMenu.tsx +18 -16
  360. package/src/components/layout/topbar/TopbarUser.tsx +9 -9
  361. package/src/directives/ripple.ts +8 -8
  362. package/src/helpers/createAppStructure.ts +15 -8
  363. package/src/helpers/createHmrSafeContext.ts +8 -0
  364. package/src/helpers/createSlotComponent.ts +4 -4
  365. package/src/helpers/mergeStyles.ts +11 -11
  366. package/src/hooks/createControllableSignal.ts +11 -11
  367. package/src/hooks/createControllableStore.ts +8 -8
  368. package/src/hooks/createIMEHandler.ts +7 -7
  369. package/src/hooks/createMountTransition.ts +4 -4
  370. package/src/hooks/createSelectionGroup.tsx +5 -3
  371. package/src/hooks/createSlotSignal.ts +2 -2
  372. package/src/hooks/useLocalStorage.ts +13 -13
  373. package/src/hooks/useLogger.ts +2 -2
  374. package/src/hooks/useRouterLink.ts +15 -15
  375. package/src/index.ts +4 -3
  376. package/src/providers/ClipboardProvider.tsx +19 -19
  377. package/src/providers/ConfigContext.tsx +8 -8
  378. package/src/providers/ErrorLoggerProvider.tsx +3 -3
  379. package/src/providers/LoggerContext.tsx +13 -13
  380. package/src/providers/PwaUpdateProvider.tsx +6 -6
  381. package/src/providers/ServiceClientContext.ts +9 -9
  382. package/src/providers/ServiceClientProvider.tsx +15 -15
  383. package/src/providers/SyncStorageContext.tsx +15 -15
  384. package/src/providers/SystemProvider.tsx +15 -12
  385. package/src/providers/ThemeContext.tsx +26 -26
  386. package/src/providers/i18n/I18nContext.tsx +129 -0
  387. package/src/providers/i18n/I18nContext.types.ts +30 -0
  388. package/src/providers/i18n/i18nUtils.ts +38 -0
  389. package/src/providers/i18n/locales/en.ts +161 -0
  390. package/src/providers/i18n/locales/ko.ts +161 -0
  391. package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -4
  392. package/src/providers/shared-data/SharedDataContext.ts +29 -29
  393. package/src/providers/shared-data/SharedDataProvider.tsx +21 -21
  394. package/src/styles/patterns.styles.ts +6 -6
  395. package/src/styles/tokens.styles.ts +5 -5
  396. package/tailwind.config.ts +1 -1
  397. package/tailwind.css +4 -4
  398. package/tests/components/data/List.spec.tsx +689 -0
  399. package/tests/components/data/Pagination.spec.tsx +336 -0
  400. package/tests/components/data/Table.spec.tsx +55 -0
  401. package/tests/components/data/kanban/Kanban.selection.spec.tsx +213 -0
  402. package/tests/components/data/sheet/DataSheet.spec.tsx +645 -0
  403. package/tests/components/disclosure/Collapse.spec.tsx +173 -0
  404. package/tests/components/disclosure/Dialog.spec.tsx +438 -0
  405. package/tests/components/disclosure/DialogProvider.spec.tsx +142 -0
  406. package/tests/components/disclosure/Dropdown.spec.tsx +333 -0
  407. package/tests/components/disclosure/Tabs.spec.tsx +220 -0
  408. package/tests/components/disclosure/dialogZIndex.spec.ts +45 -0
  409. package/tests/components/display/Alert.spec.tsx +47 -0
  410. package/tests/components/display/Barcode.spec.tsx +61 -0
  411. package/tests/components/display/Card.spec.tsx +41 -0
  412. package/tests/components/display/Link.spec.tsx +62 -0
  413. package/tests/components/display/Tag.spec.tsx +47 -0
  414. package/tests/components/features/address/AddressSearch.spec.tsx +45 -0
  415. package/tests/components/features/crud-detail/CrudDetail.spec.tsx +537 -0
  416. package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +491 -0
  417. package/tests/components/features/crudRegistry.spec.ts +119 -0
  418. package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +482 -0
  419. package/tests/components/features/permission-table/PermissionTable.spec.tsx +288 -0
  420. package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +448 -0
  421. package/tests/components/feedback/busy/BusyContainer.spec.tsx +80 -0
  422. package/tests/components/feedback/notification/LiveRegion.spec.tsx +52 -0
  423. package/tests/components/feedback/notification/NotificationBanner.spec.tsx +187 -0
  424. package/tests/components/feedback/notification/NotificationBell.spec.tsx +226 -0
  425. package/tests/components/feedback/notification/NotificationContext.spec.tsx +362 -0
  426. package/tests/components/feedback/print/Print.spec.tsx +45 -0
  427. package/tests/components/form-control/Button.spec.tsx +119 -0
  428. package/tests/components/form-control/Invalid.spec.tsx +131 -0
  429. package/tests/components/form-control/checkbox/Checkbox.spec.tsx +137 -0
  430. package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +108 -0
  431. package/tests/components/form-control/checkbox/Radio.spec.tsx +138 -0
  432. package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +108 -0
  433. package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +94 -0
  434. package/tests/components/form-control/combobox/Combobox.spec.tsx +253 -0
  435. package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +88 -0
  436. package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +208 -0
  437. package/tests/components/form-control/field/DatePicker.spec.tsx +381 -0
  438. package/tests/components/form-control/field/DateTimePicker.spec.tsx +383 -0
  439. package/tests/components/form-control/field/NumberInput.spec.tsx +371 -0
  440. package/tests/components/form-control/field/TextInput.spec.tsx +341 -0
  441. package/tests/components/form-control/field/Textarea.spec.tsx +224 -0
  442. package/tests/components/form-control/field/TimePicker.spec.tsx +315 -0
  443. package/tests/components/form-control/numpad/Numpad.spec.tsx +248 -0
  444. package/tests/components/form-control/select/Select.spec.tsx +676 -0
  445. package/tests/components/form-control/select/SelectItem.spec.tsx +174 -0
  446. package/tests/components/layout/FormGroup.spec.tsx +104 -0
  447. package/tests/components/layout/FormTable.spec.tsx +43 -0
  448. package/tests/components/layout/sidebar/Sidebar.spec.tsx +192 -0
  449. package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +261 -0
  450. package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +219 -0
  451. package/tests/components/layout/sidebar/SidebarUser.spec.tsx +133 -0
  452. package/tests/components/layout/topbar/TopbarActions.spec.tsx +77 -0
  453. package/tests/components/layout/topbar/TopbarContainer.spec.tsx +38 -0
  454. package/tests/components/layout/topbar/createTopbarActions.spec.tsx +66 -0
  455. package/tests/directives/ripple.spec.tsx +130 -0
  456. package/tests/helpers/createAppStructure.spec.tsx +843 -0
  457. package/tests/helpers/mergeStyles.spec.ts +172 -0
  458. package/tests/hooks/createControllableSignal.spec.ts +194 -0
  459. package/tests/hooks/createIMEHandler.spec.ts +80 -0
  460. package/tests/hooks/createMountTransition.spec.ts +86 -0
  461. package/tests/hooks/useLocalStorage.spec.tsx +223 -0
  462. package/tests/hooks/useLogger.spec.tsx +116 -0
  463. package/tests/hooks/usePrint.spec.tsx +134 -0
  464. package/tests/hooks/useRouterLink.spec.tsx +183 -0
  465. package/tests/hooks/useSyncConfig.spec.tsx +304 -0
  466. package/tests/providers/ClipboardProvider.spec.tsx +20 -0
  467. package/tests/providers/ConfigContext.spec.tsx +42 -0
  468. package/tests/providers/ErrorLoggerProvider.spec.tsx +73 -0
  469. package/tests/providers/LoggerContext.spec.tsx +76 -0
  470. package/tests/providers/PwaUpdateProvider.spec.tsx +22 -0
  471. package/tests/providers/ServiceClientContext.spec.tsx +88 -0
  472. package/tests/providers/SyncStorageContext.spec.tsx +77 -0
  473. package/tests/providers/i18n/I18nContext.spec.tsx +110 -0
  474. package/tests/providers/shared-data/SharedDataProvider.spec.tsx +401 -0
  475. package/tests/vitest-env.d.ts +1 -0
  476. package/dist/components/form-control/select-list/SelectList.d.ts +0 -54
  477. package/dist/components/form-control/select-list/SelectList.d.ts.map +0 -1
  478. package/dist/components/form-control/select-list/SelectList.js +0 -280
  479. package/dist/components/form-control/select-list/SelectList.js.map +0 -6
  480. package/dist/components/form-control/select-list/SelectListContext.d.ts +0 -13
  481. package/dist/components/form-control/select-list/SelectListContext.d.ts.map +0 -1
  482. package/dist/components/form-control/select-list/SelectListContext.js +0 -14
  483. package/dist/components/form-control/select-list/SelectListContext.js.map +0 -6
  484. package/docs/data-components.md +0 -782
  485. package/docs/disclosure.md +0 -254
  486. package/docs/display.md +0 -153
  487. package/docs/feedback.md +0 -238
  488. package/docs/form-controls.md +0 -1068
  489. package/docs/helpers.md +0 -54
  490. package/docs/hooks.md +0 -588
  491. package/docs/layout.md +0 -384
  492. package/docs/providers.md +0 -211
  493. package/docs/styling.md +0 -184
  494. package/src/components/form-control/select-list/SelectList.tsx +0 -385
  495. package/src/components/form-control/select-list/SelectListContext.ts +0 -23
@@ -1,85 +1,257 @@
1
- import { createMemo, type JSX, Show, splitProps } from "solid-js";
2
- import { IconExternalLink } from "@tabler/icons-solidjs";
1
+ import { createEffect, createMemo, createSignal, For, type JSX, Show, splitProps } from "solid-js";
2
+ import clsx from "clsx";
3
+ import { twMerge } from "tailwind-merge";
3
4
  import { type SharedDataAccessor } from "../../../providers/shared-data/SharedDataContext";
4
- import { SelectList } from "../../form-control/select-list/SelectList";
5
- import { Icon } from "../../display/Icon";
6
- import { useDialog } from "../../disclosure/DialogContext";
5
+ import { List } from "../../data/list/List";
6
+ import { Pagination } from "../../data/Pagination";
7
+ import { TextInput } from "../../form-control/field/TextInput";
8
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
9
+ import { textMuted } from "../../../styles/tokens.styles";
10
+ import { createSlotSignal } from "../../../hooks/createSlotSignal";
11
+ import {
12
+ SharedDataSelectListContext,
13
+ type SharedDataSelectListContextValue,
14
+ SharedDataSelectListItemTemplate,
15
+ SharedDataSelectListFilter,
16
+ } from "./SharedDataSelectListContext";
7
17
 
8
18
  /** SharedDataSelectList Props */
9
19
  export interface SharedDataSelectListProps<TItem> {
10
- /** 공유 데이터 접근자 */
20
+ /** Shared data accessor */
11
21
  data: SharedDataAccessor<TItem>;
12
22
 
13
- /** 현재 선택된 */
23
+ /** Currently selected value */
14
24
  value?: TItem;
15
- /** 변경 콜백 */
25
+ /** Value change callback */
16
26
  onValueChange?: (value: TItem | undefined) => void;
17
- /** 필수 입력 */
27
+ /** Required input */
18
28
  required?: boolean;
19
- /** 비활성화 */
29
+ /** Disabled */
20
30
  disabled?: boolean;
21
31
 
22
- /** 항목 필터 함수 */
32
+ /** Item filter function */
23
33
  filterFn?: (item: TItem, index: number) => boolean;
24
- /** 변경 가드 (false 반환 변경 차단) */
34
+ /** Value change guard (blocks change if returns false) */
25
35
  canChange?: (item: TItem | undefined) => boolean | Promise<boolean>;
26
- /** 페이지 크기 (있으면 Pagination 자동 표시) */
36
+ /** Page size (shows Pagination if provided) */
27
37
  pageSize?: number;
28
- /** 헤더 텍스트 */
29
- header?: string;
30
- /** 관리 모달 컴포넌트 팩토리 */
31
- modal?: () => JSX.Element;
38
+ /** Header content */
39
+ header?: JSX.Element;
32
40
 
33
- /** 서브 컴포넌트용 children (ItemTemplate ) */
34
- children: JSX.Element;
41
+ /** Compound sub-components (ItemTemplate, Filter) */
42
+ children?: JSX.Element;
43
+
44
+ /** Custom class */
45
+ class?: string;
46
+ /** Custom style */
47
+ style?: JSX.CSSProperties;
48
+ }
49
+
50
+ // ─── Styles ──────────────────────────────────────────────
51
+
52
+ const containerClass = clsx("flex-col gap-1");
53
+
54
+ // ─── Component ───────────────────────────────────────────
55
+
56
+ export interface SharedDataSelectListComponent {
57
+ <TItem>(props: SharedDataSelectListProps<TItem>): JSX.Element;
58
+ ItemTemplate: typeof SharedDataSelectListItemTemplate;
59
+ Filter: typeof SharedDataSelectListFilter;
35
60
  }
36
61
 
37
- export function SharedDataSelectList<TItem>(props: SharedDataSelectListProps<TItem>): JSX.Element {
38
- const [local, rest] = splitProps(props, ["data", "filterFn", "modal", "header", "children"]);
62
+ export const SharedDataSelectList: SharedDataSelectListComponent = (<TItem,>(
63
+ props: SharedDataSelectListProps<TItem>,
64
+ ): JSX.Element => {
65
+ const [local, rest] = splitProps(props, [
66
+ "data",
67
+ "children",
68
+ "class",
69
+ "style",
70
+ "value",
71
+ "onValueChange",
72
+ "required",
73
+ "disabled",
74
+ "filterFn",
75
+ "canChange",
76
+ "pageSize",
77
+ "header",
78
+ ]);
79
+
80
+ const i18n = useI18nOptional();
81
+
82
+ // ─── Slot signals ──────────────────────────────────────
83
+
84
+ const [filter, setFilter] = createSlotSignal();
85
+ const [itemTemplate, _setItemTemplate] = createSignal<
86
+ ((item: TItem, index: number) => JSX.Element) | undefined
87
+ >();
88
+ const setItemTemplate = (fn: ((...args: unknown[]) => JSX.Element) | undefined) =>
89
+ _setItemTemplate(() => fn as ((item: TItem, index: number) => JSX.Element) | undefined);
90
+
91
+ const contextValue: SharedDataSelectListContextValue = {
92
+ setItemTemplate,
93
+ setFilter,
94
+ };
95
+
96
+ // ─── Search state ──────────────────────────────────────
97
+
98
+ const [searchText, setSearchText] = createSignal("");
99
+
100
+ // Reset search text when filter slot changes
101
+ createEffect(() => {
102
+ if (filter()) {
103
+ setSearchText("");
104
+ }
105
+ });
106
+
107
+ // ─── Pagination state ─────────────────────────────────
108
+
109
+ const [page, setPage] = createSignal(1);
110
+
111
+ // ─── Filtering pipeline ─────────────────────────────────
112
+
113
+ const filteredItems = createMemo(() => {
114
+ let result = local.data.items();
115
+
116
+ // getIsHidden filter
117
+ const isHidden = local.data.getIsHidden;
118
+ if (isHidden) {
119
+ result = result.filter((item) => !isHidden(item));
120
+ }
121
+
122
+ // Search filter (only when Filter compound is absent and getSearchText exists)
123
+ const getSearchText = local.data.getSearchText;
124
+ if (!filter() && getSearchText && searchText()) {
125
+ const terms = searchText().trim().split(" ").filter(Boolean);
126
+ if (terms.length > 0) {
127
+ result = result.filter((item) => {
128
+ const text = getSearchText(item).toLowerCase();
129
+ return terms.every((t) => text.includes(t.toLowerCase()));
130
+ });
131
+ }
132
+ }
133
+
134
+ // filterFn
135
+ if (local.filterFn) {
136
+ const fn = local.filterFn;
137
+ result = result.filter((item, index) => fn(item, index));
138
+ }
39
139
 
40
- const dialog = useDialog();
140
+ return result;
141
+ });
142
+
143
+ // ─── Page calculation ───────────────────────────────────────
144
+
145
+ const totalPageCount = createMemo(() => {
146
+ if (local.pageSize == null) return 1;
147
+ return Math.max(1, Math.ceil(filteredItems().length / local.pageSize));
148
+ });
41
149
 
42
- // filterFn 적용된 items
43
- const items = createMemo(() => {
44
- const allItems = local.data.items();
45
- if (!local.filterFn) return allItems;
46
- return allItems.filter(local.filterFn);
150
+ // Reset page when filter changes
151
+ createEffect(() => {
152
+ void filteredItems();
153
+ setPage(1);
47
154
  });
48
155
 
49
- // modal 열기
50
- const handleOpenModal = async () => {
51
- if (!local.modal) return;
52
- await dialog.show(local.modal, {});
156
+ // Page slice
157
+ const displayItems = createMemo(() => {
158
+ const items = filteredItems();
159
+ if (local.pageSize == null) return items;
160
+
161
+ const start = (page() - 1) * local.pageSize;
162
+ const end = start + local.pageSize;
163
+ return items.slice(start, end);
164
+ });
165
+
166
+ // ─── Select/toggle handler ─────────────────────────────
167
+
168
+ const handleSelect = async (item: TItem | undefined) => {
169
+ if (local.disabled) return;
170
+
171
+ // canChange guard
172
+ if (local.canChange) {
173
+ const allowed = await local.canChange(item);
174
+ if (!allowed) return;
175
+ }
176
+
177
+ // Toggle: click already selected value to deselect (only if not required)
178
+ if (item !== undefined && item === local.value && !local.required) {
179
+ local.onValueChange?.(undefined);
180
+ } else {
181
+ local.onValueChange?.(item);
182
+ }
53
183
  };
54
184
 
185
+ // ─── Render ────────────────────────────────────────────
186
+
55
187
  return (
56
- <SelectList
57
- {...rest}
58
- items={items()}
59
- getSearchText={local.data.getSearchText}
60
- getIsHidden={local.data.getIsHidden}
61
- >
62
- {/* header + modal 아이콘을 SelectList.Header로 결합 */}
63
- <Show when={local.header != null || local.modal != null}>
64
- <SelectList.Header>
65
- <div class="flex items-center gap-1">
66
- <Show when={local.header != null}>
67
- <span>{local.header}</span>
68
- </Show>
69
- <Show when={local.modal != null}>
70
- <button
71
- type="button"
72
- class="inline-flex items-center justify-center rounded p-0.5 text-base-500 hover:text-primary-500 dark:text-base-400 dark:hover:text-primary-400"
73
- aria-label="관리"
74
- onClick={() => void handleOpenModal()}
75
- >
76
- <Icon icon={IconExternalLink} size="1em" />
77
- </button>
78
- </Show>
79
- </div>
80
- </SelectList.Header>
81
- </Show>
188
+ <SharedDataSelectListContext.Provider value={contextValue}>
189
+ {/* Render children inside Provider so sub-components (ItemTemplate, Filter) can access context */}
82
190
  {local.children}
83
- </SelectList>
191
+ <div
192
+ {...rest}
193
+ data-shared-data-select-list
194
+ class={twMerge(containerClass, local.class)}
195
+ style={local.style}
196
+ >
197
+ {/* Header */}
198
+ <Show when={local.header != null}>{local.header}</Show>
199
+
200
+ {/* Search input: when Filter compound is absent and getSearchText exists */}
201
+ <Show when={!filter() && local.data.getSearchText}>
202
+ <div class={"p-1"}>
203
+ <TextInput
204
+ value={searchText()}
205
+ onValueChange={setSearchText}
206
+ placeholder={i18n?.t("sharedDataSelectList.searchPlaceholder") ?? "Search..."}
207
+ class={"w-full"}
208
+ />
209
+ </div>
210
+ </Show>
211
+
212
+ {/* Custom Filter */}
213
+ <Show when={filter()}>{filter()!()}</Show>
214
+
215
+ {/* Pagination */}
216
+ <Show when={local.pageSize != null && totalPageCount() > 1}>
217
+ <Pagination
218
+ page={page()}
219
+ onPageChange={setPage}
220
+ totalPageCount={totalPageCount()}
221
+ size="sm"
222
+ />
223
+ </Show>
224
+
225
+ {/* List */}
226
+ <List inset>
227
+ {/* Unspecified item (when not required) */}
228
+ <Show when={!local.required}>
229
+ <List.Item
230
+ selected={local.value === undefined}
231
+ disabled={local.disabled}
232
+ onClick={() => handleSelect(undefined)}
233
+ >
234
+ <span class={textMuted}>Unspecified</span>
235
+ </List.Item>
236
+ </Show>
237
+
238
+ {/* Item list */}
239
+ <For each={displayItems()}>
240
+ {(item, index) => (
241
+ <List.Item
242
+ selected={item === local.value}
243
+ disabled={local.disabled}
244
+ onClick={() => handleSelect(item)}
245
+ >
246
+ {itemTemplate()?.(item, index())}
247
+ </List.Item>
248
+ )}
249
+ </For>
250
+ </List>
251
+ </div>
252
+ </SharedDataSelectListContext.Provider>
84
253
  );
85
- }
254
+ }) as SharedDataSelectListComponent;
255
+
256
+ SharedDataSelectList.ItemTemplate = SharedDataSelectListItemTemplate;
257
+ SharedDataSelectList.Filter = SharedDataSelectListFilter;
@@ -0,0 +1,39 @@
1
+ import { createContext, useContext, type JSX, type ParentComponent, onCleanup } from "solid-js";
2
+ import { createSlotComponent } from "../../../helpers/createSlotComponent";
3
+ import type { SlotAccessor } from "../../../hooks/createSlotSignal";
4
+
5
+ // ─── Context ──────────────────────────────────────────────
6
+
7
+ export interface SharedDataSelectListContextValue {
8
+ setItemTemplate: (fn: ((...args: unknown[]) => JSX.Element) | undefined) => void;
9
+ setFilter: (content: SlotAccessor) => void;
10
+ }
11
+
12
+ export const SharedDataSelectListContext = createContext<SharedDataSelectListContextValue>();
13
+
14
+ export function useSharedDataSelectListContext(): SharedDataSelectListContextValue {
15
+ const context = useContext(SharedDataSelectListContext);
16
+ if (!context) {
17
+ throw new Error("useSharedDataSelectListContext can only be used inside SharedDataSelectList");
18
+ }
19
+ return context;
20
+ }
21
+
22
+ // ─── Sub-components ───────────────────────────────────────
23
+
24
+ /** ItemTemplate sub-component — registers item render function */
25
+ export const SharedDataSelectListItemTemplate = <TItem,>(props: {
26
+ children: (item: TItem, index: number) => JSX.Element;
27
+ }) => {
28
+ const ctx = useSharedDataSelectListContext();
29
+ // eslint-disable-next-line solid/reactivity -- Store render function in signal, called from JSX tracked scope
30
+ ctx.setItemTemplate(props.children as (...args: unknown[]) => JSX.Element);
31
+ onCleanup(() => ctx.setItemTemplate(undefined));
32
+ return null;
33
+ };
34
+
35
+ /** Filter sub-component — registers custom filter UI slot */
36
+ export const SharedDataSelectListFilter: ParentComponent = createSlotComponent(
37
+ SharedDataSelectListContext,
38
+ (ctx) => ctx.setFilter,
39
+ );
@@ -10,7 +10,7 @@ import {
10
10
  export type ProgressTheme = SemanticTheme;
11
11
 
12
12
  export interface ProgressProps extends JSX.HTMLAttributes<HTMLDivElement> {
13
- /** 진행률 (0~1 범위, 0 = 0%, 1 = 100%) */
13
+ /** Progress value (range 0-1, 0 = 0%, 1 = 100%) */
14
14
  value: number;
15
15
  theme?: ProgressTheme;
16
16
  size?: ComponentSizeCompact;
@@ -14,9 +14,9 @@ import { createMountTransition } from "../../../hooks/createMountTransition";
14
14
  import "./BusyContainer.css";
15
15
 
16
16
  export interface BusyContainerProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "children"> {
17
- /** 로딩 오버레이 표시 (children 유지됨) */
17
+ /** Show loading overlay (children are preserved) */
18
18
  busy?: boolean;
19
- /** false이면 children 숨기고 로딩 오버레이 표시. 초기 데이터 로드 사용 */
19
+ /** If false, children are hidden and loading overlay is shown. Used for initial data loading */
20
20
  ready?: boolean;
21
21
  variant?: BusyVariant;
22
22
  message?: string;
@@ -26,7 +26,7 @@ export interface BusyContainerProps extends Omit<JSX.HTMLAttributes<HTMLDivEleme
26
26
 
27
27
  const baseClass = clsx("relative", "size-full", "min-h-[70px] min-w-[70px]", "overflow-auto");
28
28
 
29
- // eslint-disable-next-line tailwindcss/enforces-shorthand -- inset Chrome 87+에서만 지원
29
+ // eslint-disable-next-line tailwindcss/enforces-shorthand -- inset is only supported in Chrome 87+
30
30
  const screenBaseClass = clsx(
31
31
  "absolute bottom-0 left-0 right-0 top-0",
32
32
  "z-busy",
@@ -71,7 +71,7 @@ export const BusyContainer: ParentComponent<BusyContainerProps> = (props) => {
71
71
  const busyCtx = useContext(BusyContext);
72
72
  const currVariant = (): BusyVariant => local.variant ?? busyCtx?.variant() ?? "spinner";
73
73
 
74
- // 애니메이션 상태 (mount transition)
74
+ // Animation state (mount transition)
75
75
  const { mounted, animating, unmount } = createMountTransition(
76
76
  () => local.ready === false || !!local.busy,
77
77
  );
@@ -83,7 +83,7 @@ export const BusyContainer: ParentComponent<BusyContainerProps> = (props) => {
83
83
  }
84
84
  };
85
85
 
86
- // 키보드 입력 차단 (캡처 단계)
86
+ // Block keyboard input (capture phase)
87
87
  let containerRef!: HTMLDivElement;
88
88
 
89
89
  createEffect(() => {
@@ -106,7 +106,7 @@ export const BusyContainer: ParentComponent<BusyContainerProps> = (props) => {
106
106
  animating() ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0",
107
107
  );
108
108
 
109
- // spinner: 슬라이드 다운 애니메이션
109
+ // spinner: slide down animation
110
110
  const rectClass = () => {
111
111
  if (currVariant() !== "spinner") return "";
112
112
  return clsx(
@@ -1,38 +1,38 @@
1
1
  import { createContext, useContext, type Accessor } from "solid-js";
2
2
 
3
3
  /**
4
- * Busy 오버레이 표시 방식
5
- * - `spinner`: 전체 화면 스피너
6
- * - `bar`: 상단 프로그레스
4
+ * Busy overlay display type
5
+ * - `spinner`: Full-screen spinner
6
+ * - `bar`: Top progress bar
7
7
  */
8
8
  export type BusyVariant = "spinner" | "bar";
9
9
 
10
10
  /**
11
- * Busy 오버레이 Context
11
+ * Busy overlay Context value
12
12
  */
13
13
  export interface BusyContextValue {
14
- /** 현재 표시 방식 */
14
+ /** Current display type */
15
15
  variant: Accessor<BusyVariant>;
16
- /** 오버레이 표시 (중첩 호출 가능, 호출 횟수만큼 hide 필요) */
16
+ /** Show overlay (nestable calls, requires matching hide calls) */
17
17
  show: (message?: string) => void;
18
- /** 오버레이 숨김 (모든 show 대응하는 hide 호출 실제 숨김) */
18
+ /** Hide overlay (actually hides after all show calls have corresponding hide calls) */
19
19
  hide: () => void;
20
- /** 프로그레스 진행률 설정 (0~100, undefined indeterminate) */
20
+ /** Set progress bar progress (0-100, undefined for indeterminate) */
21
21
  setProgress: (percent: number | undefined) => void;
22
22
  }
23
23
 
24
- /** Busy 오버레이 Context */
24
+ /** Busy overlay Context */
25
25
  export const BusyContext = createContext<BusyContextValue>();
26
26
 
27
27
  /**
28
- * Busy 오버레이에 접근하는
28
+ * Hook to access Busy overlay
29
29
  *
30
- * @throws BusyProvider 없으면 에러 발생
30
+ * @throws Error if BusyProvider is not present
31
31
  */
32
32
  export function useBusy(): BusyContextValue {
33
33
  const context = useContext(BusyContext);
34
34
  if (!context) {
35
- throw new Error("useBusy BusyProvider 내부에서만 사용할 있습니다");
35
+ throw new Error("useBusy can only be used inside BusyProvider");
36
36
  }
37
37
  return context;
38
38
  }
@@ -6,19 +6,19 @@ import { BusyContainer } from "./BusyContainer";
6
6
 
7
7
  const overlayClass = clsx("fixed left-0 top-0", "h-screen w-screen", "overflow-hidden");
8
8
 
9
- /** BusyProvider 설정 */
9
+ /** BusyProvider configuration */
10
10
  export interface BusyProviderProps {
11
- /** 표시 방식 (기본값: `"spinner"`) */
11
+ /** Display style (default: `"spinner"`) */
12
12
  variant?: BusyVariant;
13
13
  }
14
14
 
15
15
  /**
16
- * Busy 오버레이 Provider
16
+ * Busy Overlay Provider
17
17
  *
18
18
  * @remarks
19
- * - show/hide 중첩 호출 가능 (내부 카운터로 관리)
20
- * - Portal 렌더링하여 항상 최상위에 표시
21
- * - 독립적으로 동작 (다른 Provider 의존성 없음)
19
+ * - show/hide can be nested (managed with internal counter)
20
+ * - Renders via Portal to always display on top
21
+ * - Works independently (no other Provider dependencies)
22
22
  */
23
23
  export const BusyProvider: ParentComponent<BusyProviderProps> = (props) => {
24
24
  const [busyCount, setBusyCount] = createSignal(0);
@@ -3,6 +3,7 @@ import { Portal } from "solid-js/web";
3
3
  import clsx from "clsx";
4
4
  import { IconX } from "@tabler/icons-solidjs";
5
5
  import { useNotification } from "./NotificationContext";
6
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
6
7
  import { Icon } from "../../display/Icon";
7
8
  import { themeTokens } from "../../../styles/tokens.styles";
8
9
 
@@ -38,6 +39,7 @@ const dismissButtonClass = clsx("rounded", "p-1", "hover:bg-white/20");
38
39
 
39
40
  export const NotificationBanner: Component = () => {
40
41
  const notification = useNotification();
42
+ const i18n = useI18nOptional();
41
43
 
42
44
  const handleDismiss = () => {
43
45
  notification.dismissBanner();
@@ -72,7 +74,7 @@ export const NotificationBanner: Component = () => {
72
74
  </Show>
73
75
  <button
74
76
  type="button"
75
- aria-label="알림 닫기"
77
+ aria-label={i18n?.t("notification.close") ?? "Close notification"}
76
78
  class={dismissButtonClass}
77
79
  onClick={handleDismiss}
78
80
  >
@@ -78,7 +78,7 @@ export const NotificationBell: Component<NotificationBellProps> = (props) => {
78
78
  type="button"
79
79
  data-notification-bell
80
80
  class={buttonClass}
81
- aria-label={`알림 ${notification.unreadCount()}개`}
81
+ aria-label={`${notification.unreadCount()} notifications`}
82
82
  aria-haspopup="true"
83
83
  aria-expanded={open()}
84
84
  >
@@ -93,7 +93,7 @@ export const NotificationBell: Component<NotificationBellProps> = (props) => {
93
93
  <Dropdown.Content>
94
94
  <div class="w-80 p-2">
95
95
  <div class={dropdownHeaderClass}>
96
- <span class="font-bold">알림</span>
96
+ <span class="font-bold">Notifications</span>
97
97
  <Show when={notification.items().length > 0}>
98
98
  <button
99
99
  type="button"
@@ -101,14 +101,14 @@ export const NotificationBell: Component<NotificationBellProps> = (props) => {
101
101
  class={clearButtonClass}
102
102
  onClick={handleClear}
103
103
  >
104
- 전체 삭제
104
+ Clear All
105
105
  </button>
106
106
  </Show>
107
107
  </div>
108
108
 
109
109
  <Show
110
110
  when={notification.items().length > 0}
111
- fallback={<div class={emptyClass}>알림이 없습니다</div>}
111
+ fallback={<div class={emptyClass}>No notifications</div>}
112
112
  >
113
113
  <div class={listClass}>
114
114
  <For each={[...notification.items()].reverse()}>