@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
@@ -10,13 +10,13 @@ declare module "solid-js" {
10
10
  }
11
11
 
12
12
  /**
13
- * 인터랙티브 요소에 ripple 효과를 추가하는 directive.
13
+ * Directive that adds a ripple effect to interactive elements.
14
14
  *
15
15
  * @remarks
16
- * - 내부에 ripple-container div 생성하여 overflow: hidden 적용 (부모 요소 영향 없음)
17
- * - 요소의 position `static`일 때만 `relative`로 변경 (cleanup 원래 복원)
18
- * - 단일 ripple 모드: 클릭 이전 ripple 제거
19
- * - `prefers-reduced-motion: reduce` 설정 시 ripple 비활성화
16
+ * - Creates an internal ripple-container div with overflow: hidden (no impact on parent element)
17
+ * - Changes position to `relative` only when the element is `static` (restores original value on cleanup)
18
+ * - Single ripple mode: removes the previous ripple on new click
19
+ * - Disables ripple when `prefers-reduced-motion: reduce` is set
20
20
  *
21
21
  * @example
22
22
  * ```tsx
@@ -32,7 +32,7 @@ export function ripple(el: HTMLElement, accessor: Accessor<boolean>): void {
32
32
 
33
33
  const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
34
34
 
35
- // ripple container 생성 (내부에서 overflow: hidden 처리)
35
+ // Create ripple container (handles overflow: hidden internally)
36
36
  const ensureContainer = () => {
37
37
  if (containerEl) return containerEl;
38
38
 
@@ -48,7 +48,7 @@ export function ripple(el: HTMLElement, accessor: Accessor<boolean>): void {
48
48
  if (!accessor()) return;
49
49
  if (prefersReducedMotion.matches) return;
50
50
 
51
- // position 확인 적용 (container 배치를 위해 필요)
51
+ // Check and apply position (required for container placement)
52
52
  if (getComputedStyle(el).position === "static") {
53
53
  if (!positionApplied) originalPosition = el.style.position;
54
54
  el.style.position = "relative";
@@ -66,7 +66,7 @@ export function ripple(el: HTMLElement, accessor: Accessor<boolean>): void {
66
66
  const x = event.clientX - rect.left;
67
67
  const y = event.clientY - rect.top;
68
68
 
69
- // 클릭 위치에서 가장 모서리까지의 거리를 반지름으로 사용
69
+ // Use the distance from the click position to the farthest corner as the radius
70
70
  const maxDist = Math.max(
71
71
  Math.hypot(x, y),
72
72
  Math.hypot(rect.width - x, y),
@@ -1,8 +1,9 @@
1
1
  import type { Component, ParentComponent } from "solid-js";
2
- import { type Accessor, createContext, createMemo, createRoot, useContext } from "solid-js";
2
+ import { type Accessor, createMemo, createRoot, useContext } from "solid-js";
3
+ import { createHmrSafeContext } from "./createHmrSafeContext";
3
4
  import type { IconProps } from "@tabler/icons-solidjs";
4
5
 
5
- // ── 입력 타입 ──
6
+ // ── Input Types ──
6
7
 
7
8
  export interface AppStructureGroupItem<TModule> {
8
9
  code: string;
@@ -37,7 +38,7 @@ export interface AppStructureSubPerm<TModule> {
37
38
  perms: ("use" | "edit")[];
38
39
  }
39
40
 
40
- // ── 출력 타입 ──
41
+ // ── Output Types ──
41
42
 
42
43
  export interface AppMenu {
43
44
  title: string;
@@ -81,7 +82,7 @@ export interface AppStructure<TModule> {
81
82
  getTitleChainByHref(href: string): string[];
82
83
  }
83
84
 
84
- // ── Perms 타입 추론 ──
85
+ // ── Perms Type Inference ──
85
86
 
86
87
  type PermKey<TItem> = TItem extends { code: infer C extends string }
87
88
  ? TItem extends { children: any }
@@ -114,7 +115,7 @@ type InferPerms<TItems extends any[]> = {
114
115
  : InferLeafPerms<Item>;
115
116
  };
116
117
 
117
- // ── 내부 헬퍼 ──
118
+ // ── Internal Helpers ──
118
119
 
119
120
  function isGroupItem<TModule>(
120
121
  item: AppStructureItem<TModule>,
@@ -234,12 +235,18 @@ function buildPerms<TModule>(
234
235
 
235
236
  if (isGroupItem(item)) {
236
237
  const children = buildPerms(item.children, href, usableModules);
238
+ if (children.length === 0) continue;
237
239
  result.push({
238
240
  title: item.title,
239
241
  modules: item.modules,
240
242
  children,
241
243
  });
242
244
  } else {
245
+ if (
246
+ (item.perms == null || item.perms.length === 0) &&
247
+ (item.subPerms == null || item.subPerms.length === 0)
248
+ )
249
+ continue;
243
250
  result.push({
244
251
  title: item.title,
245
252
  href,
@@ -410,7 +417,7 @@ function findItemChainByCodes<TModule>(
410
417
  return result;
411
418
  }
412
419
 
413
- // ── 메인 함수 ──
420
+ // ── Main Function ──
414
421
 
415
422
  function buildAppStructure<TModule, const TItems extends AppStructureItem<TModule>[]>(opts: {
416
423
  items: TItems;
@@ -491,7 +498,7 @@ export function createAppStructure<TModule, const TItems extends AppStructureIte
491
498
  } {
492
499
  type TRet = AppStructure<TModule> & { perms: InferPerms<TItems> };
493
500
 
494
- const Ctx = createContext<TRet>();
501
+ const Ctx = createHmrSafeContext<TRet>("AppStructure");
495
502
 
496
503
  const AppStructureProvider: ParentComponent = (props) => {
497
504
  const structure = buildAppStructure(getOpts());
@@ -505,7 +512,7 @@ export function createAppStructure<TModule, const TItems extends AppStructureIte
505
512
 
506
513
  const useAppStructure = (): TRet => {
507
514
  const ctx = useContext(Ctx);
508
- if (!ctx) throw new Error("AppStructureProvider 필요합니다.");
515
+ if (!ctx) throw new Error("AppStructureProvider is required.");
509
516
  return ctx;
510
517
  };
511
518
 
@@ -0,0 +1,8 @@
1
+ import { type Context, createContext } from "solid-js";
2
+
3
+ const CACHE_KEY = "__simplysm_ctx__";
4
+ const cache = ((globalThis as unknown as Record<string, Record<string, unknown>>)[CACHE_KEY] ??= {});
5
+
6
+ export function createHmrSafeContext<TValue>(key: string): Context<TValue | undefined> {
7
+ return (cache[key] ??= createContext<TValue>()) as Context<TValue | undefined>;
8
+ }
@@ -4,10 +4,10 @@ import type { JSX } from "solid-js";
4
4
  type SlotSetter = (value: (() => JSX.Element) | undefined) => void;
5
5
 
6
6
  /**
7
- * Slot 등록 컴포넌트를 생성하는 팩토리 함수
7
+ * Factory function that creates a slot registration component.
8
8
  *
9
- * @param context - slot 등록할 Context
10
- * @param getSetter - context value에서 setter 추출하는 함수
9
+ * @param context - Context to register the slot in
10
+ * @param getSetter - Function to extract the setter from the context value
11
11
  */
