@simplysm/solid 13.0.69 → 13.0.70

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 (477) 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 +24 -24
  30. package/dist/components/disclosure/Tabs.js +1 -1
  31. package/dist/components/disclosure/Tabs.js.map +1 -1
  32. package/dist/components/disclosure/dialogZIndex.d.ts +7 -7
  33. package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
  34. package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
  35. package/dist/components/features/crud-detail/CrudDetail.js +19 -16
  36. package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
  37. package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
  38. package/dist/components/features/crud-sheet/CrudSheet.js +34 -28
  39. package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
  40. package/dist/components/features/data-select-button/DataSelectButton.d.ts +14 -14
  41. package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
  42. package/dist/components/features/data-select-button/DataSelectButton.js +27 -9
  43. package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
  44. package/dist/components/features/permission-table/PermissionTable.d.ts +3 -3
  45. package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
  46. package/dist/components/features/permission-table/PermissionTable.js +6 -2
  47. package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
  48. package/dist/components/features/shared-data/SharedDataSelect.d.ts +12 -12
  49. package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
  50. package/dist/components/features/shared-data/SharedDataSelect.js +8 -2
  51. package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
  52. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +10 -10
  53. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
  54. package/dist/components/features/shared-data/SharedDataSelectList.d.ts +23 -13
  55. package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
  56. package/dist/components/features/shared-data/SharedDataSelectList.js +219 -58
  57. package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
  58. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts +15 -0
  59. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts.map +1 -0
  60. package/dist/components/features/shared-data/SharedDataSelectListContext.js +27 -0
  61. package/dist/components/features/shared-data/SharedDataSelectListContext.js.map +6 -0
  62. package/dist/components/feedback/Progress.d.ts +1 -1
  63. package/dist/components/feedback/Progress.d.ts.map +1 -1
  64. package/dist/components/feedback/busy/BusyContainer.d.ts +2 -2
  65. package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -1
  66. package/dist/components/feedback/busy/BusyContext.d.ts +11 -11
  67. package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
  68. package/dist/components/feedback/busy/BusyContext.js +1 -1
  69. package/dist/components/feedback/busy/BusyContext.js.map +1 -1
  70. package/dist/components/feedback/busy/BusyProvider.d.ts +6 -6
  71. package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
  72. package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
  73. package/dist/components/feedback/notification/NotificationBanner.js +7 -3
  74. package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
  75. package/dist/components/feedback/notification/NotificationBell.js +2 -2
  76. package/dist/components/feedback/notification/NotificationBell.js.map +1 -1
  77. package/dist/components/feedback/notification/NotificationContext.d.ts +22 -22
  78. package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
  79. package/dist/components/feedback/notification/NotificationContext.js +1 -1
  80. package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
  81. package/dist/components/feedback/notification/NotificationProvider.d.ts +5 -5
  82. package/dist/components/feedback/notification/NotificationProvider.js +1 -1
  83. package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
  84. package/dist/components/feedback/print/PrintContext.js +1 -1
  85. package/dist/components/feedback/print/PrintContext.js.map +1 -1
  86. package/dist/components/form-control/DropdownTrigger.styles.d.ts +1 -1
  87. package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
  88. package/dist/components/form-control/ThemeToggle.d.ts +7 -7
  89. package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
  90. package/dist/components/form-control/ThemeToggle.js +3 -3
  91. package/dist/components/form-control/checkbox/Checkbox.js +1 -1
  92. package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
  93. package/dist/components/form-control/checkbox/Radio.js +1 -1
  94. package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
  95. package/dist/components/form-control/color-picker/ColorPicker.d.ts +12 -12
  96. package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
  97. package/dist/components/form-control/color-picker/ColorPicker.js +2 -2
  98. package/dist/components/form-control/combobox/Combobox.d.ts +22 -22
  99. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  100. package/dist/components/form-control/combobox/Combobox.js +2 -2
  101. package/dist/components/form-control/combobox/ComboboxContext.d.ts +4 -4
  102. package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
  103. package/dist/components/form-control/combobox/ComboboxContext.js +1 -1
  104. package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
  105. package/dist/components/form-control/combobox/ComboboxItem.d.ts +3 -3
  106. package/dist/components/form-control/combobox/ComboboxItem.d.ts.map +1 -1
  107. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +14 -14
  108. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
  109. package/dist/components/form-control/date-range-picker/DateRangePicker.js +20 -9
  110. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
  111. package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
  112. package/dist/components/form-control/editor/EditorToolbar.js +65 -20
  113. package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
  114. package/dist/components/form-control/editor/RichTextEditor.d.ts +6 -6
  115. package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
  116. package/dist/components/form-control/editor/RichTextEditor.js +1 -1
  117. package/dist/components/form-control/editor/editor.css +5 -5
  118. package/dist/components/form-control/field/DatePicker.d.ts +22 -22
  119. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  120. package/dist/components/form-control/field/DatePicker.js +4 -4
  121. package/dist/components/form-control/field/DatePicker.js.map +1 -1
  122. package/dist/components/form-control/field/DateTimePicker.d.ts +21 -21
  123. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  124. package/dist/components/form-control/field/DateTimePicker.js +4 -4
  125. package/dist/components/form-control/field/DateTimePicker.js.map +1 -1
  126. package/dist/components/form-control/field/FieldPlaceholder.d.ts +1 -1
  127. package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -1
  128. package/dist/components/form-control/field/NumberInput.d.ts +23 -23
  129. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  130. package/dist/components/form-control/field/NumberInput.js +4 -4
  131. package/dist/components/form-control/field/NumberInput.js.map +1 -1
  132. package/dist/components/form-control/field/TextInput.d.ts +25 -25
  133. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  134. package/dist/components/form-control/field/TextInput.js +5 -5
  135. package/dist/components/form-control/field/TextInput.js.map +1 -1
  136. package/dist/components/form-control/field/Textarea.d.ts +19 -19
  137. package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
  138. package/dist/components/form-control/field/Textarea.js +4 -4
  139. package/dist/components/form-control/field/Textarea.js.map +1 -1
  140. package/dist/components/form-control/field/TimePicker.d.ts +20 -20
  141. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  142. package/dist/components/form-control/field/TimePicker.js +4 -4
  143. package/dist/components/form-control/field/TimePicker.js.map +1 -1
  144. package/dist/components/form-control/numpad/Numpad.d.ts +11 -11
  145. package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
  146. package/dist/components/form-control/select/Select.d.ts +26 -26
  147. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  148. package/dist/components/form-control/select/Select.js +34 -23
  149. package/dist/components/form-control/select/Select.js.map +2 -2
  150. package/dist/components/form-control/select/SelectContext.d.ts +7 -7
  151. package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
  152. package/dist/components/form-control/select/SelectContext.js +1 -1
  153. package/dist/components/form-control/select/SelectContext.js.map +1 -1
  154. package/dist/components/form-control/select/SelectItem.d.ts +4 -4
  155. package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
  156. package/dist/components/form-control/state-preset/StatePreset.js +8 -8
  157. package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
  158. package/dist/components/layout/FormTable.js +4 -4
  159. package/dist/components/layout/sidebar/Sidebar.d.ts +5 -5
  160. package/dist/components/layout/sidebar/SidebarContainer.d.ts +11 -11
  161. package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
  162. package/dist/components/layout/sidebar/SidebarContainer.js +6 -1
  163. package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
  164. package/dist/components/layout/sidebar/SidebarContext.d.ts +7 -7
  165. package/dist/components/layout/sidebar/SidebarContext.js +1 -1
  166. package/dist/components/layout/sidebar/SidebarContext.js.map +1 -1
  167. package/dist/components/layout/sidebar/SidebarMenu.d.ts +11 -11
  168. package/dist/components/layout/sidebar/SidebarUser.d.ts +14 -14
  169. package/dist/components/layout/topbar/Topbar.d.ts +6 -6
  170. package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
  171. package/dist/components/layout/topbar/Topbar.js +11 -6
  172. package/dist/components/layout/topbar/Topbar.js.map +2 -2
  173. package/dist/components/layout/topbar/TopbarContainer.d.ts +6 -6
  174. package/dist/components/layout/topbar/TopbarContext.js +2 -2
  175. package/dist/components/layout/topbar/TopbarContext.js.map +1 -1
  176. package/dist/components/layout/topbar/TopbarMenu.d.ts +11 -11
  177. package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
  178. package/dist/components/layout/topbar/TopbarMenu.js +5 -1
  179. package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
  180. package/dist/components/layout/topbar/TopbarUser.d.ts +9 -9
  181. package/dist/directives/ripple.d.ts +5 -5
  182. package/dist/helpers/createAppStructure.d.ts.map +1 -1
  183. package/dist/helpers/createAppStructure.js +4 -1
  184. package/dist/helpers/createAppStructure.js.map +1 -1
  185. package/dist/helpers/createSlotComponent.d.ts +3 -3
  186. package/dist/helpers/mergeStyles.d.ts +8 -8
  187. package/dist/hooks/createControllableSignal.d.ts +10 -10
  188. package/dist/hooks/createControllableStore.d.ts +6 -6
  189. package/dist/hooks/createIMEHandler.d.ts +7 -7
  190. package/dist/hooks/createMountTransition.d.ts +4 -4
  191. package/dist/hooks/createSelectionGroup.js +1 -1
  192. package/dist/hooks/createSelectionGroup.js.map +1 -1
  193. package/dist/hooks/createSlotSignal.d.ts +2 -2
  194. package/dist/hooks/useLocalStorage.d.ts +11 -11
  195. package/dist/hooks/useLogger.d.ts +1 -1
  196. package/dist/hooks/useLogger.d.ts.map +1 -1
  197. package/dist/hooks/useLogger.js +1 -1
  198. package/dist/hooks/useLogger.js.map +1 -1
  199. package/dist/hooks/useRouterLink.d.ts +10 -10
  200. package/dist/hooks/useRouterLink.d.ts.map +1 -1
  201. package/dist/index.d.ts +2 -1
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +2 -1
  204. package/dist/index.js.map +1 -1
  205. package/dist/providers/ClipboardProvider.d.ts +5 -5
  206. package/dist/providers/ConfigContext.d.ts +6 -6
  207. package/dist/providers/ConfigContext.js +2 -2
  208. package/dist/providers/ConfigContext.js.map +1 -1
  209. package/dist/providers/ErrorLoggerProvider.d.ts +3 -3
  210. package/dist/providers/LoggerContext.d.ts +13 -13
  211. package/dist/providers/PwaUpdateProvider.d.ts +4 -4
  212. package/dist/providers/PwaUpdateProvider.js +2 -2
  213. package/dist/providers/PwaUpdateProvider.js.map +1 -1
  214. package/dist/providers/ServiceClientContext.d.ts +8 -8
  215. package/dist/providers/ServiceClientContext.d.ts.map +1 -1
  216. package/dist/providers/ServiceClientContext.js +1 -1
  217. package/dist/providers/ServiceClientContext.js.map +1 -1
  218. package/dist/providers/ServiceClientProvider.d.ts +6 -6
  219. package/dist/providers/ServiceClientProvider.js +7 -7
  220. package/dist/providers/ServiceClientProvider.js.map +1 -1
  221. package/dist/providers/SyncStorageContext.d.ts +14 -14
  222. package/dist/providers/SystemProvider.d.ts.map +1 -1
  223. package/dist/providers/SystemProvider.js +21 -16
  224. package/dist/providers/SystemProvider.js.map +2 -2
  225. package/dist/providers/ThemeContext.d.ts +20 -20
  226. package/dist/providers/ThemeContext.d.ts.map +1 -1
  227. package/dist/providers/ThemeContext.js +1 -1
  228. package/dist/providers/ThemeContext.js.map +1 -1
  229. package/dist/providers/i18n/I18nContext.d.ts +44 -0
  230. package/dist/providers/i18n/I18nContext.d.ts.map +1 -0
  231. package/dist/providers/i18n/I18nContext.js +73 -0
  232. package/dist/providers/i18n/I18nContext.js.map +6 -0
  233. package/dist/providers/i18n/I18nContext.types.d.ts +28 -0
  234. package/dist/providers/i18n/I18nContext.types.d.ts.map +1 -0
  235. package/dist/providers/i18n/I18nContext.types.js +1 -0
  236. package/dist/providers/i18n/I18nContext.types.js.map +6 -0
  237. package/dist/providers/i18n/i18nUtils.d.ts +18 -0
  238. package/dist/providers/i18n/i18nUtils.d.ts.map +1 -0
  239. package/dist/providers/i18n/i18nUtils.js +25 -0
  240. package/dist/providers/i18n/i18nUtils.js.map +6 -0
  241. package/dist/providers/i18n/locales/en.d.ts +163 -0
  242. package/dist/providers/i18n/locales/en.d.ts.map +1 -0
  243. package/dist/providers/i18n/locales/en.js +165 -0
  244. package/dist/providers/i18n/locales/en.js.map +6 -0
  245. package/dist/providers/i18n/locales/ko.d.ts +163 -0
  246. package/dist/providers/i18n/locales/ko.d.ts.map +1 -0
  247. package/dist/providers/i18n/locales/ko.js +165 -0
  248. package/dist/providers/i18n/locales/ko.js.map +6 -0
  249. package/dist/providers/shared-data/SharedDataChangeEvent.d.ts +4 -4
  250. package/dist/providers/shared-data/SharedDataContext.d.ts +28 -28
  251. package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
  252. package/dist/providers/shared-data/SharedDataContext.js +1 -1
  253. package/dist/providers/shared-data/SharedDataContext.js.map +1 -1
  254. package/dist/providers/shared-data/SharedDataProvider.d.ts +9 -9
  255. package/dist/providers/shared-data/SharedDataProvider.js +4 -4
  256. package/dist/providers/shared-data/SharedDataProvider.js.map +1 -1
  257. package/package.json +8 -8
  258. package/src/components/data/calendar/Calendar.tsx +10 -4
  259. package/src/components/data/kanban/Kanban.tsx +14 -14
  260. package/src/components/data/kanban/KanbanContext.ts +3 -3
  261. package/src/components/data/list/List.tsx +10 -10
  262. package/src/components/data/list/ListContext.ts +1 -1
  263. package/src/components/data/list/ListItem.styles.ts +8 -8
  264. package/src/components/data/list/ListItem.tsx +15 -15
  265. package/src/components/data/sheet/DataSheet.styles.ts +22 -22
  266. package/src/components/data/sheet/DataSheet.tsx +52 -48
  267. package/src/components/data/sheet/DataSheetColumn.tsx +1 -1
  268. package/src/components/data/sheet/DataSheetConfigDialog.tsx +9 -9
  269. package/src/components/data/sheet/sheetUtils.ts +7 -7
  270. package/src/components/data/sheet/types.ts +16 -16
  271. package/src/components/disclosure/Collapse.tsx +11 -11
  272. package/src/components/disclosure/Dialog.tsx +60 -57
  273. package/src/components/disclosure/DialogContext.ts +26 -26
  274. package/src/components/disclosure/DialogInstanceContext.ts +7 -7
  275. package/src/components/disclosure/DialogProvider.tsx +5 -5
  276. package/src/components/disclosure/Dropdown.tsx +64 -64
  277. package/src/components/disclosure/Tabs.tsx +1 -1
  278. package/src/components/disclosure/dialogZIndex.ts +11 -11
  279. package/src/components/display/Echarts.tsx +4 -4
  280. package/src/components/features/address/AddressSearch.tsx +2 -2
  281. package/src/components/features/crud-detail/CrudDetail.tsx +18 -16
  282. package/src/components/features/crud-detail/CrudDetailAfter.tsx +1 -1
  283. package/src/components/features/crud-detail/CrudDetailBefore.tsx +1 -1
  284. package/src/components/features/crud-detail/CrudDetailTools.tsx +1 -1
  285. package/src/components/features/crud-sheet/CrudSheet.tsx +39 -37
  286. package/src/components/features/crud-sheet/CrudSheetColumn.tsx +1 -1
  287. package/src/components/features/crud-sheet/CrudSheetFilter.tsx +1 -1
  288. package/src/components/features/crud-sheet/CrudSheetHeader.tsx +1 -1
  289. package/src/components/features/crud-sheet/CrudSheetTools.tsx +1 -1
  290. package/src/components/features/data-select-button/DataSelectButton.tsx +34 -32
  291. package/src/components/features/permission-table/PermissionTable.tsx +22 -19
  292. package/src/components/features/shared-data/SharedDataSelect.tsx +22 -20
  293. package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
  294. package/src/components/features/shared-data/SharedDataSelectList.tsx +245 -48
  295. package/src/components/features/shared-data/SharedDataSelectListContext.ts +39 -0
  296. package/src/components/feedback/Progress.tsx +1 -1
  297. package/src/components/feedback/busy/BusyContainer.tsx +6 -6
  298. package/src/components/feedback/busy/BusyContext.ts +12 -12
  299. package/src/components/feedback/busy/BusyProvider.tsx +6 -6
  300. package/src/components/feedback/notification/NotificationBanner.tsx +3 -1
  301. package/src/components/feedback/notification/NotificationBell.tsx +4 -4
  302. package/src/components/feedback/notification/NotificationContext.ts +28 -28
  303. package/src/components/feedback/notification/NotificationProvider.tsx +9 -9
  304. package/src/components/feedback/print/PrintContext.ts +1 -1
  305. package/src/components/form-control/Button.tsx +1 -1
  306. package/src/components/form-control/DropdownTrigger.styles.ts +1 -1
  307. package/src/components/form-control/Invalid.tsx +5 -5
  308. package/src/components/form-control/ThemeToggle.tsx +10 -10
  309. package/src/components/form-control/checkbox/Checkbox.styles.ts +8 -8
  310. package/src/components/form-control/checkbox/Checkbox.tsx +2 -2
  311. package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
  312. package/src/components/form-control/checkbox/Radio.tsx +2 -2
  313. package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
  314. package/src/components/form-control/color-picker/ColorPicker.tsx +17 -17
  315. package/src/components/form-control/combobox/Combobox.tsx +55 -55
  316. package/src/components/form-control/combobox/ComboboxContext.ts +5 -5
  317. package/src/components/form-control/combobox/ComboboxItem.tsx +3 -3
  318. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +40 -26
  319. package/src/components/form-control/editor/EditorToolbar.tsx +52 -50
  320. package/src/components/form-control/editor/RichTextEditor.tsx +16 -16
  321. package/src/components/form-control/editor/editor.css +5 -5
  322. package/src/components/form-control/field/DatePicker.tsx +39 -39
  323. package/src/components/form-control/field/DateTimePicker.tsx +38 -38
  324. package/src/components/form-control/field/Field.styles.ts +11 -11
  325. package/src/components/form-control/field/FieldPlaceholder.tsx +1 -1
  326. package/src/components/form-control/field/NumberInput.tsx +63 -63
  327. package/src/components/form-control/field/TextInput.tsx +48 -48
  328. package/src/components/form-control/field/Textarea.tsx +32 -32
  329. package/src/components/form-control/field/TimePicker.tsx +37 -37
  330. package/src/components/form-control/numpad/Numpad.tsx +26 -26
  331. package/src/components/form-control/select/Select.tsx +84 -84
  332. package/src/components/form-control/select/SelectContext.ts +8 -8
  333. package/src/components/form-control/select/SelectItem.tsx +5 -5
  334. package/src/components/form-control/state-preset/StatePreset.tsx +13 -13
  335. package/src/components/layout/FormTable.tsx +4 -4
  336. package/src/components/layout/sidebar/Sidebar.tsx +8 -8
  337. package/src/components/layout/sidebar/SidebarContainer.tsx +19 -17
  338. package/src/components/layout/sidebar/SidebarContext.ts +8 -8
  339. package/src/components/layout/sidebar/SidebarMenu.tsx +19 -19
  340. package/src/components/layout/sidebar/SidebarUser.tsx +14 -14
  341. package/src/components/layout/topbar/Topbar.tsx +15 -13
  342. package/src/components/layout/topbar/TopbarContainer.tsx +6 -6
  343. package/src/components/layout/topbar/TopbarContext.ts +2 -2
  344. package/src/components/layout/topbar/TopbarMenu.tsx +18 -16
  345. package/src/components/layout/topbar/TopbarUser.tsx +9 -9
  346. package/src/directives/ripple.ts +8 -8
  347. package/src/helpers/createAppStructure.ts +12 -6
  348. package/src/helpers/createSlotComponent.ts +4 -4
  349. package/src/helpers/mergeStyles.ts +11 -11
  350. package/src/hooks/createControllableSignal.ts +11 -11
  351. package/src/hooks/createControllableStore.ts +8 -8
  352. package/src/hooks/createIMEHandler.ts +7 -7
  353. package/src/hooks/createMountTransition.ts +4 -4
  354. package/src/hooks/createSelectionGroup.tsx +1 -1
  355. package/src/hooks/createSlotSignal.ts +2 -2
  356. package/src/hooks/useLocalStorage.ts +13 -13
  357. package/src/hooks/useLogger.ts +2 -2
  358. package/src/hooks/useRouterLink.ts +15 -15
  359. package/src/index.ts +4 -3
  360. package/src/providers/ClipboardProvider.tsx +19 -19
  361. package/src/providers/ConfigContext.tsx +8 -8
  362. package/src/providers/ErrorLoggerProvider.tsx +3 -3
  363. package/src/providers/LoggerContext.tsx +13 -13
  364. package/src/providers/PwaUpdateProvider.tsx +6 -6
  365. package/src/providers/ServiceClientContext.ts +9 -9
  366. package/src/providers/ServiceClientProvider.tsx +15 -15
  367. package/src/providers/SyncStorageContext.tsx +15 -15
  368. package/src/providers/SystemProvider.tsx +15 -12
  369. package/src/providers/ThemeContext.tsx +26 -26
  370. package/src/providers/i18n/I18nContext.tsx +129 -0
  371. package/src/providers/i18n/I18nContext.types.ts +30 -0
  372. package/src/providers/i18n/i18nUtils.ts +38 -0
  373. package/src/providers/i18n/locales/en.ts +161 -0
  374. package/src/providers/i18n/locales/ko.ts +161 -0
  375. package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -4
  376. package/src/providers/shared-data/SharedDataContext.ts +29 -29
  377. package/src/providers/shared-data/SharedDataProvider.tsx +21 -21
  378. package/src/styles/patterns.styles.ts +6 -6
  379. package/src/styles/tokens.styles.ts +5 -5
  380. package/tailwind.config.ts +1 -1
  381. package/tailwind.css +4 -4
  382. package/tests/components/data/List.spec.tsx +689 -0
  383. package/tests/components/data/Pagination.spec.tsx +336 -0
  384. package/tests/components/data/Table.spec.tsx +55 -0
  385. package/tests/components/data/kanban/Kanban.selection.spec.tsx +213 -0
  386. package/tests/components/data/sheet/DataSheet.spec.tsx +645 -0
  387. package/tests/components/disclosure/Collapse.spec.tsx +173 -0
  388. package/tests/components/disclosure/Dialog.spec.tsx +438 -0
  389. package/tests/components/disclosure/DialogProvider.spec.tsx +142 -0
  390. package/tests/components/disclosure/Dropdown.spec.tsx +213 -0
  391. package/tests/components/disclosure/Tabs.spec.tsx +220 -0
  392. package/tests/components/display/Alert.spec.tsx +47 -0
  393. package/tests/components/display/Barcode.spec.tsx +61 -0
  394. package/tests/components/display/Card.spec.tsx +41 -0
  395. package/tests/components/display/Link.spec.tsx +62 -0
  396. package/tests/components/display/Tag.spec.tsx +47 -0
  397. package/tests/components/features/address/AddressSearch.spec.tsx +45 -0
  398. package/tests/components/features/crud-detail/CrudDetail.spec.tsx +537 -0
  399. package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +491 -0
  400. package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +482 -0
  401. package/tests/components/features/permission-table/PermissionTable.spec.tsx +288 -0
  402. package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +463 -0
  403. package/tests/components/feedback/busy/BusyContainer.spec.tsx +80 -0
  404. package/tests/components/feedback/notification/LiveRegion.spec.tsx +52 -0
  405. package/tests/components/feedback/notification/NotificationBanner.spec.tsx +187 -0
  406. package/tests/components/feedback/notification/NotificationBell.spec.tsx +226 -0
  407. package/tests/components/feedback/notification/NotificationContext.spec.tsx +362 -0
  408. package/tests/components/feedback/print/Print.spec.tsx +45 -0
  409. package/tests/components/form-control/Button.spec.tsx +119 -0
  410. package/tests/components/form-control/Invalid.spec.tsx +131 -0
  411. package/tests/components/form-control/checkbox/Checkbox.spec.tsx +137 -0
  412. package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +108 -0
  413. package/tests/components/form-control/checkbox/Radio.spec.tsx +138 -0
  414. package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +108 -0
  415. package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +94 -0
  416. package/tests/components/form-control/combobox/Combobox.spec.tsx +253 -0
  417. package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +88 -0
  418. package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +208 -0
  419. package/tests/components/form-control/field/DatePicker.spec.tsx +381 -0
  420. package/tests/components/form-control/field/DateTimePicker.spec.tsx +383 -0
  421. package/tests/components/form-control/field/NumberInput.spec.tsx +371 -0
  422. package/tests/components/form-control/field/TextInput.spec.tsx +341 -0
  423. package/tests/components/form-control/field/Textarea.spec.tsx +224 -0
  424. package/tests/components/form-control/field/TimePicker.spec.tsx +315 -0
  425. package/tests/components/form-control/numpad/Numpad.spec.tsx +248 -0
  426. package/tests/components/form-control/select/Select.spec.tsx +676 -0
  427. package/tests/components/form-control/select/SelectItem.spec.tsx +174 -0
  428. package/tests/components/layout/FormGroup.spec.tsx +104 -0
  429. package/tests/components/layout/FormTable.spec.tsx +43 -0
  430. package/tests/components/layout/sidebar/Sidebar.spec.tsx +192 -0
  431. package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +261 -0
  432. package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +219 -0
  433. package/tests/components/layout/sidebar/SidebarUser.spec.tsx +133 -0
  434. package/tests/components/layout/topbar/TopbarActions.spec.tsx +77 -0
  435. package/tests/components/layout/topbar/TopbarContainer.spec.tsx +38 -0
  436. package/tests/components/layout/topbar/createTopbarActions.spec.tsx +66 -0
  437. package/tests/directives/ripple.spec.tsx +130 -0
  438. package/tests/helpers/createAppStructure.spec.tsx +843 -0
  439. package/tests/helpers/mergeStyles.spec.ts +172 -0
  440. package/tests/hooks/createControllableSignal.spec.ts +194 -0
  441. package/tests/hooks/createIMEHandler.spec.ts +80 -0
  442. package/tests/hooks/createMountTransition.spec.ts +86 -0
  443. package/tests/hooks/useLocalStorage.spec.tsx +223 -0
  444. package/tests/hooks/useLogger.spec.tsx +116 -0
  445. package/tests/hooks/usePrint.spec.tsx +134 -0
  446. package/tests/hooks/useRouterLink.spec.tsx +183 -0
  447. package/tests/hooks/useSyncConfig.spec.tsx +304 -0
  448. package/tests/providers/ClipboardProvider.spec.tsx +20 -0
  449. package/tests/providers/ConfigContext.spec.tsx +42 -0
  450. package/tests/providers/ErrorLoggerProvider.spec.tsx +73 -0
  451. package/tests/providers/LoggerContext.spec.tsx +76 -0
  452. package/tests/providers/PwaUpdateProvider.spec.tsx +22 -0
  453. package/tests/providers/ServiceClientContext.spec.tsx +88 -0
  454. package/tests/providers/SyncStorageContext.spec.tsx +77 -0
  455. package/tests/providers/i18n/I18nContext.spec.tsx +110 -0
  456. package/tests/providers/shared-data/SharedDataProvider.spec.tsx +401 -0
  457. package/tests/vitest-env.d.ts +1 -0
  458. package/dist/components/form-control/select-list/SelectList.d.ts +0 -54
  459. package/dist/components/form-control/select-list/SelectList.d.ts.map +0 -1
  460. package/dist/components/form-control/select-list/SelectList.js +0 -280
  461. package/dist/components/form-control/select-list/SelectList.js.map +0 -6
  462. package/dist/components/form-control/select-list/SelectListContext.d.ts +0 -13
  463. package/dist/components/form-control/select-list/SelectListContext.d.ts.map +0 -1
  464. package/dist/components/form-control/select-list/SelectListContext.js +0 -14
  465. package/dist/components/form-control/select-list/SelectListContext.js.map +0 -6
  466. package/docs/data-components.md +0 -782
  467. package/docs/disclosure.md +0 -254
  468. package/docs/display.md +0 -153
  469. package/docs/feedback.md +0 -238
  470. package/docs/form-controls.md +0 -1068
  471. package/docs/helpers.md +0 -54
  472. package/docs/hooks.md +0 -588
  473. package/docs/layout.md +0 -384
  474. package/docs/providers.md +0 -211
  475. package/docs/styling.md +0 -184
  476. package/src/components/form-control/select-list/SelectList.tsx +0 -385
  477. package/src/components/form-control/select-list/SelectListContext.ts +0 -23
