@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
package/docs/styling.md DELETED
@@ -1,184 +0,0 @@
1
- # Styling & Tailwind Theme
2
-
3
- `@simplysm/solid` provides the following custom themes via Tailwind CSS preset.
4
-
5
- ## Semantic Colors
6
-
7
- | Name | Base Color | Usage |
8
- |------|------------|-------|
9
- | `primary` | blue | Primary actions |
10
- | `info` | sky | Information |
11
- | `success` | green | Success |
12
- | `warning` | amber | Warning |
13
- | `danger` | red | Danger/error |
14
- | `base` | zinc | Neutral (backgrounds, borders, secondary text, etc.) |
15
-
16
- > Use `base-*` instead of directly using `zinc-*`.
17
-
18
- ## Custom Sizes
19
-
20
- | Class | Description |
21
- |-------|-------------|
22
- | `h-field` / `size-field` | Default field height (based on `py-1`) |
23
- | `h-field-xs` / `size-field-xs` | Extra-small field height (based on `py-0`) |
24
- | `h-field-sm` / `size-field-sm` | Small field height (based on `py-0.5`) |
25
- | `h-field-lg` / `size-field-lg` | Large field height (based on `py-2`) |
26
- | `h-field-xl` / `size-field-xl` | Extra-large field height (based on `py-3`) |
27
- | `h-field-inset` / `size-field-inset` | Inset field height (excludes border) |
28
- | `h-field-inset-xs` / `size-field-inset-xs` | Extra-small inset field height |
29
- | `h-field-inset-sm` / `size-field-inset-sm` | Small inset field height |
30
- | `h-field-inset-lg` / `size-field-inset-lg` | Large inset field height |
31
- | `h-field-inset-xl` / `size-field-inset-xl` | Extra-large inset field height |
32
-
33
- ## z-index Layers
34
-
35
- | Class | Value | Description |
36
- |-------|-------|-------------|
37
- | `z-sidebar` | 100 | Sidebar |
38
- | `z-sidebar-backdrop` | 99 | Sidebar backdrop |
39
- | `z-busy` | 500 | Loading overlay |
40
- | `z-dropdown` | 1000 | Dropdown popup |
41
- | `z-modal-backdrop` | 1999 | Modal backdrop |
42
- | `z-modal` | 2000 | Modal dialog |
43
- | `z-notification` | 3000 | Notification banner |
44
-
45
- ## Dark Mode
46
-
47
- Uses Tailwind's `class` strategy. `ThemeProvider` automatically toggles the `dark` class on the `<html>` element.
48
-
49
- ```html
50
- <!-- Light mode -->
51
- <html>
52
- <!-- Dark mode -->
53
- <html class="dark">
54
- ```
55
-
56
- ## Styling Patterns
57
-
58
- When using Tailwind classes in components, group them by semantic units with `clsx` and resolve conflicts with `twMerge`:
59
-
60
- ```typescript
61
- import clsx from "clsx";
62
- import { twMerge } from "tailwind-merge";
63
-
64
- const baseClass = clsx(
65
- "inline-flex items-center",
66
- "px-2 py-1",
67
- "rounded",
68
- "border border-transparent",
69
- );
70
-
71
- const className = twMerge(baseClass, props.class);
72
- ```
73
-
74
- ## Exported Style Tokens
75
-
76
- `@simplysm/solid` exports TypeScript style constants and type definitions for use when building custom components that integrate with the library's design system.
77
-
78
- ### tokens.styles
79
-
80
- ```typescript
81
- import {
82
- type ComponentSize, // "xs" | "sm" | "lg" | "xl"
83
- type ComponentSizeCompact, // "sm" | "lg" (used by ColorPicker, Progress)
84
- type SemanticTheme, // "primary" | "info" | "success" | "warning" | "danger" | "base"
85
- borderDefault, // Tailwind classes for default border color
86
- borderSubtle, // Tailwind classes for subtle border color
87
- bgSurface, // Tailwind classes for surface background
88
- textDefault, // Tailwind classes for default text color
89
- textMuted, // Tailwind classes for muted text color
90
- textPlaceholder, // Tailwind classes for placeholder text color
91
- disabledOpacity, // Tailwind classes for disabled state opacity
92
- paddingXs, // Tailwind classes for extra-small padding (px-1 py-0)
93
- paddingSm, // Tailwind classes for small padding (px-1.5 py-0.5)
94
- paddingLg, // Tailwind classes for large padding (px-3 py-2)
95
- paddingXl, // Tailwind classes for extra-large padding (px-4 py-3)
96
- themeTokens, // Record<SemanticTheme, { solid, solidHover, light, text, hoverBg, border }>
97
- } from "@simplysm/solid";
98
- ```
99
-
100
- ### patterns.styles
101
-
102
- ```typescript
103
- import {
104
- iconButtonBase, // Base classes for icon-only buttons
105
- insetFocusOutline, // Focus outline (focus-within) for inset fields
106
- insetFocusOutlineSelf, // Focus outline (focus) for inset trigger elements
107
- insetBase, // Base layout classes for inset mode
108
- fieldSurface, // Field surface (background, border, focus ring)
109
- inputBase, // Base classes for <input> elements
110
- } from "@simplysm/solid";
111
- ```
112
-
113
- ### Field.styles
114
-
115
- ```typescript
116
- import {
117
- type FieldSize, // "xs" | "sm" | "lg" | "xl"
118
- fieldBaseClass, // Base wrapper classes (inline-flex, field surface, h-field)
119
- fieldSizeClasses, // Size variant classes per FieldSize
120
- fieldInsetClass, // Inset mode wrapper classes
121
- fieldInsetHeightClass, // Inset height class (h-field-inset, excludes border)
122
- fieldInsetSizeHeightClasses, // Inset height classes per size
123
- fieldDisabledClass, // Disabled state classes
124
- textAreaBaseClass, // Base textarea wrapper classes
125
- textAreaSizeClasses, // Textarea size classes per FieldSize
126
- fieldInputClass, // Base classes for field <input> element
127
- fieldGapClasses, // Gap classes per size (with prefix icon)
128
- getFieldWrapperClass, // Utility to build field wrapper class string
129
- getTextareaWrapperClass, // Utility to build textarea wrapper class string
130
- } from "@simplysm/solid";
131
- ```
132
-
133
- **`getFieldWrapperClass` options:**
134
-
135
- | Option | Type | Description |
136
- |--------|------|-------------|
137
- | `size` | `FieldSize` | Size variant |
138
- | `disabled` | `boolean` | Apply disabled styles |
139
- | `inset` | `boolean` | Apply inset styles |
140
- | `includeCustomClass` | `string \| false` | Additional CSS class (or `false` to skip) |
141
- | `extra` | `string \| false` | Extra classes inserted before size/disabled/inset |
142
-
143
- ### Checkbox.styles
144
-
145
- ```typescript
146
- import {
147
- type CheckboxSize, // "xs" | "sm" | "lg" | "xl"
148
- checkboxBaseClass, // Base wrapper classes
149
- indicatorBaseClass, // Base indicator (box) classes
150
- checkedClass, // Checked state classes (primary color)
151
- checkboxSizeClasses, // Size variant classes
152
- checkboxInsetClass, // Inset mode classes
153
- checkboxInsetSizeHeightClasses, // Inset height classes per size (excludes border)
154
- checkboxInlineClass, // Inline display classes
155
- checkboxDisabledClass, // Disabled state classes
156
- } from "@simplysm/solid";
157
- ```
158
-
159
- ### DataSheet.styles
160
-
161
- ```typescript
162
- import {
163
- dataSheetContainerClass, tableClass, thClass, thContentClass, tdClass,
164
- summaryThClass, insetContainerClass, insetTableClass, defaultContainerClass,
165
- sortableThClass, sortIconClass, toolbarClass, fixedClass, fixedLastClass,
166
- resizerClass, resizeIndicatorClass, featureThClass, featureTdClass,
167
- expandIndentGuideClass, expandIndentGuideLineClass, expandToggleClass,
168
- selectSingleClass, selectSingleSelectedClass, selectSingleUnselectedClass,
169
- reorderHandleClass, reorderIndicatorClass, configButtonClass,
170
- featureCellWrapperClass, featureCellBodyWrapperClass,
171
- featureCellClickableClass, featureCellBodyClickableClass,
172
- reorderCellWrapperClass,
173
- } from "@simplysm/solid";
174
- ```
175
-
176
- ### ListItem.styles
177
-
178
- ```typescript
179
- import {
180
- listItemBaseClass, listItemSizeClasses, listItemSelectedClass,
181
- listItemDisabledClass, listItemReadonlyClass, listItemIndentGuideClass,
182
- listItemContentClass, getListItemSelectedIconClass,
183
- } from "@simplysm/solid";
184
- ```
@@ -1,385 +0,0 @@
1
- import {
2
- children,
3
- createEffect,
4
- createMemo,
5
- createSignal,
6
- For,
7
- type JSX,
8
- onCleanup,
9
- type ParentComponent,
10
- Show,
11
- splitProps,
12
- } from "solid-js";
13
- import clsx from "clsx";
14
- import { twMerge } from "tailwind-merge";
15
- import { List } from "../../data/list/List";
16
- import { Pagination } from "../../data/Pagination";
17
- import { TextInput } from "../field/TextInput";
18
- import { createSlotSignal } from "../../../hooks/createSlotSignal";
19
- import { SelectListContext, type SelectListContextValue } from "./SelectListContext";
20
- import { useSelectListContext } from "./SelectListContext";
21
- import {
22
- listItemBaseClass,
23
- listItemSelectedClass,
24
- listItemContentClass,
25
- listItemDisabledClass,
26
- } from "../../data/list/ListItem.styles";
27
- import { ripple } from "../../../directives/ripple";
28
- import { textMuted } from "../../../styles/tokens.styles";
29
-
30
- void ripple;
31
-
32
- // ─── 서브 컴포넌트 ──────────────────────────────────────
33
-
34
- /**
35
- * Header 슬롯 서브 컴포넌트
36
- */
37
- const SelectListHeader: ParentComponent = (props) => {
38
- const ctx = useSelectListContext();
39
- // eslint-disable-next-line solid/reactivity -- 슬롯 accessor로 저장, JSX tracked scope에서 호출됨
40
- ctx.setHeader(() => props.children);
41
- onCleanup(() => ctx.setHeader(undefined));
42
- return null;
43
- };
44
-
45
- /**
46
- * Filter 슬롯 서브 컴포넌트
47
- */
48
- const SelectListFilter: ParentComponent = (props) => {
49
- const ctx = useSelectListContext();
50
- // eslint-disable-next-line solid/reactivity -- 슬롯 accessor로 저장, JSX tracked scope에서 호출됨
51
- ctx.setFilter(() => props.children);
52
- onCleanup(() => ctx.setFilter(undefined));
53
- return null;
54
- };
55
-
56
- /**
57
- * ItemTemplate 서브 컴포넌트
58
- */
59
- const SelectListItemTemplate = <TArgs extends unknown[]>(props: {
60
- children: (...args: TArgs) => JSX.Element;
61
- }) => {
62
- const ctx = useSelectListContext();
63
- // eslint-disable-next-line solid/reactivity -- 렌더 함수를 signal에 저장, JSX tracked scope에서 호출됨
64
- ctx.setItemTemplate(props.children as (...args: unknown[]) => JSX.Element);
65
- onCleanup(() => ctx.setItemTemplate(undefined));
66
- return null;
67
- };
68
-
69
- // ─── Props ──────────────────────────────────────────────
70
-
71
- export interface SelectListProps<TValue> {
72
- /** 목록 아이템 배열 */
73
- items: TValue[];
74
-
75
- /** 현재 선택된 값 */
76
- value?: TValue;
77
-
78
- /** 값 변경 콜백 */
79
- onValueChange?: (value: TValue | undefined) => void;
80
-
81
- /** 필수 선택 여부 (true이면 미지정 항목 숨김) */
82
- required?: boolean;
83
-
84
- /** 비활성화 */
85
- disabled?: boolean;
86
-
87
- /** 검색 텍스트 추출 함수 (있으면 검색 TextInput 자동 표시) */
88
- getSearchText?: (item: TValue) => string;
89
-
90
- /** 숨김 여부 필터 */
91
- getIsHidden?: (item: TValue) => boolean;
92
-
93
- /** 커스텀 필터 함수 */
94
- filterFn?: (item: TValue, index: number) => boolean;
95
-
96
- /** 값 변경 가드 (false 반환 시 변경 차단) */
97
- canChange?: (item: TValue | undefined) => boolean | Promise<boolean>;
98
-
99
- /** 페이지 크기 (있으면 Pagination 자동 표시) */
100
- pageSize?: number;
101
-
102
- /** 헤더 텍스트 (Header 슬롯보다 우선순위 낮음) */
103
- header?: string;
104
-
105
- /** 커스텀 class */
106
- class?: string;
107
-
108
- /** 커스텀 style */
109
- style?: JSX.CSSProperties;
110
-
111
- /** 서브 컴포넌트용 children */
112
- children?: JSX.Element;
113
- }
114
-
115
- // ─── 스타일 ──────────────────────────────────────────────
116
-
117
- const containerClass = clsx("inline-flex flex-col gap-1");
118
-
119
- const headerClass = clsx("px-2 py-1 text-sm font-semibold");
120
-
121
- // ─── 컴포넌트 ───────────────────────────────────────────
122
-
123
- interface SelectListComponent {
124
- <TValue = unknown>(props: SelectListProps<TValue>): JSX.Element;
125
- Header: typeof SelectListHeader;
126
- Filter: typeof SelectListFilter;
127
- ItemTemplate: typeof SelectListItemTemplate;
128
- }
129
-
130
- export const SelectList: SelectListComponent = <TValue,>(props: SelectListProps<TValue>) => {
131
- const [local, rest] = splitProps(props as SelectListProps<TValue> & { children?: JSX.Element }, [
132
- "children",
133
- "class",
134
- "style",
135
- "items",
136
- "value",
137
- "onValueChange",
138
- "required",
139
- "disabled",
140
- "getSearchText",
141
- "getIsHidden",
142
- "filterFn",
143
- "canChange",
144
- "pageSize",
145
- "header",
146
- ]);
147
-
148
- // ─── 내부 상태 ─────────────────────────────────────────
149
-
150
- const [searchText, setSearchText] = createSignal("");
151
- const [page, setPage] = createSignal(1);
152
-
153
- // ─── 슬롯 signals ────────────────────────────────────
154
-
155
- const [headerSlot, setHeader] = createSlotSignal();
156
- const [filterSlot, setFilter] = createSlotSignal();
157
- const [itemTemplate, _setItemTemplate] = createSignal<
158
- ((...args: unknown[]) => JSX.Element) | undefined
159
- >();
160
- const setItemTemplate = (fn: ((...args: unknown[]) => JSX.Element) | undefined) =>
161
- _setItemTemplate(() => fn);
162
-
163
- // Context 값
164
- const contextValue: SelectListContextValue = {
165
- setHeader,
166
- setFilter,
167
- setItemTemplate,
168
- };
169
-
170
- // ─── items 변경 시 value 자동 재매칭 ──────────────────
171
-
172
- createEffect(() => {
173
- const currentItems = local.items;
174
- const currentValue = local.value;
175
- if (currentValue === undefined) return;
176
-
177
- // 새 items에서 현재 value를 참조로 찾기
178
- const found = currentItems.find((item) => item === currentValue);
179
- if (found !== undefined) {
180
- // 이미 같은 참조면 아무 것도 하지 않음
181
- return;
182
- }
183
-
184
- // 참조가 없으면 현재 value를 유지 (호출하지 않음)
185
- });
186
-
187
- // ─── 필터링 파이프라인 ─────────────────────────────────
188
-
189
- // getIsHidden 필터 → 검색 필터 → filterFn
190
- const filteredItems = createMemo(() => {
191
- let result = local.items;
192
-
193
- // getIsHidden 필터
194
- if (local.getIsHidden) {
195
- const fn = local.getIsHidden;
196
- result = result.filter((item) => !fn(item));
197
- }
198
-
199
- // 검색 필터
200
- const search = searchText().trim().toLowerCase();
201
- if (search && local.getSearchText) {
202
- const getText = local.getSearchText;
203
- result = result.filter((item) => getText(item).toLowerCase().includes(search));
204
- }
205
-
206
- // filterFn
207
- if (local.filterFn) {
208
- const fn = local.filterFn;
209
- result = result.filter((item, index) => fn(item, index));
210
- }
211
-
212
- return result;
213
- });
214
-
215
- // 페이지 수 계산
216
- const totalPageCount = createMemo(() => {
217
- if (local.pageSize == null) return 1;
218
- return Math.max(1, Math.ceil(filteredItems().length / local.pageSize));
219
- });
220
-
221
- // 검색이나 필터 변경 시 페이지 리셋
222
- createEffect(() => {
223
- // filteredItems에 의존
224
- void filteredItems();
225
- setPage(1);
226
- });
227
-
228
- // 페이지 슬라이스
229
- const displayItems = createMemo(() => {
230
- const items = filteredItems();
231
- if (local.pageSize == null) return items;
232
-
233
- const start = (page() - 1) * local.pageSize;
234
- const end = start + local.pageSize;
235
- return items.slice(start, end);
236
- });
237
-
238
- // ─── 선택/토글 핸들러 ─────────────────────────────────
239
-
240
- const handleSelect = async (item: TValue | undefined) => {
241
- if (local.disabled) return;
242
-
243
- // canChange 가드
244
- if (local.canChange) {
245
- const allowed = await local.canChange(item);
246
- if (!allowed) return;
247
- }
248
-
249
- // 토글: 이미 선택된 값을 다시 클릭하면 선택 해제 (required가 아닐 때만)
250
- if (item !== undefined && item === local.value && !local.required) {
251
- local.onValueChange?.(undefined);
252
- } else {
253
- local.onValueChange?.(item);
254
- }
255
- };
256
-
257
- // ─── 아이템 렌더링 ────────────────────────────────────
258
-
259
- const getItemTemplate = (): ((item: TValue, index: number) => JSX.Element) | undefined => {
260
- return itemTemplate() as ((item: TValue, index: number) => JSX.Element) | undefined;
261
- };
262
-
263
- const renderItem = (item: TValue, index: number): JSX.Element => {
264
- const tpl = getItemTemplate();
265
- if (tpl) {
266
- return tpl(item, index);
267
- }
268
- return <>{String(item)}</>;
269
- };
270
-
271
- // ─── 내부 렌더링 ──────────────────────────────────────
272
-
273
- const SelectListInner: ParentComponent = (innerProps) => {
274
- // children() resolve로 서브 컴포넌트 등록 트리거
275
- const resolved = children(() => innerProps.children);
276
- // resolved는 사용하지 않지만 서브 컴포넌트가 등록되도록 evaluate 필요
277
- void resolved;
278
-
279
- return (
280
- <div
281
- {...rest}
282
- data-select-list
283
- class={twMerge(containerClass, local.class)}
284
- style={local.style}
285
- >
286
- {/* Header: 슬롯 우선, 없으면 props.header 텍스트 */}
287
- <Show
288
- when={headerSlot()}
289
- fallback={
290
- <Show when={local.header}>
291
- <div class={headerClass}>{local.header}</div>
292
- </Show>
293
- }
294
- >
295
- {headerSlot()!()}
296
- </Show>
297
-
298
- {/* Filter: 슬롯 우선, 없으면 getSearchText 있을 때 TextInput */}
299
- <Show
300
- when={filterSlot()}
301
- fallback={
302
- <Show when={local.getSearchText}>
303
- <TextInput
304
- value={searchText()}
305
- onValueChange={setSearchText}
306
- placeholder="검색..."
307
- inset
308
- disabled={local.disabled}
309
- />
310
- </Show>
311
- }
312
- >
313
- {filterSlot()!()}
314
- </Show>
315
-
316
- {/* Pagination */}
317
- <Show when={local.pageSize != null && totalPageCount() > 1}>
318
- <Pagination
319
- page={page()}
320
- onPageChange={setPage}
321
- totalPageCount={totalPageCount()}
322
- size="sm"
323
- />
324
- </Show>
325
-
326
- {/* List */}
327
- <List inset>
328
- {/* 미지정 항목 (required가 아닐 때) */}
329
- <Show when={!local.required}>
330
- <button
331
- type="button"
332
- use:ripple={!local.disabled}
333
- class={twMerge(
334
- listItemBaseClass,
335
- local.value === undefined && listItemSelectedClass,
336
- local.disabled && listItemDisabledClass,
337
- )}
338
- data-list-item
339
- role="treeitem"
340
- aria-selected={local.value === undefined || undefined}
341
- aria-disabled={local.disabled || undefined}
342
- tabIndex={local.disabled ? -1 : 0}
343
- onClick={() => handleSelect(undefined)}
344
- >
345
- <span class={clsx(listItemContentClass, textMuted)}>미지정</span>
346
- </button>
347
- </Show>
348
-
349
- {/* 아이템 목록 */}
350
- <For each={displayItems()}>
351
- {(item, index) => (
352
- <button
353
- type="button"
354
- use:ripple={!local.disabled}
355
- class={twMerge(
356
- listItemBaseClass,
357
- item === local.value && listItemSelectedClass,
358
- local.disabled && listItemDisabledClass,
359
- )}
360
- data-list-item
361
- role="treeitem"
362
- aria-selected={item === local.value || undefined}
363
- aria-disabled={local.disabled || undefined}
364
- tabIndex={local.disabled ? -1 : 0}
365
- onClick={() => handleSelect(item)}
366
- >
367
- <span class={listItemContentClass}>{renderItem(item, index())}</span>
368
- </button>
369
- )}
370
- </For>
371
- </List>
372
- </div>
373
- );
374
- };
375
-
376
- return (
377
- <SelectListContext.Provider value={contextValue}>
378
- <SelectListInner>{local.children}</SelectListInner>
379
- </SelectListContext.Provider>
380
- );
381
- };
382
-
383
- SelectList.Header = SelectListHeader;
384
- SelectList.Filter = SelectListFilter;
385
- SelectList.ItemTemplate = SelectListItemTemplate;
@@ -1,23 +0,0 @@
1
- import { createContext, useContext, type JSX } from "solid-js";
2
- import type { SlotAccessor } from "../../../hooks/createSlotSignal";
3
-
4
- export interface SelectListContextValue {
5
- /** Header 슬롯 등록 */
6
- setHeader: (content: SlotAccessor) => void;
7
-
8
- /** Filter 슬롯 등록 */
9
- setFilter: (content: SlotAccessor) => void;
10
-
11
- /** ItemTemplate 등록 */
12
- setItemTemplate: (fn: ((...args: unknown[]) => JSX.Element) | undefined) => void;
13
- }
14
-
15
- export const SelectListContext = createContext<SelectListContextValue>();
16
-
17
- export function useSelectListContext(): SelectListContextValue {
18
- const context = useContext(SelectListContext);
19
- if (!context) {
20
- throw new Error("useSelectListContext는 SelectList 컴포넌트 내부에서만 사용할 수 있습니다");
21
- }
22
- return context;
23
- }