12
12
  export function createSlotComponent<TCtx>(
13
13
  context: Context<TCtx | undefined>,
@@ -15,7 +15,7 @@ export function createSlotComponent<TCtx>(
15
15
  ): ParentComponent {
16
16
  return (props) => {
17
17
  const ctx = useContext(context)!;
18
- // eslint-disable-next-line solid/reactivity -- slot 등록은 초기 마운트 번만 수행
18
+ // eslint-disable-next-line solid/reactivity -- Slot registration runs only once on initial mount
19
19
  getSetter(ctx)(() => props.children);
20
20
  onCleanup(() => getSetter(ctx)(undefined));
21
21
  return null;
@@ -1,25 +1,25 @@
1
1
  import { type JSX } from "solid-js";
2
2
 
3
3
  /**
4
- * CSS 스타일을 병합하는 유틸리티 함수
4
+ * Utility function that merges CSS styles.
5
5
  *
6
6
  * @remarks
7
- * - string object 형태의 스타일을 모두 지원
8
- * - object 형태는 하나의 객체로 병합 (나중 값이 우선)
9
- * - string은 파싱하여 병합
10
- * - undefined 무시
7
+ * - Supports both string and object style formats
8
+ * - Object styles are merged into a single object (later values take precedence)
9
+ * - Strings are parsed and merged
10
+ * - undefined values are ignored
11
11
  *
12
12
  * @example
13
13
  * ```tsx
14
- * // Object 병합
14
+ * // Object merge
15
15
  * mergeStyles({ color: "red" }, { background: "blue" })
16
16
  * // => { color: "red", background: "blue" }
17
17
  *
18
- * // String 병합
18
+ * // String merge
19
19
  * mergeStyles("color: red;", "background: blue;")
20
20
  * // => { color: "red", background: "blue" }
21
21
  *
22
- * // Mixed 병합
22
+ * // Mixed merge
23
23
  * mergeStyles({ color: "red" }, "background: blue;")
24
24
  * // => { color: "red", background: "blue" }
25
25
  * ```
@@ -33,7 +33,7 @@ export function mergeStyles(
33
33
  if (style === undefined) continue;
34
34
 
35
35
  if (typeof style === "string") {
36
- // CSS string 파싱
36
+ // Parse CSS string
37
37
  const declarations = style.split(";").filter((s) => s.trim());
38
38
  for (const declaration of declarations) {
39
39
  const colonIndex = declaration.indexOf(":");
@@ -42,7 +42,7 @@ export function mergeStyles(
42
42
  const property = declaration.slice(0, colonIndex).trim();
43
43
  const value = declaration.slice(colonIndex + 1).trim();
44
44
  if (property && value) {
45
- // kebab-case camelCase로 변환
45
+ // Convert kebab-case to camelCase
46
46
  const camelProperty = property.replace(/-([a-z])/g, (_, letter: string) =>
47
47
  letter.toUpperCase(),
48
48
  );
@@ -50,7 +50,7 @@ export function mergeStyles(
50
50
  }
51
51
  }
52
52
  } else {
53
- // Object 스타일 병합
53
+ // Merge object styles
54
54
  Object.assign(result, style);
55
55
  }
56
56
  }
@@ -1,37 +1,37 @@
1
1
  import { createSignal, createEffect } from "solid-js";
2
2
 
3
3
  /**
4
- * 함수 타입을 제한하는 유틸리티 타입
5
- * 함수 타입이 전달되면 never 변환되어 컴파일 타임 에러 발생
4
+ * Utility type that restricts function types.
5
+ * If a function type is passed, it is converted to never, causing a compile-time error.
6
6
  *
7
7
  * @remarks
8
- * 함수를 저장해야 경우 객체로 감싸기: `createControllableSignal<{ fn: () => void }>(...)`
8
+ * To store a function, wrap it in an object: `createControllableSignal<{ fn: () => void }>(...)`
9
9
  */
10
10
  type NotFunction<TValue> = TValue extends (...args: unknown[]) => unknown ? never : TValue;
11
11
 
12
12
  /**
13
- * Controlled/Uncontrolled 패턴을 지원하는 signal hook
13
+ * Signal hook that supports the controlled/uncontrolled pattern.
14
14
  *
15
15
  * @remarks
16
- * - `onChange`가 제공되면 controlled 모드: 외부에서 관리
17
- * - `onChange`가 없으면 uncontrolled 모드: 내부 상태 사용
18
- * - 함수형 setter 지원: `setValue(prev => !prev)`
16
+ * - When `onChange` is provided: controlled mode, value managed externally
17
+ * - When `onChange` is absent: uncontrolled mode, uses internal state
18
+ * - Supports functional setter: `setValue(prev => !prev)`
19
19
  *
20
20
  * @example
21
21
  * ```tsx
22
- * // Controlled 모드 (onOpenChange 제공)
22
+ * // Controlled mode (onOpenChange provided)
23
23
  * const [open, setOpen] = createControllableSignal({
24
24
  * value: () => props.open ?? false,
25
25
  * onChange: () => props.onOpenChange,
26
26
  * });
27
27
  *
28
- * // Uncontrolled 모드 (onOpenChange 미제공)
28
+ * // Uncontrolled mode (onOpenChange not provided)
29
29
  * const [open, setOpen] = createControllableSignal({
30
30
  * value: () => props.open ?? false,
31
31
  * onChange: () => undefined,
32
32
  * });
33
33
  *
34
- * // 함수형 setter
34
+ * // Functional setter
35
35
  * setOpen(prev => !prev);
36
36
  * ```
37
37
  */
@@ -41,7 +41,7 @@ export function createControllableSignal<TValue>(options: {
41
41
  }) {
42
42
  const [internalValue, setInternalValue] = createSignal<TValue>(options.value());
43
43
 
44
- // props 변경 내부 상태 동기화 (props 우선)
44
+ // Sync internal state when props change (props take precedence)
45
45
  createEffect(() => {
46
46
  const propValue = options.value();
47
47
  setInternalValue(() => propValue);
@@ -4,22 +4,22 @@ import type { SetStoreFunction } from "solid-js/store";
4
4
  import { objClone } from "@simplysm/core-common";
5
5
 
6
6
  /**
7
- * Controlled/Uncontrolled 패턴을 지원하는 store hook
7
+ * Store hook that supports the controlled/uncontrolled pattern.
8
8
  *
9
9
  * @remarks
10
- * - `onChange`가 제공되면 controlled 모드: setter 호출 onChange 변경 알림
11
- * - `onChange`가 없으면 uncontrolled 모드: 내부 store 사용
12
- * - SetStoreFunction의 모든 overload 지원 (path 기반, produce, reconcile )
10
+ * - When `onChange` is provided: controlled mode, notifies changes via onChange on setter calls
11
+ * - When `onChange` is absent: uncontrolled mode, uses internal store only
12
+ * - Supports all SetStoreFunction overloads (path-based, produce, reconcile, etc.)
13
13
  *
14
14
  * @example
15
15
  * ```tsx
16
- * // Controlled 모드 (onItemsChange 제공)
16
+ * // Controlled mode (onItemsChange provided)
17
17
  * const [items, setItems] = createControllableStore<Item[]>({
18
18
  * value: () => props.items ?? [],
19
19
  * onChange: () => props.onItemsChange,
20
20
  * });
21
21
  *
22
- * // Uncontrolled 모드 (onItemsChange 미제공)
22
+ * // Uncontrolled mode (onItemsChange not provided)
23
23
  * const [items, setItems] = createControllableStore<Item[]>({
24
24
  * value: () => [],
25
25
  * onChange: () => undefined,
@@ -32,12 +32,12 @@ export function createControllableStore<TValue extends object>(options: {
32
32
  }): [TValue, SetStoreFunction<TValue>] {
33
33
  const [store, rawSet] = createStore<TValue>(objClone(options.value()));
34
34
 
35
- // 외부 value 변경 내부 store 동기화
35
+ // Sync internal store when external value changes
36
36
  createEffect(() => {
37
37
  rawSet(reconcile(options.value()) as any);
38
38
  });
39
39
 
40
- // 함수 래퍼로 setter 감싸서 onChange 알림 추가
40
+ // Wrap setter with a function wrapper to add onChange notification
41
41
  const wrappedSet = ((...args: any[]) => {
42
42
  const before = JSON.stringify(unwrap(store));
43
43
  (rawSet as any)(...args);
@@ -1,16 +1,16 @@
1
1
  import { createSignal, onCleanup } from "solid-js";
2
2
 
3
3
  /**
4
- * IME 조합 처리
4
+ * IME composition handling hook.
5
5
  *
6
6
  * @remarks
7
- * 한글 IME 조합 onValueChange를 지연하여 DOM 재생성(조합 끊김)을 방지합니다.
8
- * - 조합 중: composingValue 업데이트 (content div 표시용)
9
- * - 조합 완료(compositionEnd): setTimeout(0)으로 지연 후 setValue 호출
10
- * - cleanup: flushComposition으로 미커밋 즉시 커밋
7
+ * Delays onValueChange during IME composition (e.g., Korean) to prevent DOM recreation (composition breakage).
8
+ * - During composition: only updates composingValue (for content div display)
9
+ * - On compositionEnd: delays setValue call via setTimeout(0)
10
+ * - Cleanup: immediately commits uncommitted value via flushComposition
11
11
  *
12
- * @param setValue - 커밋 함수
13
- * @returns IME 핸들러 객체
12
+ * @param setValue - Value commit function
13
+ * @returns IME handler object
14
14
  */
15
15
  export function createIMEHandler(setValue: (value: string) => void) {
16
16
  const [composingValue, setComposingValue] = createSignal<string | null>(null);
@@ -1,12 +1,12 @@
1
1
  import { createSignal, createEffect, onCleanup } from "solid-js";
2
2
 
3
3
  /**
4
- * 열림/닫힘 애니메이션을 위한 mount transition
4
+ * Mount transition hook for open/close animations.
5
5
  *
6
6
  * @remarks
7
- * - `open`이 true 되면 즉시 `mounted=true`, double rAF 후 `animating=true`
8
- * - `open`이 false 되면 즉시 `animating=false`, transitionend 또는 fallback 타이머(200ms) 후 `mounted=false`
9
- * - CSS transition과 함께 사용: `mounted()`로 DOM 렌더링, `animating()`으로 CSS 클래스 전환
7
+ * - When `open` becomes true: immediately sets `mounted=true`, then `animating=true` after double rAF
8
+ * - When `open` becomes false: immediately sets `animating=false`, then `mounted=false` after transitionend or fallback timer (200ms)
9
+ * - Used with CSS transitions: `mounted()` for DOM rendering, `animating()` for CSS class toggling
10
10
  */
11
11
  export function createMountTransition(open: () => boolean): {
12
12
  mounted: () => boolean;
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  type JSX,
3
3
  type ParentComponent,
4
- createContext,
5
4
  createMemo,
6
5
  splitProps,
7
6
  useContext,
8
7
  } from "solid-js";
8
+ import { createHmrSafeContext } from "../helpers/createHmrSafeContext";
9
9
  import { twMerge } from "tailwind-merge";
10
10
  import { createControllableSignal } from "./createControllableSignal";
11
11
  import { Invalid } from "../components/form-control/Invalid";
@@ -106,14 +106,16 @@ export function createSelectionGroup(config: MultiGroupConfig | SingleGroupConfi
106
106
  Item: <TValue = unknown>(props: SelectionGroupItemProps<TValue>) => JSX.Element;
107
107
  };
108
108
  } {
109
- const Context = createContext<MultiSelectContext | SingleSelectContext>();
109
+ const Context = createHmrSafeContext<MultiSelectContext | SingleSelectContext>(
110
+ `SelectionGroup_${config.contextName}`,
111
+ );
110
112
  const ItemComponent = config.ItemComponent;
111
113
 
112
114
  function ItemInner<TValue>(props: SelectionGroupItemProps<TValue>) {
113
115
  const ctx = useContext(Context);
114
116
  if (!ctx)
115
117
  throw new Error(
116
- `${config.contextName}.Item ${config.contextName} 내부에서만 사용할 수 있습니다`,
118
+ `${config.contextName}.Item can only be used inside ${config.contextName}`,
117
119
  );
118
120
 
119
121
  const isSelected = (): boolean => {
@@ -3,9 +3,9 @@ import { createSignal, type Accessor, type JSX } from "solid-js";
3
3
  export type SlotAccessor = (() => JSX.Element) | undefined;
4
4
 
5
5
  /**
6
- * 슬롯 등록용 signal 생성
6
+ * Creates a signal for slot registration.
7
7
  *
8
- * @returns [accessor, setter] setter 함수를 값으로 저장하기 위해 래핑 처리
8
+ * @returns [accessor, setter] -- setter is wrapped to store a function as a value
9
9
  */
10
10
  export function createSlotSignal(): [Accessor<SlotAccessor>, (content: SlotAccessor) => void] {
11
11
  const [slot, _setSlot] = createSignal<SlotAccessor>();
@@ -6,28 +6,28 @@ type StorageSetter<TValue> = (
6
6
  ) => TValue | undefined;
7
7
 
8
8
  /**
9
- * localStorage 기반 저장소 훅.
10
- * syncStorage 설정과 무관하게 항상 localStorage를 사용한다.
11
- * 기기별로 독립적으로 유지되어야 하는 데이터(인증 토큰, 기기별 상태 )에 사용한다.
9
+ * localStorage-based storage hook.
10
+ * Always uses localStorage regardless of syncStorage settings.
11
+ * Used for data that should be maintained independently per device (auth tokens, device-specific state, etc.).
12
12
  *
13
- * 키는 ConfigContext `clientName`으로 자동 prefix된다. (`${clientName}.${key}`)
13
+ * Keys are automatically prefixed with ConfigContext's `clientName`. (`${clientName}.${key}`)
14
14
  *
15
- * @template T - 저장할 값의 타입
16
- * @param key - localStorage
17
- * @param initialValue - 초기값 (옵셔널)
18
- * @returns [Accessor<T | undefined>, StorageSetter<T>] 튜플
15
+ * @template T - Type of the value to store
16
+ * @param key - localStorage key
17
+ * @param initialValue - Initial value (optional)
18
+ * @returns [Accessor<T | undefined>, StorageSetter<T>] tuple
19
19
  *
20
20
  * @example
21
21
  * ```tsx
22
22
  * const [token, setToken] = useLocalStorage<string>("auth-token");
23
23
  *
24
- * // 설정
24
+ * // Set value
25
25
  * setToken("abc123");
26
26
  *
27
- * // 읽기
27
+ * // Read value
28
28
  * console.log(token()); // "abc123"
29
29
  *
30
- * // 제거
30
+ * // Remove value
31
31
  * setToken(undefined);
32
32
  * ```
33
33
  */
@@ -38,7 +38,7 @@ export function useLocalStorage<TValue>(
38
38
  const config = useConfig();
39
39
  const prefixedKey = `${config.clientName}.${key}`;
40
40
 
41
- // localStorage에서 초기값 읽기
41
+ // Read initial value from localStorage
42
42
  let storedValue: TValue | undefined = initialValue;
43
43
  try {
44
44
  const item = localStorage.getItem(prefixedKey);
@@ -46,7 +46,7 @@ export function useLocalStorage<TValue>(
46
46
  storedValue = JSON.parse(item) as TValue;
47
47
  }
48
48
  } catch {
49
- // JSON 파싱 실패 초기값 사용
49
+ // Use initial value on JSON parse failure
50
50
  }
51
51
 
52
52
  const [value, setValue] = createSignal<TValue | undefined>(storedValue);
@@ -9,7 +9,7 @@ export interface Logger {
9
9
  info: (...args: unknown[]) => void;
10
10
  warn: (...args: unknown[]) => void;
11
11
  error: (...args: unknown[]) => void;
12
- /** LogAdapter 나중에 주입. LoggerProvider 내부에서만 사용 가능 */
12
+ /** Inject LogAdapter later. Only usable inside LoggerProvider */
13
13
  configure: (fn: (origin: LogAdapter) => LogAdapter) => void;
14
14
  }
15
15
 
@@ -34,7 +34,7 @@ export function useLogger(): Logger {
34
34
  error: createLogFunction("error"),
35
35
  configure: (fn: (origin: LogAdapter) => LogAdapter) => {
36
36
  if (!loggerCtx) {
37
- throw new Error("configure() LoggerProvider 내부에서만 사용할 있습니다");
37
+ throw new Error("configure() can only be used inside LoggerProvider");
38
38
  }
39
39
  loggerCtx.configure(fn);
40
40
  },
@@ -1,41 +1,41 @@
1
1
  import { useNavigate } from "@solidjs/router";
2
2
 
3
3
  export interface RouterLinkOptions {
4
- /** 이동할 경로 (완성된 URL, 예: "/home/dashboard?tab=1") */
4
+ /** Navigation path (complete URL, e.g., "/home/dashboard?tab=1") */
5
5
  href: string;
6
6
 
7
- /** 페이지 이동 전달할 데이터 (URL에 노출되지 않음) */
7
+ /** Data to pass during navigation (not exposed in the URL) */
8
8
  state?: Record<string, unknown>;
9
9
 
10
- /** Shift+클릭 크기 */
10
+ /** New window size on Shift+click */
11
11
  window?: {
12
- width?: number; // 기본값: 800
13
- height?: number; // 기본값: 800
12
+ width?: number; // Default: 800
13
+ height?: number; // Default: 800
14
14
  };
15
15
  }
16
16
 
17
17
  /**
18
- * 라우터 네비게이션을 처리하는 hook
18
+ * Hook that handles router navigation.
19
19
  *
20
20
  * @remarks
21
- * - 일반 클릭: SPA 라우팅 (useNavigate)
22
- * - Ctrl/Alt + 클릭:
23
- * - Shift + 클릭: (window 옵션 크기 적용)
21
+ * - Normal click: SPA routing (useNavigate)
22
+ * - Ctrl/Alt + click: new tab
23
+ * - Shift + click: new window (with window option size applied)
24
24
  *
25
25
  * @example
26
26
  * ```tsx
27
27
  * const navigate = useRouterLink();
28
28
  *
29
29
  * <ListItem onClick={navigate({ href: "/home/dashboard" })}>
30
- * 대시보드
30
+ * Dashboard
31
31
  * </ListItem>
32
32
  *
33
- * // state 전달
33
+ * // Passing state
34
34
  * <ListItem onClick={navigate({
35
35
  * href: "/users/123",
36
36
  * state: { from: "list" }
37
37
  * })}>
38
- * 사용자
38
+ * Users
39
39
  * </ListItem>
40
40
  * ```
41
41
  */
@@ -50,15 +50,15 @@ export function useRouterLink(): (
50
50
  e.stopPropagation();
51
51
 
52
52
  if (e.ctrlKey || e.metaKey || e.altKey) {
53
- // Ctrl/Cmd/Alt + 클릭:
53
+ // Ctrl/Cmd/Alt + click: new tab
54
54
  window.open(options.href, "_blank");
55
55
  } else if (e.shiftKey) {
56
- // Shift + 클릭:
56
+ // Shift + click: new window
57
57
  const width = options.window?.width ?? 800;
58
58
  const height = options.window?.height ?? 800;
59
59
  window.open(options.href, "", `width=${width},height=${height}`);
60
60
  } else {
61
- // 일반 클릭: SPA 라우팅
61
+ // Normal click: SPA routing
62
62
  navigate(options.href, options.state ? { state: options.state } : undefined);
63
63
  }
64
64
  };
package/src/index.ts CHANGED
@@ -6,9 +6,6 @@ export * from "./components/form-control/Button";
6
6
  // Select
7
7
  export * from "./components/form-control/select/Select";
8
8
 
9
- // SelectList
10
- export * from "./components/form-control/select-list/SelectList";
11
-
12
9
  // Combobox
13
10
  export * from "./components/form-control/combobox/Combobox";
14
11
 
@@ -134,6 +131,10 @@ export * from "./providers/shared-data/SharedDataChangeEvent";
134
131
  // SystemProvider
135
132
  export * from "./providers/SystemProvider";
136
133
 
134
+ // I18n
135
+ export * from "./providers/i18n/I18nContext";
136
+ export * from "./providers/i18n/I18nContext.types";
137
+
137
138
  //#endregion
138
139
 
139
140
  //#region ========== Hooks ==========