@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/helpers.md DELETED
@@ -1,54 +0,0 @@
1
- # Helpers & Directives
2
-
3
- ## mergeStyles
4
-
5
- Utility for merging inline style strings and `JSX.CSSProperties` objects.
6
-
7
- ```typescript
8
- import { mergeStyles } from "@simplysm/solid";
9
-
10
- const style = mergeStyles("color: red", { fontSize: "14px" }, props.style);
11
- ```
12
-
13
- ---
14
-
15
- ## ripple directive
16
-
17
- Material Design ripple effect directive. Displays ripple effect on click.
18
-
19
- ```tsx
20
- import { ripple } from "@simplysm/solid";
21
- // Keep reference to register directive
22
- void ripple;
23
-
24
- <button use:ripple={true}>Click</button>
25
- <button use:ripple={!props.disabled}>Conditional activation</button>
26
- ```
27
-
28
- - Creates internal ripple container, operates without affecting parent element
29
- - Automatically disabled when `prefers-reduced-motion: reduce` is set
30
- - Single ripple mode: removes previous ripple on new click
31
-
32
- ---
33
-
34
- ## createAppStructure
35
-
36
- See [createAppStructure](hooks.md#createappstructure) in the Hooks documentation for full API details.
37
-
38
- Exports the following types:
39
-
40
- ```typescript
41
- import {
42
- createAppStructure,
43
- type AppStructure,
44
- type AppStructureItem,
45
- type AppStructureGroupItem,
46
- type AppStructureLeafItem,
47
- type AppStructureSubPerm,
48
- type AppRoute,
49
- type AppMenu,
50
- type AppFlatMenu,
51
- type AppPerm,
52
- type AppFlatPerm,
53
- } from "@simplysm/solid";
54
- ```
package/docs/hooks.md DELETED
@@ -1,588 +0,0 @@
1
- # Hooks
2
-
3
- ## useTheme
4
-
5
- Hook to access theme (dark/light/system) state. Must be used inside `ThemeProvider`.
6
-
7
- ```tsx
8
- import { useTheme } from "@simplysm/solid";
9
-
10
- const theme = useTheme();
11
- theme.mode(); // "light" | "dark" | "system"
12
- theme.resolvedTheme(); // "light" | "dark" (follows OS setting when system)
13
- theme.setMode("dark");
14
- theme.cycleMode(); // light -> system -> dark -> light
15
- ```
16
-
17
- | Property/Method | Type | Description |
18
- |-----------------|------|-------------|
19
- | `mode` | `() => ThemeMode` | Current theme mode |
20
- | `resolvedTheme` | `() => ResolvedTheme` | Actual applied theme |
21
- | `setMode` | `(mode: ThemeMode) => void` | Set theme mode |
22
- | `cycleMode` | `() => void` | Cycle to next mode |
23
-
24
- ---
25
-
26
- ## useLocalStorage
27
-
28
- Local-only persistent storage hook. Always uses `localStorage` regardless of `syncStorage` setting. Keys are automatically prefixed as `{clientName}.{key}`. Use for data that should never leave the device (auth tokens, device-specific state).
29
-
30
- ```tsx
31
- import { useLocalStorage } from "@simplysm/solid";
32
-
33
- const [token, setToken] = useLocalStorage<string>("auth-token");
34
-
35
- // Set value
36
- setToken("abc123");
37
-
38
- // Remove value
39
- setToken(undefined);
40
-
41
- // Functional update
42
- setToken((prev) => prev + "-refreshed");
43
- ```
44
-
45
- | Return value | Type | Description |
46
- |--------------|------|-------------|
47
- | `[0]` | `Accessor<T \| undefined>` | Value getter |
48
- | `[1]` | `StorageSetter<T>` | Value setter (accepts value, `undefined` to remove, or updater function) |
49
-
50
- ---
51
-
52
- ## useSyncConfig
53
-
54
- Syncable config hook. Uses `SyncStorageProvider` storage if present, falls back to `localStorage` otherwise. Keys are automatically prefixed as `{clientName}.{key}`. Use for user preferences that should sync across devices (theme, DataSheet column configs, filter presets).
55
-
56
- ```tsx
57
- import { useSyncConfig } from "@simplysm/solid";
58
-
59
- const [theme, setTheme, ready] = useSyncConfig("theme", "light");
60
-
61
- // ready state indicates initialization is complete
62
- // When syncStorage is not configured (localStorage), ready is immediately true
63
- ```
64
-
65
- | Return value | Type | Description |
66
- |--------------|------|-------------|
67
- | `[0]` | `Accessor<T>` | Value getter |
68
- | `[1]` | `Setter<T>` | Value setter |
69
- | `[2]` | `Accessor<boolean>` | Ready state (`true` after initialization) |
70
-
71
- ---
72
-
73
- ## useLogger
74
-
75
- Logging hook. If `LoggerProvider` is present, logs are sent to the adapter only. Otherwise, logs fall back to `consola`.
76
-
77
- ```tsx
78
- import { useLogger, type Logger } from "@simplysm/solid";
79
-
80
- const logger: Logger = useLogger();
81
- logger.log("user action", { userId: 123 });
82
- logger.info("app started");
83
- logger.error("something failed", errorObj);
84
- logger.warn("deprecation notice");
85
- ```
86
-
87
- **Logger interface:**
88
-
89
- | Method | Signature | Description |
90
- |--------|-----------|-------------|
91
- | `log` | `(...args: unknown[]) => void` | Log message (general) |
92
- | `info` | `(...args: unknown[]) => void` | Log message (informational) |
93
- | `warn` | `(...args: unknown[]) => void` | Log message (warning) |
94
- | `error` | `(...args: unknown[]) => void` | Log message (error) |
95
- | `configure` | `(fn: (origin: LogAdapter) => LogAdapter) => void` | Set or wrap the log adapter (inside `LoggerProvider` only) |
96
-
97
- **Configuring a custom adapter (decorator pattern):**
98
-
99
- ```tsx
100
- // Replace default consola adapter
101
- useLogger().configure((origin) => myLogAdapter);
102
-
103
- // Wrap default adapter (chaining)
104
- useLogger().configure((origin) => ({
105
- write(severity, ...data) {
106
- sendToServer(severity, ...data);
107
- origin.write(severity, ...data); // also log to consola
108
- },
109
- }));
110
- ```
111
-
112
- **Global error capturing:** `ErrorLoggerProvider` captures uncaught errors (`window.onerror`) and unhandled promise rejections (`unhandledrejection`) and logs them via `useLogger`.
113
-
114
- ---
115
-
116
- ## useNotification
117
-
118
- Hook to access notification system. Must be used inside `NotificationProvider`. See [Notification](feedback.md#notification) for detailed API.
119
-
120
- ---
121
-
122
- ## useBusy
123
-
124
- Hook to access busy overlay. Must be used inside `BusyProvider`. See [Busy](feedback.md#busy) for detailed API.
125
-
126
- ---
127
-
128
- ## usePrint
129
-
130
- Hook for printing and PDF generation. Must be used inside `<PrintProvider>`. See [Print / usePrint](feedback.md#print--useprint) for detailed API.
131
-
132
- ---
133
-
134
- ## useConfig
135
-
136
- Hook to access app-wide configuration. Must be used inside `ConfigProvider`.
137
-
138
- ```tsx
139
- import { useConfig } from "@simplysm/solid";
140
-
141
- const config = useConfig();
142
- console.log(config.clientName); // "my-app"
143
- ```
144
-
145
- ---
146
-
147
- ## useServiceClient
148
-
149
- Hook to access the WebSocket service client context. Must be used inside `ServiceClientProvider`. See [ServiceClientProvider](providers.md#serviceclientprovider) for detailed API.
150
-
151
- ---
152
-
153
- ## useSharedData
154
-
155
- Hook to access shared data managed by `SharedDataProvider`. Must be used inside `SharedDataProvider`. See [SharedDataProvider](providers.md#shareddataprovider) for detailed API.
156
-
157
- ---
158
-
159
- ## createControllableSignal
160
-
161
- Signal hook that automatically handles Controlled/Uncontrolled patterns. Operates in controlled mode when `onChange` is provided, uncontrolled mode otherwise.
162
-
163
- ```tsx
164
- import { createControllableSignal } from "@simplysm/solid";
165
-
166
- // Use inside components
167
- const [value, setValue] = createControllableSignal({
168
- value: () => props.value ?? "",
169
- onChange: () => props.onValueChange,
170
- });
171
-
172
- // Supports functional setter
173
- setValue((prev) => prev + "!");
174
- ```
175
-
176
- ---
177
-
178
- ## createControllableStore
179
-
180
- Store hook that automatically handles Controlled/Uncontrolled patterns for objects and arrays. Similar to `createControllableSignal` but uses SolidJS `createStore` internally, supporting path-based updates via `SetStoreFunction`.
181
-
182
- Operates in controlled mode when `onChange` is provided (setter calls `onChange` with cloned value), uncontrolled mode otherwise (internal store only).
183
-
184
- ```tsx
185
- import { createControllableStore } from "@simplysm/solid";
186
-
187
- // Controlled mode (parent manages state)
188
- const [items, setItems] = createControllableStore<Item[]>({
189
- value: () => props.items ?? [],
190
- onChange: () => props.onItemsChange,
191
- });
192
-
193
- // Uncontrolled mode (internal state only)
194
- const [items, setItems] = createControllableStore<Item[]>({
195
- value: () => [],
196
- onChange: () => undefined,
197
- });
198
-
199
- // Supports all SetStoreFunction overloads
200
- setItems(0, "name", "updated"); // path-based update
201
- setItems(produce((draft) => { ... })); // produce
202
- setItems(reconcile(newItems)); // reconcile
203
- ```
204
-
205
- | Option | Type | Description |
206
- |--------|------|-------------|
207
- | `value` | `() => TValue` | Reactive value accessor (syncs external changes to internal store) |
208
- | `onChange` | `() => ((value: TValue) => void) \| undefined` | Change callback accessor. When defined, enables controlled mode |
209
-
210
- | Return | Type | Description |
211
- |--------|------|-------------|
212
- | `[0]` | `TValue` | Store (reactive proxy) |
213
- | `[1]` | `SetStoreFunction<TValue>` | Store setter (triggers `onChange` in controlled mode) |
214
-
215
- ---
216
-
217
- ## createMountTransition
218
-
219
- Mount transition hook for open/close CSS animations. Control DOM rendering with `mounted()` and toggle CSS classes with `animating()`.
220
-
221
- ```tsx
222
- import { createMountTransition } from "@simplysm/solid";
223
-
224
- const { mounted, animating, unmount } = createMountTransition(() => open());
225
- ```
226
-
227
- | Return value | Type | Description |
228
- |--------------|------|-------------|
229
- | `mounted` | `() => boolean` | Whether mounted in DOM |
230
- | `animating` | `() => boolean` | Animation active state |
231
- | `unmount` | `() => void` | Manual unmount |
232
-
233
- ---
234
-
235
- ## createIMEHandler
236
-
237
- Hook that delays `setValue` calls during IME (Korean, CJK, etc.) composition to prevent interrupted input. Use inside contenteditable or custom input components.
238
-
239
- ```tsx
240
- import { createIMEHandler } from "@simplysm/solid";
241
-
242
- const {
243
- composingValue,
244
- handleCompositionStart,
245
- handleInput,
246
- handleCompositionEnd,
247
- flushComposition,
248
- } = createIMEHandler((value) => {
249
- // called only when composition is complete
250
- setMyValue(value);
251
- });
252
-
253
- // Wire up to DOM element events:
254
- <div
255
- contentEditable
256
- onCompositionStart={handleCompositionStart}
257
- onCompositionEnd={(e) => handleCompositionEnd(e.currentTarget.textContent ?? "")}
258
- onInput={(e) => handleInput(e.currentTarget.textContent ?? "", e.isComposing)}
259
- />
260
- ```
261
-
262
- | Return value | Type | Description |
263
- |--------------|------|-------------|
264
- | `composingValue` | `Accessor<string \| null>` | Current composing value (for display); `null` when not composing |
265
- | `handleCompositionStart` | `() => void` | Call on `compositionstart` event |
266
- | `handleInput` | `(value: string, isComposing: boolean) => void` | Call on `input` event |
267
- | `handleCompositionEnd` | `(value: string) => void` | Call on `compositionend` event |
268
- | `flushComposition` | `() => void` | Immediately commit any pending composition |
269
-
270
- ---
271
-
272
- ## createSlotSignal
273
-
274
- Signal factory for slot registration pattern. Used internally by compound components (`SelectList`, etc.) to register child slot content.
275
-
276
- ```tsx
277
- import { createSlotSignal, type SlotAccessor } from "@simplysm/solid";
278
-
279
- const [headerSlot, setHeader] = createSlotSignal();
280
-
281
- // Register slot content (typically from a sub-component)
282
- setHeader(() => <div>Header Content</div>);
283
-
284
- // Read slot content (in parent render)
285
- <Show when={headerSlot()}>
286
- {headerSlot()!()}
287
- </Show>
288
-
289
- // Unregister
290
- setHeader(undefined);
291
- ```
292
-
293
- | Return | Type | Description |
294
- |--------|------|-------------|
295
- | `[0]` | `Accessor<SlotAccessor>` | Slot accessor (`(() => JSX.Element) \| undefined`) |
296
- | `[1]` | `(content: SlotAccessor) => void` | Slot setter |
297
-
298
- **`SlotAccessor` type:** `(() => JSX.Element) | undefined`
299
-
300
- ---
301
-
302
- ## useRouterLink
303
-
304
- `@solidjs/router`-based navigation hook. Automatically handles Ctrl/Alt + click (new tab), Shift + click (new window), and regular click (SPA routing).
305
-
306
- ```tsx
307
- import { useRouterLink } from "@simplysm/solid";
308
-
309
- const navigate = useRouterLink();
310
-
311
- <List.Item onClick={navigate({ href: "/home/dashboard" })}>
312
- Dashboard
313
- </List.Item>
314
-
315
- // Pass state (not visible in URL)
316
- <List.Item onClick={navigate({ href: "/users/123", state: { from: "list" } })}>
317
- User
318
- </List.Item>
319
-
320
- // Custom new window size on Shift+click
321
- <List.Item onClick={navigate({ href: "/reports/pdf", window: { width: 1200, height: 900 } })}>
322
- Report
323
- </List.Item>
324
- ```
325
-
326
- **Options:**
327
-
328
- | Option | Type | Default | Description |
329
- |--------|------|---------|-------------|
330
- | `href` | `string` | (required) | Navigation path (fully-formed URL, e.g., `"/home/dashboard?tab=1"`) |
331
- | `state` | `Record<string, unknown>` | - | State to pass to the route (not exposed in URL) |
332
- | `window.width` | `number` | `800` | New window width (Shift+click) |
333
- | `window.height` | `number` | `800` | New window height (Shift+click) |
334
-
335
- ---
336
-
337
- ## createAppStructure
338
-
339
- Utility for declaratively defining app structure (routing, menus, permissions). Takes a factory function and returns `{ AppStructureProvider, useAppStructure }` for Context-based access with full `InferPerms` type preservation.
340
-
341
- ```tsx
342
- // appStructure.ts
343
- import { createAppStructure } from "@simplysm/solid";
344
- import { IconHome, IconUsers } from "@tabler/icons-solidjs";
345
- import { useAuth } from "./AuthProvider";
346
-
347
- export const { AppStructureProvider, useAppStructure } = createAppStructure(() => {
348
- const auth = useAuth();
349
- return {
350
- items: [
351
- {
352
- code: "home",
353
- title: "Home",
354
- icon: IconHome,
355
- component: HomePage,
356
- perms: ["use"],
357
- },
358
- {
359
- code: "admin",
360
- title: "Admin",
361
- icon: IconUsers,
362
- children: [
363
- { code: "users", title: "User Management", component: UsersPage, perms: ["use", "edit"] },
364
- { code: "roles", title: "Role Management", component: RolesPage, perms: ["use"], isNotMenu: true },
365
- ],
366
- },
367
- ],
368
- usableModules: () => activeModules(), // optional: filter by active modules
369
- permRecord: () => auth.authInfo()?.permissions, // optional: Record<string, boolean>
370
- };
371
- });
372
- ```
373
-
374
- The factory function (`getOpts`) is called inside `AppStructureProvider` at render time, so context hooks like `useAuth()` can be used. The `const TItems` generic preserves item literal types for full `InferPerms` type inference.
375
-
376
- **Provider setup:**
377
-
378
- ```tsx
379
- // main.tsx or App.tsx
380
- import { AppStructureProvider } from "./appStructure";
381
-
382
- render(
383
- () => (
384
- <AppStructureProvider>
385
- <HashRouter>
386
- {/* ... */}
387
- </HashRouter>
388
- </AppStructureProvider>
389
- ),
390
- document.getElementById("root")!,
391
- );
392
- ```
393
-
394
- **Using the hook in components:**
395
-
396
- ```tsx
397
- import { useAppStructure } from "./appStructure";
398
-
399
- function Home(props: RouteSectionProps) {
400
- const appStructure = useAppStructure();
401
-
402
- // appStructure.usableRoutes() -- Accessor<AppRoute[]>
403
- // appStructure.usableMenus() -- Accessor<AppMenu[]>
404
- // appStructure.usableFlatMenus() -- Accessor<AppFlatMenu[]>
405
- // appStructure.usablePerms() -- Accessor<AppPerm[]>
406
- // appStructure.allFlatPerms -- AppFlatPerm[]
407
- // appStructure.getTitleChainByHref(href) -- string[]
408
- // appStructure.perms -- typed permission accessor
409
-
410
- return <Sidebar.Menu menus={appStructure.usableMenus()} />;
411
- }
412
- ```
413
-
414
- **Routing integration with `@solidjs/router`:**
415
-
416
- ```tsx
417
- import { useAppStructure } from "./appStructure";
418
-
419
- function HomeRoutes() {
420
- const appStructure = useAppStructure();
421
- return (
422
- <For each={appStructure.usableRoutes()}>
423
- {(r) => <Route path={r.path} component={r.component} />}
424
- </For>
425
- );
426
- }
427
-
428
- // In your router setup (inside AppStructureProvider):
429
- <Route path="/home" component={Home}>
430
- <Route path="/" component={() => <Navigate href="/home/main" />} />
431
- <HomeRoutes />
432
- <Route path="/*" component={NotFoundPage} />
433
- </Route>
434
- ```
435
-
436
- `usableRoutes()` is a reactive accessor returning routes filtered by `usableModules` and `permRecord`. Items with `perms: ["use"]` are excluded from routes when the user lacks the `use` permission.
437
-
438
- **AppStructure return type:**
439
-
440
- ```typescript
441
- interface AppStructure<TModule> {
442
- items: AppStructureItem<TModule>[];
443
- usableRoutes: Accessor<AppRoute[]>; // reactive, filtered by modules + permRecord
444
- usableMenus: Accessor<AppMenu[]>; // reactive, filtered by modules + permRecord
445
- usableFlatMenus: Accessor<AppFlatMenu[]>; // reactive, flat version of usableMenus
446
- usablePerms: Accessor<AppPerm<TModule>[]>; // reactive, filtered permission tree
447
- allFlatPerms: AppFlatPerm<TModule>[]; // static, all perm entries (not reactive)
448
- getTitleChainByHref(href: string): string[];
449
- perms: InferPerms<TItems>; // typed permission accessor (getter-based reactive booleans)
450
- }
451
-
452
- interface AppRoute {
453
- path: string;
454
- component: Component;
455
- }
456
-
457
- interface AppMenu {
458
- title: string;
459
- href?: string;
460
- icon?: Component<IconProps>;
461
- children?: AppMenu[];
462
- }
463
-
464
- interface AppFlatMenu {
465
- titleChain: string[];
466
- href: string;
467
- }
468
-
469
- interface AppPerm<TModule = string> {
470
- title: string;
471
- href?: string;
472
- modules?: TModule[];
473
- perms?: string[];
474
- children?: AppPerm<TModule>[];
475
- }
476
-
477
- interface AppFlatPerm<TModule = string> {
478
- titleChain: string[];
479
- code: string;
480
- modulesChain: TModule[][];
481
- requiredModulesChain: TModule[][];
482
- }
483
- ```
484
-
485
- **AppStructureItem types:**
486
-
487
- ```typescript
488
- // Group item (has children, no component)
489
- interface AppStructureGroupItem<TModule> {
490
- code: string;
491
- title: string;
492
- icon?: Component<IconProps>;
493
- modules?: TModule[];
494
- requiredModules?: TModule[];
495
- children: AppStructureItem<TModule>[];
496
- }
497
-
498
- // Leaf item (has component, no children)
499
- interface AppStructureLeafItem<TModule> {
500
- code: string;
501
- title: string;
502
- icon?: Component<IconProps>;
503
- modules?: TModule[];
504
- requiredModules?: TModule[];
505
- component?: Component;
506
- perms?: ("use" | "edit")[];
507
- subPerms?: AppStructureSubPerm<TModule>[];
508
- isNotMenu?: boolean; // exclude from menu but include in routing
509
- }
510
-
511
- // Sub-permission item
512
- interface AppStructureSubPerm<TModule> {
513
- code: string;
514
- title: string;
515
- modules?: TModule[];
516
- requiredModules?: TModule[];
517
- perms: ("use" | "edit")[];
518
- }
519
-
520
- type AppStructureItem<TModule> = AppStructureGroupItem<TModule> | AppStructureLeafItem<TModule>;
521
- ```
522
-
523
- #### getTitleChainByHref
524
-
525
- Retrieves the breadcrumb title chain for a given href path. Works on raw items (including `isNotMenu` items).
526
-
527
- ```tsx
528
- import { useLocation } from "@solidjs/router";
529
- import { useAppStructure } from "./appStructure";
530
-
531
- function Breadcrumb() {
532
- const appStructure = useAppStructure();
533
- const location = useLocation();
534
-
535
- // Returns ["Sales", "Invoice"] for /home/sales/invoice
536
- const breadcrumb = () => appStructure.getTitleChainByHref(location.pathname);
537
-
538
- return <span>{breadcrumb().join(" > ")}</span>;
539
- }
540
- ```
541
-
542
- #### perms
543
-
544
- Typed permission accessor providing dot-notation access with TypeScript autocompletion and reactive boolean values. Built from the `permRecord` signal using `Object.defineProperty` getters.
545
-
546
- **Important:** For type inference to work, pass items inline to `createAppStructure`. Declaring items as a separate variable with explicit `AppStructureItem[]` type annotation widens literal types, losing autocompletion.
547
-
548
- ```typescript
549
- // appStructure.ts
550
- import { createAppStructure } from "@simplysm/solid";
551
-
552
- export const { AppStructureProvider, useAppStructure } = createAppStructure(() => ({
553
- items: [
554
- {
555
- code: "home",
556
- title: "Home",
557
- children: [
558
- {
559
- code: "user",
560
- title: "User",
561
- perms: ["use", "edit"],
562
- subPerms: [
563
- { code: "auth", title: "Auth", perms: ["use"] },
564
- ],
565
- },
566
- ],
567
- },
568
- ],
569
- permRecord: () => userPermissions(),
570
- }));
571
-
572
- // In a component (inside AppStructureProvider):
573
- const appStructure = useAppStructure();
574
-
575
- // Typed access with autocompletion:
576
- appStructure.perms.home.user.use // boolean (reactive)
577
- appStructure.perms.home.user.edit // boolean (reactive)
578
- appStructure.perms.home.user.auth.use // boolean (reactive)
579
-
580
- // Use in components:
581
- <Show when={appStructure.perms.home.user.use}>
582
- <UserPage />
583
- </Show>
584
- ```
585
-
586
- - Leaf items without `perms`/`subPerms` are excluded from the tree
587
- - Groups with no permission-bearing descendants are excluded
588
- - Returns `false` when `permRecord` is not provided or key is missing