@@ -15,12 +15,13 @@ import { DataSheet } from "../../data/sheet/DataSheet";
15
15
  import { Checkbox } from "../../form-control/checkbox/Checkbox";
16
16
  import { borderDefault } from "../../../styles/tokens.styles";
17
17
  import type { AppPerm } from "../../../helpers/createAppStructure";
18
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
18
19
 
19
20
  const titleCellClass = clsx("flex items-stretch", "px-2");
20
21
  const indentGuideWrapperClass = clsx("mr-1 flex w-3", "justify-center");
21
22
  const indentGuideLineClass = clsx("w-0 self-stretch", "border-r", borderDefault);
22
23
 
23
- // --- 타입 ---
24
+ // --- Types ---
24
25
 
25
26
  export interface PermissionTableProps<TModule = string> {
26
27
  items?: AppPerm<TModule>[];
@@ -32,9 +33,9 @@ export interface PermissionTableProps<TModule = string> {
32
33
  style?: JSX.CSSProperties;
33
34
  }
34
35
 
35
- // --- 유틸리티 (테스트에서도 사용) ---
36
+ // --- Utilities (also used in tests) ---
36
37
 
37
- /** 트리에서 모든 고유 perm 타입을 수집 */
38
+ /** Collect all unique perm types from the tree */
38
39
  export function collectAllPerms<TModule>(items: AppPerm<TModule>[]): string[] {
39
40
  const set = new Set<string>();
40
41
  const walk = (list: AppPerm<TModule>[]) => {
@@ -49,7 +50,7 @@ export function collectAllPerms<TModule>(items: AppPerm<TModule>[]): string[] {
49
50
  return [...set];
50
51
  }
51
52
 
52
- /** modules 필터: 활성 모듈과 교차가 있는 아이템만 남김 */
53
+ /** Filter by modules: keep only items that have intersection with active modules */
53
54
  export function filterByModules<TModule>(
54
55
  items: AppPerm<TModule>[],
55
56
  modules: TModule[] | undefined,
@@ -72,7 +73,7 @@ export function filterByModules<TModule>(
72
73
  return result;
73
74
  }
74
75
 
75
- /** 체크 변경 cascading 처리 */
76
+ /** Handle cascading when checkbox changes */
76
77
  export function changePermCheck<TModule>(
77
78
  value: Record<string, boolean>,
78
79
  item: AppPerm<TModule>,
@@ -112,9 +113,9 @@ export function changePermCheck<TModule>(
112
113
  return result;
113
114
  }
114
115
 
115
- // --- 내부 헬퍼 ---
116
+ // --- Internal Helpers ---
116
117
 
117
- /** 모듈 필터에 의해 보이는지 확인 (객체 참조 유지) */
118
+ /** Check if item is visible by module filter (preserve object reference) */
118
119
  function isItemVisible<TModule>(item: AppPerm<TModule>, modules: TModule[] | undefined): boolean {
119
120
  if (!modules || modules.length === 0) return true;
120
121
  if (item.modules && !item.modules.some((m) => modules.includes(m))) return false;
@@ -124,7 +125,7 @@ function isItemVisible<TModule>(item: AppPerm<TModule>, modules: TModule[] | und
124
125
  return true;
125
126
  }
126
127
 
127
- /** 보이는 아이템에서만 고유 perm 타입 수집 */
128
+ /** Collect unique perm types from visible items only */
128
129
  function collectVisiblePerms<TModule>(
129
130
  items: AppPerm<TModule>[],
130
131
  modules: TModule[] | undefined,
@@ -145,7 +146,7 @@ function collectVisiblePerms<TModule>(
145
146
  return [...set];
146
147
  }
147
148
 
148
- /** 그룹 노드의 체크 상태: 하위 하나라도 체크면 true */
149
+ /** Get check state of group node: true if any child is checked */
149
150
  function isGroupPermChecked<TModule>(
150
151
  item: AppPerm<TModule>,
151
152
  perm: string,
@@ -160,7 +161,7 @@ function isGroupPermChecked<TModule>(
160
161
  return false;
161
162
  }
162
163
 
163
- /** 하위에 특정 perm 하나라도 있으면 true */
164
+ /** Check if specific perm exists in subtree */
164
165
  function hasPermInTree<TModule>(item: AppPerm<TModule>, perm: string): boolean {
165
166
  if (item.perms?.includes(perm)) return true;
166
167
  if (item.children) {
@@ -169,7 +170,7 @@ function hasPermInTree<TModule>(item: AppPerm<TModule>, perm: string): boolean {
169
170
  return false;
170
171
  }
171
172
 
172
- /** 기본 권한(perms[0])이 꺼져 있어서 비활성화해야 하는지 */
173
+ /** Check if perm should be disabled (base perm is off) */
173
174
  function isPermDisabled<TModule>(
174
175
  item: AppPerm<TModule>,
175
176
  perm: string,
@@ -181,7 +182,7 @@ function isPermDisabled<TModule>(
181
182
  return !(value[item.href + "/" + basePerm] ?? false);
182
183
  }
183
184
 
184
- /** 확장 가능한 모든 아이템 수집 (객체 참조 유지) */
185
+ /** Collect all expandable items (preserve object reference) */
185
186
  function collectExpandable<TModule>(
186
187
  items: AppPerm<TModule>[],
187
188
  getChildren: (item: AppPerm<TModule>) => AppPerm<TModule>[] | undefined,
@@ -202,7 +203,7 @@ function collectExpandable<TModule>(
202
203
  return result;
203
204
  }
204
205
 
205
- // --- 컴포넌트 ---
206
+ // --- Component ---
206
207
 
207
208
  export const PermissionTable: Component<PermissionTableProps> = (props) => {
208
209
  const [local] = splitProps(props, [
@@ -215,14 +216,16 @@ export const PermissionTable: Component<PermissionTableProps> = (props) => {
215
216
  "style",
216
217
  ]);
217
218
 
218
- // 보이는 최상위 아이템 (객체 참조 유지)
219
+ const i18n = useI18nOptional();
220
+
221
+ // Visible top-level items (preserve object reference)
219
222
  const visibleItems = createMemo(() => {
220
223
  const items = local.items ?? [];
221
224
  if (!local.modules || local.modules.length === 0) return items;
222
225
  return items.filter((item) => isItemVisible(item, local.modules));
223
226
  });
224
227
 
225
- // Sheet getChildren — 모듈 필터 적용, 객체 참조 유지
228
+ // Sheet's getChildren — apply module filter, preserve object reference
226
229
  const getChildren = (item: AppPerm): AppPerm[] | undefined => {
227
230
  if (!item.children || item.children.length === 0) return undefined;
228
231
  const modules = local.modules;
@@ -231,17 +234,17 @@ export const PermissionTable: Component<PermissionTableProps> = (props) => {
231
234
  return filtered.length > 0 ? filtered : undefined;
232
235
  };
233
236
 
234
- // 보이는 아이템의 모든 고유 perm 타입
237
+ // All unique perm types from visible items
235
238
  const allPerms = createMemo(() => collectVisiblePerms(local.items ?? [], local.modules));
236
239
 
237
240
  const currentValue = createMemo(() => local.value ?? {});
238
241
 
239
- // 확장 상태기본적으로 모두 펼침
242
+ // Expanded stateall expanded by default
240
243
  const getAllExpandable = () => collectExpandable(visibleItems(), getChildren);
241
244
 
242
245
  const [expandedItems, setExpandedItems] = createSignal<AppPerm[]>(getAllExpandable());
243
246
 
244
- // 트리 구조 변경 모두 다시 펼침 (모듈 필터 변경 )
247
+ // Re-expand all when tree structure changes (e.g., module filter changed)
245
248
  createEffect(
246
249
  on(
247
250
  visibleItems,
@@ -266,7 +269,7 @@ export const PermissionTable: Component<PermissionTableProps> = (props) => {
266
269
  onExpandedItemsChange={setExpandedItems}
267
270
  hideConfigBar
268
271
  >
269
- <DataSheet.Column key="title" header="권한 항목" sortable={false} resizable={false}>
272
+ <DataSheet.Column key="title" header={i18n?.t("permissionTable.permissionItem") ?? "Permission Item"} sortable={false} resizable={false}>
270
273
  {(ctx) => {
271
274
  const item = ctx.item as AppPerm;
272
275
  return (
@@ -4,72 +4,74 @@ import { type SharedDataAccessor } from "../../../providers/shared-data/SharedDa
4
4
  import { Select, type SelectProps } from "../../form-control/select/Select";
5
5
  import { Icon } from "../../display/Icon";
6
6
  import { useDialog } from "../../disclosure/DialogContext";
7
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
7
8
  import { type ComponentSize } from "../../../styles/tokens.styles";
8
9
 
9
10
  /** SharedDataSelect Props */
10
11
  export interface SharedDataSelectProps<TItem> {
11
- /** 공유 데이터 접근자 */
12
+ /** Shared data accessor */
12
13
  data: SharedDataAccessor<TItem>;
13
14
 
14
- /** 현재 선택된 */
15
+ /** Currently selected value */
15
16
  value?: unknown;
16
- /** 변경 콜백 */
17
+ /** Value change callback */
17
18
  onValueChange?: (value: unknown) => void;
18
- /** 다중 선택 모드 */
19
+ /** Multiple selection mode */
19
20
  multiple?: boolean;
20
- /** 필수 입력 */
21
+ /** Required input */
21
22
  required?: boolean;
22
- /** 비활성화 */
23
+ /** Disabled */
23
24
  disabled?: boolean;
24
- /** 트리거 크기 */
25
+ /** Trigger size */
25
26
  size?: ComponentSize;
26
- /** 테두리 없는 스타일 */
27
+ /** Borderless style */
27
28
  inset?: boolean;
28
29
 
29
- /** 항목 필터 함수 */
30
+ /** Item filter function */
30
31
  filterFn?: (item: TItem, index: number) => boolean;
31
- /** 선택 모달 컴포넌트 팩토리 */
32
+ /** Selection modal component factory */
32
33
  modal?: () => JSX.Element;
33
- /** 편집 모달 컴포넌트 팩토리 */
34
+ /** Edit modal component factory */
34
35
  editModal?: () => JSX.Element;
35
36
 
36
- /** 아이템 렌더링 함수 */
37
+ /** Item rendering function */
37
38
  children: (item: TItem, index: number, depth: number) => JSX.Element;
38
39
  }
39
40
 
40
41
  export function SharedDataSelect<TItem>(props: SharedDataSelectProps<TItem>): JSX.Element {
41
42
  const [local, rest] = splitProps(props, ["data", "filterFn", "modal", "editModal", "children"]);
42
43
 
44
+ const i18n = useI18nOptional();
43
45
  const dialog = useDialog();
44
46
 
45
- // filterFn 적용된 items
47
+ // Items with filterFn applied
46
48
  const items = createMemo(() => {
47
49
  const allItems = local.data.items();
48
50
  if (!local.filterFn) return allItems;
49
51
  return allItems.filter(local.filterFn);
50
52
  });
51
53
 
52
- // modal 열기
54
+ // Open modal
53
55
  const handleOpenModal = async () => {
54
56
  if (!local.modal) return;
55
57
  await dialog.show(local.modal, {});
56
58
  };
57
59
 
58
- // editModal 열기
60
+ // Open edit modal
59
61
  const handleOpenEditModal = async () => {
60
62
  if (!local.editModal) return;
61
63
  await dialog.show(local.editModal, {});
62
64
  };
63
65
 
64
- // Select discriminated union (multiple: true | false?) TItem → unknown 변환을 위해 mergeProps + as 사용
65
- // getter 래핑하여 SolidJS 반응성 lint 규칙 충족
66
+ // Use mergeProps + as for Select's discriminated union (multiple: true | false?) and TItem → unknown conversion
67
+ // Wrap with getter to satisfy SolidJS reactivity lint rules
66
68
  const selectProps = mergeProps(rest, {
67
69
  get items() {
68
70
  return items();
69
71
  },
70
72
  get getChildren() {
71
73
  if (!local.data.getParentKey) return undefined;
72
- // eslint-disable-next-line solid/reactivity -- 반환 함수는 Select 내부 JSX tracked scope에서 호출됨
74
+ // eslint-disable-next-line solid/reactivity -- return function is called within Select's internal JSX tracked scope
73
75
  return (item: TItem) => {
74
76
  const key = local.data.getKey(item);
75
77
  return items().filter((child) => local.data.getParentKey!(child) === key);
@@ -87,12 +89,12 @@ export function SharedDataSelect<TItem>(props: SharedDataSelectProps<TItem>): JS
87
89
  <Select {...selectProps}>
88
90
  <Select.ItemTemplate>{local.children}</Select.ItemTemplate>
89
91
  {local.modal && (
90
- <Select.Action onClick={() => void handleOpenModal()} aria-label="검색">
92
+ <Select.Action onClick={() => void handleOpenModal()} aria-label={i18n?.t("sharedDataSelect.search") ?? "Search"}>
91
93
  <Icon icon={IconSearch} size="1em" />
92
94
  </Select.Action>
93
95
  )}
94
96
  {local.editModal && (
95
- <Select.Action onClick={() => void handleOpenEditModal()} aria-label="편집">
97
+ <Select.Action onClick={() => void handleOpenEditModal()} aria-label={i18n?.t("sharedDataSelect.edit") ?? "Edit"}>
96
98
  <Icon icon={IconEdit} size="1em" />
97
99
  </Select.Action>
98
100
  )}
@@ -8,27 +8,27 @@ import { type ComponentSize } from "../../../styles/tokens.styles";
8
8
 
9
9
  /** SharedDataSelectButton Props */
10
10
  export interface SharedDataSelectButtonProps<TItem> {
11
- /** 공유 데이터 접근자 */
11
+ /** Shared data accessor */
12
12
  data: SharedDataAccessor<TItem>;
13
13
 
14
- /** 현재 선택된 (단일 또는 다중) */
14
+ /** Currently selected key(s) (single or multiple) */
15
15
  value?: DataSelectButtonProps<TItem>["value"];
16
- /** 변경 콜백 */
16
+ /** Value change callback */
17
17
  onValueChange?: DataSelectButtonProps<TItem>["onValueChange"];
18
- /** 다중 선택 모드 */
18
+ /** Multiple selection mode */
19
19
  multiple?: boolean;
20
- /** 필수 입력 */
20
+ /** Required input */
21
21
  required?: boolean;
22
- /** 비활성화 */
22
+ /** Disabled */
23
23
  disabled?: boolean;
24
- /** 트리거 크기 */
24
+ /** Trigger size */
25
25
  size?: ComponentSize;
26
- /** 테두리 없는 스타일 */
26
+ /** Borderless style */
27
27
  inset?: boolean;
28
28
 
29
- /** 선택 모달 컴포넌트 팩토리 */
29
+ /** Selection modal component factory */
30
30
  modal: () => JSX.Element;
31
- /** 아이템 렌더링 함수 */
31
+ /** Item rendering function */
32
32
  children: (item: TItem) => JSX.Element;
33
33
  }
34
34
 
@@ -1,85 +1,282 @@
1
- import { createMemo, type JSX, Show, splitProps } from "solid-js";
1
+ import { createEffect, createMemo, createSignal, For, type JSX, Show, splitProps } from "solid-js";
2
2
  import { IconExternalLink } from "@tabler/icons-solidjs";
3
+ import clsx from "clsx";
4
+ import { twMerge } from "tailwind-merge";
3
5
  import { type SharedDataAccessor } from "../../../providers/shared-data/SharedDataContext";
4
- import { SelectList } from "../../form-control/select-list/SelectList";
6
+ import { List } from "../../data/list/List";
7
+ import { Pagination } from "../../data/Pagination";
8
+ import { Button } from "../../form-control/Button";
5
9
  import { Icon } from "../../display/Icon";
10
+ import { TextInput } from "../../form-control/field/TextInput";
6
11
  import { useDialog } from "../../disclosure/DialogContext";
12
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
13
+ import { textMuted } from "../../../styles/tokens.styles";
14
+ import { createSlotSignal } from "../../../hooks/createSlotSignal";
15
+ import {
16
+ SharedDataSelectListContext,
17
+ type SharedDataSelectListContextValue,
18
+ SharedDataSelectListItemTemplate,
19
+ SharedDataSelectListFilter,
20
+ } from "./SharedDataSelectListContext";
7
21
 
8
22
  /** SharedDataSelectList Props */
9
23
  export interface SharedDataSelectListProps<TItem> {
10
- /** 공유 데이터 접근자 */
24
+ /** Shared data accessor */
11
25
  data: SharedDataAccessor<TItem>;
12
26
 
13
- /** 현재 선택된 */
27
+ /** Currently selected value */
14
28
  value?: TItem;
15
- /** 변경 콜백 */
29
+ /** Value change callback */
16
30
  onValueChange?: (value: TItem | undefined) => void;
17
- /** 필수 입력 */
31
+ /** Required input */
18
32
  required?: boolean;
19
- /** 비활성화 */
33
+ /** Disabled */
20
34
  disabled?: boolean;
21
35
 
22
- /** 항목 필터 함수 */
36
+ /** Item filter function */
23
37
  filterFn?: (item: TItem, index: number) => boolean;
24
- /** 변경 가드 (false 반환 변경 차단) */
38
+ /** Value change guard (blocks change if returns false) */
25
39
  canChange?: (item: TItem | undefined) => boolean | Promise<boolean>;
26
- /** 페이지 크기 (있으면 Pagination 자동 표시) */
40
+ /** Page size (shows Pagination if provided) */
27
41
  pageSize?: number;
28
- /** 헤더 텍스트 */
42
+ /** Header text */
29
43
  header?: string;
30
- /** 관리 모달 컴포넌트 팩토리 */
44
+ /** Management modal component factory */
31
45
  modal?: () => JSX.Element;
32
46
 
33
- /** 서브 컴포넌트용 children (ItemTemplate ) */
34
- children: JSX.Element;
47
+ /** Compound sub-components (ItemTemplate, Filter) */
48
+ children?: JSX.Element;
49
+
50
+ /** Custom class */
51
+ class?: string;
52
+ /** Custom style */
53
+ style?: JSX.CSSProperties;
54
+ }
55
+
56
+ // ─── Styles ──────────────────────────────────────────────
57
+
58
+ const containerClass = clsx("flex-col gap-1");
59
+
60
+ const headerClass = clsx("flex items-center gap-1 px-2 py-1 text-sm font-semibold");
61
+
62
+ // ─── Component ───────────────────────────────────────────
63
+
64
+ export interface SharedDataSelectListComponent {
65
+ <TItem>(props: SharedDataSelectListProps<TItem>): JSX.Element;
66
+ ItemTemplate: typeof SharedDataSelectListItemTemplate;
67
+ Filter: typeof SharedDataSelectListFilter;
35
68
  }
36
69
 
37
- export function SharedDataSelectList<TItem>(props: SharedDataSelectListProps<TItem>): JSX.Element {
38
- const [local, rest] = splitProps(props, ["data", "filterFn", "modal", "header", "children"]);
70
+ export const SharedDataSelectList: SharedDataSelectListComponent = (<TItem,>(
71
+ props: SharedDataSelectListProps<TItem>,
72
+ ): JSX.Element => {
73
+ const [local, rest] = splitProps(props, [
74
+ "data",
75
+ "children",
76
+ "class",
77
+ "style",
78
+ "value",
79
+ "onValueChange",
80
+ "required",
81
+ "disabled",
82
+ "filterFn",
83
+ "canChange",
84
+ "pageSize",
85
+ "header",
86
+ "modal",
87
+ ]);
39
88
 
40
89
  const dialog = useDialog();
90
+ const i18n = useI18nOptional();
91
+
92
+ // ─── Slot signals ──────────────────────────────────────
93
+
94
+ const [filter, setFilter] = createSlotSignal();
95
+ const [itemTemplate, _setItemTemplate] = createSignal<
96
+ ((item: TItem, index: number) => JSX.Element) | undefined
97
+ >();
98
+ const setItemTemplate = (fn: ((...args: unknown[]) => JSX.Element) | undefined) =>
99
+ _setItemTemplate(() => fn as ((item: TItem, index: number) => JSX.Element) | undefined);
100
+
101
+ const contextValue: SharedDataSelectListContextValue = {
102
+ setItemTemplate,
103
+ setFilter,
104
+ };
105
+
106
+ // ─── Search state ──────────────────────────────────────
107
+
108
+ const [searchText, setSearchText] = createSignal("");
109
+
110
+ // Reset search text when filter slot changes
111
+ createEffect(() => {
112
+ if (filter()) {
113
+ setSearchText("");
114
+ }
115
+ });
116
+
117
+ // ─── Pagination state ─────────────────────────────────
118
+
119
+ const [page, setPage] = createSignal(1);
120
+
121
+ // ─── Filtering pipeline ─────────────────────────────────
122
+
123
+ const filteredItems = createMemo(() => {
124
+ let result = local.data.items();
125
+
126
+ // getIsHidden filter
127
+ const isHidden = local.data.getIsHidden;
128
+ if (isHidden) {
129
+ result = result.filter((item) => !isHidden(item));
130
+ }
131
+
132
+ // Search filter (only when Filter compound is absent and getSearchText exists)
133
+ const getSearchText = local.data.getSearchText;
134
+ if (!filter() && getSearchText && searchText()) {
135
+ const terms = searchText().trim().split(" ").filter(Boolean);
136
+ if (terms.length > 0) {
137
+ result = result.filter((item) => {
138
+ const text = getSearchText(item).toLowerCase();
139
+ return terms.every((t) => text.includes(t.toLowerCase()));
140
+ });
141
+ }
142
+ }
143
+
144
+ // filterFn
145
+ if (local.filterFn) {
146
+ const fn = local.filterFn;
147
+ result = result.filter((item, index) => fn(item, index));
148
+ }
149
+
150
+ return result;
151
+ });
152
+
153
+ // ─── Page calculation ───────────────────────────────────────
41
154
 
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);
155
+ const totalPageCount = createMemo(() => {
156
+ if (local.pageSize == null) return 1;
157
+ return Math.max(1, Math.ceil(filteredItems().length / local.pageSize));
47
158
  });
48
159
 
49
- // modal 열기
160
+ // Reset page when filter changes
161
+ createEffect(() => {
162
+ void filteredItems();
163
+ setPage(1);
164
+ });
165
+
166
+ // Page slice
167
+ const displayItems = createMemo(() => {
168
+ const items = filteredItems();
169
+ if (local.pageSize == null) return items;
170
+
171
+ const start = (page() - 1) * local.pageSize;
172
+ const end = start + local.pageSize;
173
+ return items.slice(start, end);
174
+ });
175
+
176
+ // ─── Select/toggle handler ─────────────────────────────
177
+
178
+ const handleSelect = async (item: TItem | undefined) => {
179
+ if (local.disabled) return;
180
+
181
+ // canChange guard
182
+ if (local.canChange) {
183
+ const allowed = await local.canChange(item);
184
+ if (!allowed) return;
185
+ }
186
+
187
+ // Toggle: click already selected value to deselect (only if not required)
188
+ if (item !== undefined && item === local.value && !local.required) {
189
+ local.onValueChange?.(undefined);
190
+ } else {
191
+ local.onValueChange?.(item);
192
+ }
193
+ };
194
+
195
+ // ─── Open modal ────────────────────────────────────────
196
+
50
197
  const handleOpenModal = async () => {
51
198
  if (!local.modal) return;
52
199
  await dialog.show(local.modal, {});
53
200
  };
54
201
 
202
+ // ─── Render ────────────────────────────────────────────
203
+
55
204
  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>
205
+ <SharedDataSelectListContext.Provider value={contextValue}>
206
+ {/* Render children inside Provider so sub-components (ItemTemplate, Filter) can access context */}
207
+ {local.children}
208
+ <div
209
+ {...rest}
210
+ data-shared-data-select-list
211
+ class={twMerge(containerClass, local.class)}
212
+ style={local.style}
213
+ >
214
+ {/* Header */}
215
+ <Show when={local.header != null || local.modal != null}>
216
+ <div class={headerClass}>
217
+ <Show when={local.header != null}>{local.header}</Show>
69
218
  <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>
219
+ <Button size="sm" onClick={() => void handleOpenModal()}>
220
+ <Icon icon={IconExternalLink} />
221
+ </Button>
78
222
  </Show>
79
223
  </div>
80
- </SelectList.Header>
81
- </Show>
82
- {local.children}
83
- </SelectList>
224
+ </Show>
225
+
226
+ {/* Search input: when Filter compound is absent and getSearchText exists */}
227
+ <Show when={!filter() && local.data.getSearchText}>
228
+ <TextInput
229
+ value={searchText()}
230
+ onValueChange={setSearchText}
231
+ placeholder={i18n?.t("sharedDataSelectList.searchPlaceholder") ?? "Search..."}
232
+ size="sm"
233
+ inset
234
+ />
235
+ </Show>
236
+
237
+ {/* Custom Filter */}
238
+ <Show when={filter()}>{filter()!()}</Show>
239
+
240
+ {/* Pagination */}
241
+ <Show when={local.pageSize != null && totalPageCount() > 1}>
242
+ <Pagination
243
+ page={page()}
244
+ onPageChange={setPage}
245
+ totalPageCount={totalPageCount()}
246
+ size="sm"
247
+ />
248
+ </Show>
249
+
250
+ {/* List */}
251
+ <List inset>
252
+ {/* Unspecified item (when not required) */}
253
+ <Show when={!local.required}>
254
+ <List.Item
255
+ selected={local.value === undefined}
256
+ disabled={local.disabled}
257
+ onClick={() => handleSelect(undefined)}
258
+ >
259
+ <span class={textMuted}>Unspecified</span>
260
+ </List.Item>
261
+ </Show>
262
+
263
+ {/* Item list */}
264
+ <For each={displayItems()}>
265
+ {(item, index) => (
266
+ <List.Item
267
+ selected={item === local.value}
268
+ disabled={local.disabled}
269
+ onClick={() => handleSelect(item)}
270
+ >
271
+ {itemTemplate()?.(item, index())}
272
+ </List.Item>
273
+ )}
274
+ </For>
275
+ </List>
276
+ </div>
277
+ </SharedDataSelectListContext.Provider>
84
278
  );
85
- }
279
+ }) as SharedDataSelectListComponent;
280
+
281
+ SharedDataSelectList.ItemTemplate = SharedDataSelectListItemTemplate;
282
+ SharedDataSelectList.Filter = SharedDataSelectListFilter;