@simplysm/solid 13.0.28 → 13.0.30

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 (379) hide show
  1. package/README.md +15 -9
  2. package/dist/components/data/Pagination.d.ts +4 -5
  3. package/dist/components/data/Pagination.d.ts.map +1 -1
  4. package/dist/components/data/Pagination.js +14 -14
  5. package/dist/components/data/Pagination.js.map +2 -2
  6. package/dist/components/data/Table.js +1 -1
  7. package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
  8. package/dist/components/data/calendar/Calendar.js +1 -1
  9. package/dist/components/data/calendar/Calendar.js.map +1 -1
  10. package/dist/components/data/kanban/Kanban.d.ts +9 -9
  11. package/dist/components/data/kanban/Kanban.d.ts.map +1 -1
  12. package/dist/components/data/kanban/Kanban.js +6 -6
  13. package/dist/components/data/kanban/Kanban.js.map +2 -2
  14. package/dist/components/data/list/List.d.ts.map +1 -1
  15. package/dist/components/data/list/List.js.map +1 -1
  16. package/dist/components/data/list/ListItem.d.ts.map +1 -1
  17. package/dist/components/data/list/ListItem.js.map +1 -1
  18. package/dist/components/data/permission-table/PermissionTable.d.ts.map +1 -1
  19. package/dist/components/data/permission-table/PermissionTable.js.map +1 -1
  20. package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
  21. package/dist/components/data/sheet/DataSheet.js +102 -107
  22. package/dist/components/data/sheet/DataSheet.js.map +2 -2
  23. package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
  24. package/dist/components/data/sheet/DataSheet.styles.js +24 -6
  25. package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
  26. package/dist/components/data/sheet/DataSheetColumn.d.ts.map +1 -1
  27. package/dist/components/data/sheet/DataSheetColumn.js.map +1 -1
  28. package/dist/components/data/sheet/DataSheetConfigDialog.d.ts.map +1 -1
  29. package/dist/components/data/sheet/DataSheetConfigDialog.js.map +1 -1
  30. package/dist/components/data/sheet/sheetUtils.d.ts.map +1 -1
  31. package/dist/components/data/sheet/sheetUtils.js.map +1 -1
  32. package/dist/components/data/sheet/types.d.ts +2 -2
  33. package/dist/components/data/sheet/types.d.ts.map +1 -1
  34. package/dist/components/disclosure/Collapse.d.ts.map +1 -1
  35. package/dist/components/disclosure/Collapse.js +0 -3
  36. package/dist/components/disclosure/Collapse.js.map +1 -1
  37. package/dist/components/disclosure/Dialog.d.ts +8 -8
  38. package/dist/components/disclosure/Dialog.d.ts.map +1 -1
  39. package/dist/components/disclosure/Dialog.js +64 -69
  40. package/dist/components/disclosure/Dialog.js.map +2 -2
  41. package/dist/components/disclosure/DialogContext.d.ts +4 -4
  42. package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
  43. package/dist/components/disclosure/DialogContext.js.map +1 -1
  44. package/dist/components/disclosure/DialogProvider.d.ts.map +1 -1
  45. package/dist/components/disclosure/DialogProvider.js +8 -8
  46. package/dist/components/disclosure/DialogProvider.js.map +2 -2
  47. package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
  48. package/dist/components/disclosure/Dropdown.js.map +1 -1
  49. package/dist/components/disclosure/Tabs.d.ts.map +1 -1
  50. package/dist/components/disclosure/Tabs.js.map +1 -1
  51. package/dist/components/display/Alert.d.ts.map +1 -1
  52. package/dist/components/display/Alert.js.map +1 -1
  53. package/dist/components/display/Card.d.ts +0 -1
  54. package/dist/components/display/Card.d.ts.map +1 -1
  55. package/dist/components/display/Card.js +1 -2
  56. package/dist/components/display/Card.js.map +1 -1
  57. package/dist/components/display/Echarts.d.ts +1 -1
  58. package/dist/components/display/Echarts.d.ts.map +1 -1
  59. package/dist/components/display/Echarts.js +2 -2
  60. package/dist/components/display/Echarts.js.map +2 -2
  61. package/dist/components/display/Link.d.ts +5 -0
  62. package/dist/components/display/Link.d.ts.map +1 -0
  63. package/dist/components/display/Link.js +26 -0
  64. package/dist/components/display/Link.js.map +6 -0
  65. package/dist/components/feedback/Progress.d.ts +3 -3
  66. package/dist/components/feedback/Progress.d.ts.map +1 -1
  67. package/dist/components/feedback/Progress.js +1 -1
  68. package/dist/components/feedback/Progress.js.map +2 -2
  69. package/dist/components/feedback/busy/BusyContainer.d.ts +13 -0
  70. package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -0
  71. package/dist/components/feedback/{loading/LoadingContainer.js → busy/BusyContainer.js} +20 -13
  72. package/dist/components/feedback/busy/BusyContainer.js.map +6 -0
  73. package/dist/components/feedback/busy/BusyContext.d.ts +11 -0
  74. package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -0
  75. package/dist/components/feedback/busy/BusyContext.js +14 -0
  76. package/dist/components/feedback/busy/BusyContext.js.map +6 -0
  77. package/dist/components/feedback/busy/BusyProvider.d.ts +7 -0
  78. package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -0
  79. package/dist/components/feedback/{loading/LoadingProvider.js → busy/BusyProvider.js} +7 -7
  80. package/dist/components/feedback/busy/BusyProvider.js.map +6 -0
  81. package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
  82. package/dist/components/feedback/notification/NotificationBanner.js +1 -1
  83. package/dist/components/feedback/notification/NotificationBanner.js.map +1 -1
  84. package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
  85. package/dist/components/feedback/notification/NotificationBell.js +4 -2
  86. package/dist/components/feedback/notification/NotificationBell.js.map +2 -2
  87. package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
  88. package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
  89. package/dist/components/feedback/notification/NotificationProvider.d.ts.map +1 -1
  90. package/dist/components/feedback/notification/NotificationProvider.js +1 -0
  91. package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
  92. package/dist/components/form-control/Button.d.ts.map +1 -1
  93. package/dist/components/form-control/Button.js +2 -2
  94. package/dist/components/form-control/Button.js.map +1 -1
  95. package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
  96. package/dist/components/form-control/DropdownTrigger.styles.js +6 -1
  97. package/dist/components/form-control/DropdownTrigger.styles.js.map +1 -1
  98. package/dist/components/form-control/Invalid.d.ts +4 -2
  99. package/dist/components/form-control/Invalid.d.ts.map +1 -1
  100. package/dist/components/form-control/Invalid.js +81 -41
  101. package/dist/components/form-control/Invalid.js.map +2 -2
  102. package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
  103. package/dist/components/form-control/ThemeToggle.js +4 -5
  104. package/dist/components/form-control/ThemeToggle.js.map +2 -2
  105. package/dist/components/form-control/checkbox/Checkbox.d.ts +4 -2
  106. package/dist/components/form-control/checkbox/Checkbox.d.ts.map +1 -1
  107. package/dist/components/form-control/checkbox/Checkbox.js +65 -52
  108. package/dist/components/form-control/checkbox/Checkbox.js.map +2 -2
  109. package/dist/components/form-control/checkbox/Checkbox.styles.d.ts +1 -2
  110. package/dist/components/form-control/checkbox/Checkbox.styles.d.ts.map +1 -1
  111. package/dist/components/form-control/checkbox/Checkbox.styles.js +8 -10
  112. package/dist/components/form-control/checkbox/Checkbox.styles.js.map +1 -1
  113. package/dist/components/form-control/checkbox/CheckboxGroup.d.ts +9 -9
  114. package/dist/components/form-control/checkbox/CheckboxGroup.d.ts.map +1 -1
  115. package/dist/components/form-control/checkbox/CheckboxGroup.js +10 -82
  116. package/dist/components/form-control/checkbox/CheckboxGroup.js.map +2 -2
  117. package/dist/components/form-control/checkbox/Radio.d.ts +4 -2
  118. package/dist/components/form-control/checkbox/Radio.d.ts.map +1 -1
  119. package/dist/components/form-control/checkbox/Radio.js +64 -51
  120. package/dist/components/form-control/checkbox/Radio.js.map +2 -2
  121. package/dist/components/form-control/checkbox/RadioGroup.d.ts +9 -9
  122. package/dist/components/form-control/checkbox/RadioGroup.d.ts.map +1 -1
  123. package/dist/components/form-control/checkbox/RadioGroup.js +10 -77
  124. package/dist/components/form-control/checkbox/RadioGroup.js.map +2 -2
  125. package/dist/components/form-control/color-picker/ColorPicker.d.ts +8 -3
  126. package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
  127. package/dist/components/form-control/color-picker/ColorPicker.js +43 -26
  128. package/dist/components/form-control/color-picker/ColorPicker.js.map +2 -2
  129. package/dist/components/form-control/combobox/Combobox.d.ts +8 -8
  130. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  131. package/dist/components/form-control/combobox/Combobox.js +72 -59
  132. package/dist/components/form-control/combobox/Combobox.js.map +2 -2
  133. package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
  134. package/dist/components/form-control/editor/EditorToolbar.js +3 -2
  135. package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
  136. package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
  137. package/dist/components/form-control/editor/RichTextEditor.js.map +1 -1
  138. package/dist/components/form-control/field/DatePicker.d.ts +6 -0
  139. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  140. package/dist/components/form-control/field/DatePicker.js +138 -117
  141. package/dist/components/form-control/field/DatePicker.js.map +2 -2
  142. package/dist/components/form-control/field/DateTimePicker.d.ts +6 -0
  143. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  144. package/dist/components/form-control/field/DateTimePicker.js +138 -115
  145. package/dist/components/form-control/field/DateTimePicker.js.map +2 -2
  146. package/dist/components/form-control/field/Field.styles.d.ts +14 -0
  147. package/dist/components/form-control/field/Field.styles.d.ts.map +1 -1
  148. package/dist/components/form-control/field/Field.styles.js +47 -3
  149. package/dist/components/form-control/field/Field.styles.js.map +1 -1
  150. package/dist/components/form-control/field/FieldPlaceholder.d.ts +7 -0
  151. package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -0
  152. package/dist/components/form-control/field/FieldPlaceholder.js +34 -0
  153. package/dist/components/form-control/field/FieldPlaceholder.js.map +6 -0
  154. package/dist/components/form-control/field/NumberInput.d.ts +13 -0
  155. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  156. package/dist/components/form-control/field/NumberInput.js +163 -111
  157. package/dist/components/form-control/field/NumberInput.js.map +2 -2
  158. package/dist/components/form-control/field/TextInput.d.ts +16 -1
  159. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  160. package/dist/components/form-control/field/TextInput.js +177 -114
  161. package/dist/components/form-control/field/TextInput.js.map +2 -2
  162. package/dist/components/form-control/field/Textarea.d.ts +10 -0
  163. package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
  164. package/dist/components/form-control/field/Textarea.js +156 -121
  165. package/dist/components/form-control/field/Textarea.js.map +2 -2
  166. package/dist/components/form-control/field/TimePicker.d.ts +10 -0
  167. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  168. package/dist/components/form-control/field/TimePicker.js +126 -94
  169. package/dist/components/form-control/field/TimePicker.js.map +2 -2
  170. package/dist/components/form-control/select/Select.d.ts +7 -9
  171. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  172. package/dist/components/form-control/select/Select.js +71 -60
  173. package/dist/components/form-control/select/Select.js.map +2 -2
  174. package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
  175. package/dist/components/form-control/select/SelectItem.js.map +1 -1
  176. package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
  177. package/dist/components/form-control/state-preset/StatePreset.js +2 -1
  178. package/dist/components/form-control/state-preset/StatePreset.js.map +2 -2
  179. package/dist/components/layout/FormGroup.d.ts.map +1 -1
  180. package/dist/components/layout/FormGroup.js.map +1 -1
  181. package/dist/components/layout/sidebar/Sidebar.d.ts.map +1 -1
  182. package/dist/components/layout/sidebar/Sidebar.js +1 -1
  183. package/dist/components/layout/sidebar/Sidebar.js.map +1 -1
  184. package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
  185. package/dist/components/layout/sidebar/SidebarContainer.js.map +1 -1
  186. package/dist/components/layout/sidebar/SidebarMenu.js +1 -1
  187. package/dist/components/layout/sidebar/SidebarMenu.js.map +1 -1
  188. package/dist/components/layout/sidebar/SidebarUser.d.ts.map +1 -1
  189. package/dist/components/layout/sidebar/SidebarUser.js +4 -4
  190. package/dist/components/layout/sidebar/SidebarUser.js.map +1 -1
  191. package/dist/components/layout/topbar/Topbar.js +1 -1
  192. package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
  193. package/dist/components/layout/topbar/TopbarMenu.js.map +1 -1
  194. package/dist/components/layout/topbar/TopbarUser.d.ts.map +1 -1
  195. package/dist/components/layout/topbar/TopbarUser.js.map +1 -1
  196. package/dist/helpers/createAppStructure.d.ts.map +1 -1
  197. package/dist/helpers/createAppStructure.js +17 -12
  198. package/dist/helpers/createAppStructure.js.map +1 -1
  199. package/dist/helpers/mergeStyles.d.ts.map +1 -1
  200. package/dist/helpers/mergeStyles.js +4 -1
  201. package/dist/helpers/mergeStyles.js.map +1 -1
  202. package/dist/helpers/splitSlots.d.ts.map +1 -1
  203. package/dist/helpers/splitSlots.js.map +1 -1
  204. package/dist/hooks/createControllableSignal.d.ts.map +1 -1
  205. package/dist/hooks/createControllableSignal.js.map +1 -1
  206. package/dist/hooks/createItemTemplate.d.ts +17 -0
  207. package/dist/hooks/createItemTemplate.d.ts.map +1 -0
  208. package/dist/hooks/createItemTemplate.js +40 -0
  209. package/dist/hooks/createItemTemplate.js.map +6 -0
  210. package/dist/hooks/createPointerDrag.d.ts +13 -0
  211. package/dist/hooks/createPointerDrag.d.ts.map +1 -0
  212. package/dist/hooks/createPointerDrag.js +15 -0
  213. package/dist/hooks/createPointerDrag.js.map +6 -0
  214. package/dist/hooks/createSelectionGroup.d.ts +70 -0
  215. package/dist/hooks/createSelectionGroup.d.ts.map +1 -0
  216. package/dist/hooks/createSelectionGroup.js +141 -0
  217. package/dist/hooks/createSelectionGroup.js.map +6 -0
  218. package/dist/hooks/useClipboardValueCopy.js +3 -1
  219. package/dist/hooks/useClipboardValueCopy.js.map +1 -1
  220. package/dist/hooks/useLocalStorage.d.ts +5 -3
  221. package/dist/hooks/useLocalStorage.d.ts.map +1 -1
  222. package/dist/hooks/useLocalStorage.js.map +1 -1
  223. package/dist/hooks/usePrint.d.ts.map +1 -1
  224. package/dist/hooks/usePrint.js +5 -3
  225. package/dist/hooks/usePrint.js.map +1 -1
  226. package/dist/hooks/{createPwaUpdate.d.ts → usePwaUpdate.d.ts} +2 -2
  227. package/dist/hooks/usePwaUpdate.d.ts.map +1 -0
  228. package/dist/hooks/{createPwaUpdate.js → usePwaUpdate.js} +3 -3
  229. package/dist/hooks/usePwaUpdate.js.map +6 -0
  230. package/dist/hooks/useRouterLink.d.ts.map +1 -1
  231. package/dist/hooks/useRouterLink.js.map +1 -1
  232. package/dist/hooks/useSyncConfig.d.ts +3 -3
  233. package/dist/hooks/useSyncConfig.d.ts.map +1 -1
  234. package/dist/hooks/useSyncConfig.js +6 -7
  235. package/dist/hooks/useSyncConfig.js.map +1 -1
  236. package/dist/index.d.ts +5 -6
  237. package/dist/index.d.ts.map +1 -1
  238. package/dist/index.js +6 -7
  239. package/dist/index.js.map +1 -1
  240. package/dist/providers/ConfigContext.d.ts +2 -2
  241. package/dist/providers/ConfigContext.d.ts.map +1 -1
  242. package/dist/providers/InitializeProvider.js +5 -5
  243. package/dist/providers/InitializeProvider.js.map +2 -2
  244. package/dist/providers/ServiceClientProvider.d.ts.map +1 -1
  245. package/dist/providers/ServiceClientProvider.js.map +1 -1
  246. package/dist/providers/ThemeContext.d.ts.map +1 -1
  247. package/dist/providers/ThemeContext.js +2 -1
  248. package/dist/providers/ThemeContext.js.map +2 -2
  249. package/dist/providers/shared-data/SharedDataChangeEvent.d.ts.map +1 -1
  250. package/dist/providers/shared-data/SharedDataChangeEvent.js +1 -3
  251. package/dist/providers/shared-data/SharedDataChangeEvent.js.map +1 -1
  252. package/dist/providers/shared-data/SharedDataContext.d.ts +1 -1
  253. package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
  254. package/dist/providers/shared-data/SharedDataProvider.d.ts.map +1 -1
  255. package/dist/providers/shared-data/SharedDataProvider.js +6 -6
  256. package/dist/providers/shared-data/SharedDataProvider.js.map +2 -2
  257. package/dist/styles/patterns.styles.d.ts +1 -0
  258. package/dist/styles/patterns.styles.d.ts.map +1 -1
  259. package/dist/styles/patterns.styles.js +12 -1
  260. package/dist/styles/patterns.styles.js.map +1 -1
  261. package/dist/styles/tokens.styles.d.ts +2 -1
  262. package/dist/styles/tokens.styles.d.ts.map +1 -1
  263. package/dist/styles/tokens.styles.js +1 -1
  264. package/dist/styles/tokens.styles.js.map +1 -1
  265. package/docs/data-components.md +34 -5
  266. package/docs/disclosure.md +28 -8
  267. package/docs/display.md +19 -2
  268. package/docs/feedback.md +35 -12
  269. package/docs/form-controls.md +289 -33
  270. package/docs/hooks.md +21 -9
  271. package/docs/layout.md +15 -3
  272. package/docs/providers.md +120 -8
  273. package/docs/styling.md +90 -0
  274. package/package.json +3 -3
  275. package/src/components/data/Pagination.tsx +26 -22
  276. package/src/components/data/Table.tsx +1 -1
  277. package/src/components/data/calendar/Calendar.tsx +19 -5
  278. package/src/components/data/kanban/Kanban.tsx +72 -35
  279. package/src/components/data/list/List.tsx +11 -4
  280. package/src/components/data/list/ListItem.tsx +12 -2
  281. package/src/components/data/permission-table/PermissionTable.tsx +32 -5
  282. package/src/components/data/sheet/DataSheet.styles.ts +24 -6
  283. package/src/components/data/sheet/DataSheet.tsx +215 -149
  284. package/src/components/data/sheet/DataSheetColumn.tsx +5 -1
  285. package/src/components/data/sheet/DataSheetConfigDialog.tsx +27 -5
  286. package/src/components/data/sheet/sheetUtils.ts +12 -3
  287. package/src/components/data/sheet/types.ts +2 -2
  288. package/src/components/disclosure/Collapse.tsx +14 -3
  289. package/src/components/disclosure/Dialog.tsx +122 -106
  290. package/src/components/disclosure/DialogContext.ts +8 -5
  291. package/src/components/disclosure/DialogProvider.tsx +19 -7
  292. package/src/components/disclosure/Dropdown.tsx +12 -2
  293. package/src/components/disclosure/Tabs.tsx +29 -5
  294. package/src/components/display/Alert.tsx +3 -4
  295. package/src/components/display/Card.tsx +1 -2
  296. package/src/components/display/Echarts.tsx +12 -5
  297. package/src/components/display/Link.tsx +22 -0
  298. package/src/components/feedback/Progress.tsx +9 -5
  299. package/src/components/feedback/{loading/LoadingContainer.tsx → busy/BusyContainer.tsx} +52 -19
  300. package/src/components/feedback/busy/BusyContext.ts +20 -0
  301. package/src/components/feedback/{loading/LoadingProvider.tsx → busy/BusyProvider.tsx} +10 -10
  302. package/src/components/feedback/notification/NotificationBanner.tsx +14 -3
  303. package/src/components/feedback/notification/NotificationBell.tsx +21 -15
  304. package/src/components/feedback/notification/NotificationContext.ts +4 -1
  305. package/src/components/feedback/notification/NotificationProvider.tsx +4 -1
  306. package/src/components/form-control/Button.tsx +8 -3
  307. package/src/components/form-control/DropdownTrigger.styles.ts +7 -1
  308. package/src/components/form-control/Invalid.tsx +114 -48
  309. package/src/components/form-control/ThemeToggle.tsx +9 -18
  310. package/src/components/form-control/checkbox/Checkbox.styles.ts +7 -10
  311. package/src/components/form-control/checkbox/Checkbox.tsx +39 -28
  312. package/src/components/form-control/checkbox/CheckboxGroup.tsx +18 -97
  313. package/src/components/form-control/checkbox/Radio.tsx +39 -28
  314. package/src/components/form-control/checkbox/RadioGroup.tsx +18 -92
  315. package/src/components/form-control/color-picker/ColorPicker.tsx +51 -18
  316. package/src/components/form-control/combobox/Combobox.tsx +53 -35
  317. package/src/components/form-control/editor/EditorToolbar.tsx +19 -19
  318. package/src/components/form-control/editor/RichTextEditor.tsx +22 -4
  319. package/src/components/form-control/field/DatePicker.tsx +99 -93
  320. package/src/components/form-control/field/DateTimePicker.tsx +115 -96
  321. package/src/components/form-control/field/Field.styles.ts +62 -3
  322. package/src/components/form-control/field/FieldPlaceholder.tsx +18 -0
  323. package/src/components/form-control/field/NumberInput.tsx +136 -84
  324. package/src/components/form-control/field/TextInput.tsx +135 -88
  325. package/src/components/form-control/field/Textarea.tsx +126 -99
  326. package/src/components/form-control/field/TimePicker.tsx +101 -71
  327. package/src/components/form-control/select/Select.tsx +75 -42
  328. package/src/components/form-control/select/SelectItem.tsx +3 -1
  329. package/src/components/form-control/state-preset/StatePreset.tsx +41 -22
  330. package/src/components/layout/FormGroup.tsx +11 -2
  331. package/src/components/layout/sidebar/Sidebar.tsx +3 -2
  332. package/src/components/layout/sidebar/SidebarContainer.tsx +8 -1
  333. package/src/components/layout/sidebar/SidebarMenu.tsx +8 -2
  334. package/src/components/layout/sidebar/SidebarUser.tsx +12 -7
  335. package/src/components/layout/topbar/Topbar.tsx +1 -1
  336. package/src/components/layout/topbar/TopbarMenu.tsx +27 -5
  337. package/src/components/layout/topbar/TopbarUser.tsx +5 -1
  338. package/src/helpers/createAppStructure.ts +29 -15
  339. package/src/helpers/mergeStyles.ts +6 -2
  340. package/src/helpers/splitSlots.ts +4 -1
  341. package/src/hooks/createControllableSignal.ts +2 -1
  342. package/src/hooks/createItemTemplate.tsx +42 -0
  343. package/src/hooks/createPointerDrag.ts +28 -0
  344. package/src/hooks/createSelectionGroup.tsx +235 -0
  345. package/src/hooks/useClipboardValueCopy.ts +5 -2
  346. package/src/hooks/useLocalStorage.ts +11 -5
  347. package/src/hooks/usePrint.ts +9 -4
  348. package/src/hooks/{createPwaUpdate.ts → usePwaUpdate.ts} +1 -1
  349. package/src/hooks/useRouterLink.ts +3 -1
  350. package/src/hooks/useSyncConfig.ts +9 -13
  351. package/src/index.ts +6 -7
  352. package/src/providers/ConfigContext.ts +2 -2
  353. package/src/providers/InitializeProvider.tsx +4 -4
  354. package/src/providers/ServiceClientProvider.tsx +14 -3
  355. package/src/providers/ThemeContext.tsx +12 -3
  356. package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -3
  357. package/src/providers/shared-data/SharedDataContext.ts +1 -1
  358. package/src/providers/shared-data/SharedDataProvider.tsx +13 -8
  359. package/src/styles/patterns.styles.ts +13 -1
  360. package/src/styles/tokens.styles.ts +2 -1
  361. package/tailwind.config.ts +9 -0
  362. package/tailwind.css +1 -1
  363. package/dist/components/display/Card.css +0 -15
  364. package/dist/components/feedback/loading/LoadingContainer.d.ts +0 -12
  365. package/dist/components/feedback/loading/LoadingContainer.d.ts.map +0 -1
  366. package/dist/components/feedback/loading/LoadingContainer.js.map +0 -6
  367. package/dist/components/feedback/loading/LoadingContext.d.ts +0 -11
  368. package/dist/components/feedback/loading/LoadingContext.d.ts.map +0 -1
  369. package/dist/components/feedback/loading/LoadingContext.js +0 -14
  370. package/dist/components/feedback/loading/LoadingContext.js.map +0 -6
  371. package/dist/components/feedback/loading/LoadingProvider.d.ts +0 -7
  372. package/dist/components/feedback/loading/LoadingProvider.d.ts.map +0 -1
  373. package/dist/components/feedback/loading/LoadingProvider.js.map +0 -6
  374. package/dist/hooks/createPwaUpdate.d.ts.map +0 -1
  375. package/dist/hooks/createPwaUpdate.js.map +0 -6
  376. package/src/components/display/Card.css +0 -15
  377. package/src/components/feedback/loading/LoadingContext.ts +0 -20
  378. /package/dist/components/feedback/{loading/LoadingContainer.css → busy/BusyContainer.css} +0 -0
  379. /package/src/components/feedback/{loading/LoadingContainer.css → busy/BusyContainer.css} +0 -0
@@ -1,19 +1,18 @@
1
1
  import clsx from "clsx";
2
- import { type Component, createEffect, type JSX, Show, splitProps } from "solid-js";
2
+ import { type Component, createEffect, createMemo, type JSX, Show, splitProps } from "solid-js";
3
3
  import { twMerge } from "tailwind-merge";
4
+ import type { IconProps as TablerIconProps } from "@tabler/icons-solidjs";
4
5
  import { createControllableSignal } from "../../../hooks/createControllableSignal";
5
6
  import { createIMEHandler } from "../../../hooks/createIMEHandler";
6
7
  import {
7
- type FieldSize,
8
- fieldBaseClass,
9
- fieldSizeClasses,
10
- fieldInsetClass,
11
- fieldInsetHeightClass,
12
- fieldInsetSizeHeightClasses,
13
- fieldDisabledClass,
8
+ fieldGapClasses,
14
9
  fieldInputClass,
10
+ type FieldSize,
11
+ getFieldWrapperClass,
15
12
  } from "./Field.styles";
16
- import { textMuted } from "../../../styles/tokens.styles";
13
+ import { PlaceholderFallback } from "./FieldPlaceholder";
14
+ import { Icon } from "../../display/Icon";
15
+ import { Invalid } from "../../form-control/Invalid";
17
16
 
18
17
  type TextInputType = "text" | "password" | "email";
19
18
 
@@ -34,7 +33,7 @@ export interface TextInputProps {
34
33
  title?: string;
35
34
 
36
35
  /** 자동완성 */
37
- autocomplete?: string;
36
+ autocomplete?: JSX.HTMLAutocomplete;
38
37
 
39
38
  /** 비활성화 */
40
39
  disabled?: boolean;
@@ -51,6 +50,27 @@ export interface TextInputProps {
51
50
  /** 입력 포맷 (예: XXX-XXXX-XXXX) */
52
51
  format?: string;
53
52
 
53
+ /** 접두 아이콘 */
54
+ prefixIcon?: Component<TablerIconProps>;
55
+
56
+ /** 필수 입력 여부 */
57
+ required?: boolean;
58
+
59
+ /** 최소 길이 */
60
+ minLength?: number;
61
+
62
+ /** 최대 길이 */
63
+ maxLength?: number;
64
+
65
+ /** 입력 패턴 (정규식 문자열) */
66
+ pattern?: string;
67
+
68
+ /** 커스텀 유효성 검사 함수 */
69
+ validate?: (value: string) => string | undefined;
70
+
71
+ /** touchMode: 포커스 해제 후에만 에러 표시 */
72
+ touchMode?: boolean;
73
+
54
74
  /** 커스텀 class */
55
75
  class?: string;
56
76
 
@@ -94,8 +114,7 @@ function removeFormat(formattedValue: string, format: string): string {
94
114
  let result = "";
95
115
 
96
116
  for (let i = 0; i < formattedValue.length; i++) {
97
- const formatChar = format[i];
98
- if (formatChar === "X") {
117
+ if (i >= format.length || format[i] === "X") {
99
118
  result += formattedValue[i];
100
119
  }
101
120
  // 포맷 문자가 아닌 경우 (구분자) 스킵
@@ -132,6 +151,13 @@ export const TextInput: Component<TextInputProps> = (props) => {
132
151
  "size",
133
152
  "inset",
134
153
  "format",
154
+ "prefixIcon",
155
+ "required",
156
+ "minLength",
157
+ "maxLength",
158
+ "pattern",
159
+ "validate",
160
+ "touchMode",
135
161
  "class",
136
162
  "style",
137
163
  ]);
@@ -186,19 +212,23 @@ export const TextInput: Component<TextInputProps> = (props) => {
186
212
 
187
213
  // wrapper 클래스 (includeCustomClass=false일 때 local.class 제외 — inset에서 outer에만 적용)
188
214
  const getWrapperClass = (includeCustomClass: boolean) =>
189
- twMerge(
190
- fieldBaseClass,
191
- local.size && fieldSizeClasses[local.size],
192
- local.disabled && fieldDisabledClass,
193
- local.inset && fieldInsetClass,
194
- local.inset && (local.size ? fieldInsetSizeHeightClasses[local.size] : fieldInsetHeightClass),
195
-
196
- includeCustomClass && local.class,
197
- );
215
+ getFieldWrapperClass({
216
+ size: local.size,
217
+ disabled: local.disabled,
218
+ inset: local.inset,
219
+ includeCustomClass: includeCustomClass && local.class,
220
+ extra: local.prefixIcon && fieldGapClasses[local.size ?? "default"],
221
+ });
198
222
 
199
223
  // 편집 가능 여부
200
224
  const isEditable = () => !local.disabled && !local.readonly;
201
225
 
226
+ const prefixIconEl = () => (
227
+ <Show when={local.prefixIcon}>
228
+ <Icon icon={local.prefixIcon!} class="shrink-0 opacity-70" />
229
+ </Show>
230
+ );
231
+
202
232
  // disabled 전환 시 미커밋 조합 값 flush
203
233
  createEffect(() => {
204
234
  if (!isEditable()) {
@@ -206,76 +236,93 @@ export const TextInput: Component<TextInputProps> = (props) => {
206
236
  }
207
237
  });
208
238
 
239
+ // 유효성 검사 메시지 (순서대로 검사, 최초 실패 메시지 반환)
240
+ const errorMsg = createMemo(() => {
241
+ const v = value();
242
+ if (local.required && !v) return "필수 입력 항목입니다";
243
+ if (v) {
244
+ if (local.minLength != null && v.length < local.minLength)
245
+ return `최소 ${local.minLength}자 이상 입력하세요`;
246
+ if (local.maxLength != null && v.length > local.maxLength)
247
+ return `최대 ${local.maxLength}자까지 입력 가능합니다`;
248
+ if (local.pattern != null && !new RegExp(local.pattern).test(v))
249
+ return "입력 형식이 올바르지 않습니다";
250
+ }
251
+ return local.validate?.(v);
252
+ });
253
+
209
254
  return (
210
- <Show
211
- when={local.inset}
212
- fallback={
213
- // standalone 모드: 기존 Show 패턴 유지
214
- <Show
215
- when={isEditable()}
216
- fallback={
217
- <div
218
- {...rest}
219
- data-text-field
220
- class={twMerge(getWrapperClass(true), "sd-text-field")}
221
- style={local.style}
222
- title={local.title}
223
- >
224
- {displayValue() ||
225
- (local.placeholder != null && local.placeholder !== "" ? (
226
- <span class={textMuted}>{local.placeholder}</span>
227
- ) : (
228
- "\u00A0"
229
- ))}
230
- </div>
231
- }
232
- >
233
- <div {...rest} data-text-field class={getWrapperClass(true)} style={local.style}>
234
- <input
235
- type={local.type ?? "text"}
236
- class={fieldInputClass}
237
- value={inputValue()}
238
- placeholder={local.placeholder}
239
- title={local.title}
240
- autocomplete={local.autocomplete}
241
- onInput={handleInput}
242
- onCompositionStart={handleCompositionStart}
243
- onCompositionEnd={handleCompositionEnd}
244
- />
245
- </div>
246
- </Show>
247
- }
255
+ <Invalid
256
+ message={errorMsg()}
257
+ variant={local.inset ? "dot" : "border"}
258
+ touchMode={local.touchMode}
248
259
  >
249
- {/* inset 모드: dual-element overlay 패턴 */}
250
- <div
251
- {...rest}
252
- data-text-field
253
- class={twMerge(getWrapperClass(false), "relative", local.class)}
254
- style={local.style}
260
+ <Show
261
+ when={local.inset}
262
+ fallback={
263
+ // standalone 모드: 기존 Show 패턴 유지
264
+ <Show
265
+ when={isEditable()}
266
+ fallback={
267
+ <div
268
+ {...rest}
269
+ data-text-field
270
+ class={twMerge(getWrapperClass(true), "sd-text-field")}
271
+ style={local.style}
272
+ title={local.title}
273
+ >
274
+ {prefixIconEl()}
275
+ <PlaceholderFallback value={displayValue()} placeholder={local.placeholder} />
276
+ </div>
277
+ }
278
+ >
279
+ <div {...rest} data-text-field class={getWrapperClass(true)} style={local.style}>
280
+ {prefixIconEl()}
281
+ <input
282
+ type={local.type ?? "text"}
283
+ class={fieldInputClass}
284
+ value={inputValue()}
285
+ placeholder={local.placeholder}
286
+ title={local.title}
287
+ autocomplete={local.autocomplete}
288
+ onInput={handleInput}
289
+ onCompositionStart={handleCompositionStart}
290
+ onCompositionEnd={handleCompositionEnd}
291
+ />
292
+ </div>
293
+ </Show>
294
+ }
255
295
  >
256
- <div data-text-field-content style={{ visibility: isEditable() ? "hidden" : undefined }}>
257
- {displayValue() ||
258
- (local.placeholder != null && local.placeholder !== "" ? (
259
- <span class={textMuted}>{local.placeholder}</span>
260
- ) : (
261
- "\u00A0"
262
- ))}
263
- </div>
264
-
265
- <Show when={isEditable()}>
266
- <input
267
- type={local.type ?? "text"}
268
- class={clsx(fieldInputClass, "absolute left-0 top-0 size-full", "px-2 py-1")}
269
- value={inputValue()}
270
- placeholder={local.placeholder}
296
+ {/* inset 모드: dual-element overlay 패턴 */}
297
+ <div {...rest} data-text-field class={clsx("relative", local.class)} style={local.style}>
298
+ <div
299
+ data-text-field-content
300
+ class={getWrapperClass(false)}
301
+ style={{ visibility: isEditable() ? "hidden" : undefined }}
271
302
  title={local.title}
272
- autocomplete={local.autocomplete}
273
- onInput={handleInput}
274
- onCompositionStart={handleCompositionStart}
275
- onCompositionEnd={handleCompositionEnd}
276
- />
277
- </Show>
278
- </div>
279
- </Show>
303
+ >
304
+ {prefixIconEl()}
305
+ <PlaceholderFallback value={displayValue()} placeholder={local.placeholder} />
306
+ </div>
307
+
308
+ <Show when={isEditable()}>
309
+ <div class={twMerge(getWrapperClass(false), "absolute left-0 top-0 size-full")}>
310
+ {prefixIconEl()}
311
+ <input
312
+ type={local.type ?? "text"}
313
+ class={fieldInputClass}
314
+ value={inputValue()}
315
+ placeholder={local.placeholder}
316
+ title={local.title}
317
+ autocomplete={local.autocomplete}
318
+ onInput={handleInput}
319
+ onCompositionStart={handleCompositionStart}
320
+ onCompositionEnd={handleCompositionEnd}
321
+ />
322
+ </div>
323
+ </Show>
324
+ </div>
325
+ </Show>
326
+ </Invalid>
280
327
  );
281
328
  };
@@ -1,16 +1,11 @@
1
1
  import clsx from "clsx";
2
- import { type Component, createEffect, type JSX, Show, splitProps } from "solid-js";
2
+ import { type Component, createEffect, createMemo, type JSX, Show, splitProps } from "solid-js";
3
3
  import { twMerge } from "tailwind-merge";
4
4
  import { createControllableSignal } from "../../../hooks/createControllableSignal";
5
5
  import { createIMEHandler } from "../../../hooks/createIMEHandler";
6
- import {
7
- type FieldSize,
8
- textAreaBaseClass as fieldTextAreaBaseClass,
9
- textAreaSizeClasses,
10
- fieldInsetClass,
11
- fieldDisabledClass,
12
- } from "./Field.styles";
13
- import { textMuted } from "../../../styles/tokens.styles";
6
+ import { type FieldSize, textAreaSizeClasses, getTextareaWrapperClass } from "./Field.styles";
7
+ import { PlaceholderFallback } from "./FieldPlaceholder";
8
+ import { Invalid } from "../../form-control/Invalid";
14
9
 
15
10
  export interface TextareaProps {
16
11
  /** 입력 값 */
@@ -40,6 +35,21 @@ export interface TextareaProps {
40
35
  /** 최소 줄 수 (기본값: 1) */
41
36
  minRows?: number;
42
37
 
38
+ /** 필수 입력 여부 */
39
+ required?: boolean;
40
+
41
+ /** 최소 길이 */
42
+ minLength?: number;
43
+
44
+ /** 최대 길이 */
45
+ maxLength?: number;
46
+
47
+ /** 커스텀 유효성 검사 함수 */
48
+ validate?: (value: string) => string | undefined;
49
+
50
+ /** touchMode: 포커스 해제 후에만 에러 표시 */
51
+ touchMode?: boolean;
52
+
43
53
  /** 커스텀 class */
44
54
  class?: string;
45
55
 
@@ -79,6 +89,11 @@ export const Textarea: Component<TextareaProps> = (props) => {
79
89
  "size",
80
90
  "inset",
81
91
  "minRows",
92
+ "required",
93
+ "minLength",
94
+ "maxLength",
95
+ "validate",
96
+ "touchMode",
82
97
  "class",
83
98
  "style",
84
99
  ]);
@@ -128,21 +143,20 @@ export const Textarea: Component<TextareaProps> = (props) => {
128
143
  const contentForHeight = () => {
129
144
  const rows = local.minRows ?? 1;
130
145
  const val = displayValue();
131
- const content = val !== "" && val.split("\n").length >= rows ? val : "\n".repeat(rows - 1) + "\u00A0";
146
+ const content =
147
+ val !== "" && val.split("\n").length >= rows ? val : "\n".repeat(rows - 1) + "\u00A0";
132
148
  // 마지막이 줄바꿈이면 빈 줄 높이 확보를 위해 공백 추가
133
149
  return content.endsWith("\n") ? content + "\u00A0" : content;
134
150
  };
135
151
 
136
152
  // wrapper 클래스 (includeCustomClass=false일 때 local.class 제외 — inset에서 outer에만 적용)
137
153
  const getWrapperClass = (includeCustomClass: boolean) =>
138
- twMerge(
139
- fieldTextAreaBaseClass,
140
- local.size && textAreaSizeClasses[local.size],
141
- local.disabled && fieldDisabledClass,
142
- local.inset && fieldInsetClass,
143
-
144
- includeCustomClass && local.class,
145
- );
154
+ getTextareaWrapperClass({
155
+ size: local.size,
156
+ disabled: local.disabled,
157
+ inset: local.inset,
158
+ includeCustomClass: includeCustomClass && local.class,
159
+ });
146
160
 
147
161
  const getTextareaClass = () =>
148
162
  twMerge(textareaBaseClass, local.size && textAreaSizeClasses[local.size], local.inset && "p-0");
@@ -157,100 +171,113 @@ export const Textarea: Component<TextareaProps> = (props) => {
157
171
  }
158
172
  });
159
173
 
174
+ // 유효성 검사 메시지 (순서대로 검사, 최초 실패 메시지 반환)
175
+ const errorMsg = createMemo(() => {
176
+ const v = value();
177
+ if (local.required && !v) return "필수 입력 항목입니다";
178
+ if (v) {
179
+ if (local.minLength != null && v.length < local.minLength)
180
+ return `최소 ${local.minLength}자 이상 입력하세요`;
181
+ if (local.maxLength != null && v.length > local.maxLength)
182
+ return `최대 ${local.maxLength}자까지 입력 가능합니다`;
183
+ }
184
+ return local.validate?.(v);
185
+ });
186
+
160
187
  return (
161
- <Show
162
- when={local.inset}
163
- fallback={
164
- // standalone 모드: 기존 Show 패턴 유지
165
- <Show
166
- when={isEditable()}
167
- fallback={
188
+ <Invalid message={errorMsg()} variant="border" touchMode={local.touchMode}>
189
+ <Show
190
+ when={local.inset}
191
+ fallback={
192
+ // standalone 모드: 기존 Show 패턴 유지
193
+ <Show
194
+ when={isEditable()}
195
+ fallback={
196
+ <div
197
+ {...rest}
198
+ data-textarea-field
199
+ class={getWrapperClass(true)}
200
+ style={{ "white-space": "pre-wrap", "word-break": "break-all", ...local.style }}
201
+ title={local.title}
202
+ >
203
+ <PlaceholderFallback value={value()} placeholder={local.placeholder} />
204
+ </div>
205
+ }
206
+ >
168
207
  <div
169
208
  {...rest}
170
209
  data-textarea-field
171
210
  class={getWrapperClass(true)}
172
- style={{ "white-space": "pre-wrap", "word-break": "break-all", ...local.style }}
173
- title={local.title}
211
+ style={{ position: "relative", ...local.style }}
174
212
  >
175
- {value() ||
176
- (local.placeholder != null && local.placeholder !== "" ? (
177
- <span class={textMuted}>{local.placeholder}</span>
178
- ) : (
179
- "\u00A0"
180
- ))}
213
+ <div
214
+ data-hidden-content
215
+ style={{
216
+ "visibility": "hidden",
217
+ "white-space": "pre-wrap",
218
+ "word-break": "break-all",
219
+ }}
220
+ >
221
+ {contentForHeight()}
222
+ </div>
223
+
224
+ <textarea
225
+ class={getTextareaClass()}
226
+ value={value()}
227
+ placeholder={local.placeholder}
228
+ title={local.title}
229
+ onKeyDown={handleKeyDown}
230
+ onInput={handleInput}
231
+ onCompositionStart={handleCompositionStart}
232
+ onCompositionEnd={handleCompositionEnd}
233
+ />
181
234
  </div>
182
- }
235
+ </Show>
236
+ }
237
+ >
238
+ {/* inset 모드: dual-element overlay 패턴 */}
239
+ <div
240
+ {...rest}
241
+ data-textarea-field
242
+ class={clsx("relative", local.class)}
243
+ style={local.style}
183
244
  >
184
245
  <div
185
- {...rest}
186
- data-textarea-field
187
- class={getWrapperClass(true)}
188
- style={{ position: "relative", ...local.style }}
246
+ data-textarea-field-content
247
+ class={getWrapperClass(false)}
248
+ style={{
249
+ "visibility": isEditable() ? "hidden" : undefined,
250
+ "white-space": "pre-wrap",
251
+ "word-break": "break-all",
252
+ }}
253
+ title={local.title}
189
254
  >
255
+ {isEditable() ? (
256
+ contentForHeight()
257
+ ) : (
258
+ <PlaceholderFallback value={value()} placeholder={local.placeholder} />
259
+ )}
260
+ </div>
261
+
262
+ <Show when={isEditable()}>
190
263
  <div
191
- data-hidden-content
192
- style={{
193
- "visibility": "hidden",
194
- "white-space": "pre-wrap",
195
- "word-break": "break-all",
196
- }}
264
+ class={twMerge(getWrapperClass(false), "absolute left-0 top-0 size-full")}
265
+ style={{ position: "relative" }}
197
266
  >
198
- {contentForHeight()}
267
+ <textarea
268
+ class={twMerge(textareaBaseClass, local.size && textAreaSizeClasses[local.size])}
269
+ value={value()}
270
+ placeholder={local.placeholder}
271
+ title={local.title}
272
+ onKeyDown={handleKeyDown}
273
+ onInput={handleInput}
274
+ onCompositionStart={handleCompositionStart}
275
+ onCompositionEnd={handleCompositionEnd}
276
+ />
199
277
  </div>
200
-
201
- <textarea
202
- class={getTextareaClass()}
203
- value={value()}
204
- placeholder={local.placeholder}
205
- title={local.title}
206
- onKeyDown={handleKeyDown}
207
- onInput={handleInput}
208
- onCompositionStart={handleCompositionStart}
209
- onCompositionEnd={handleCompositionEnd}
210
- />
211
- </div>
212
- </Show>
213
- }
214
- >
215
- {/* inset 모드: dual-element overlay 패턴 */}
216
- <div
217
- {...rest}
218
- data-textarea-field
219
- class={twMerge(getWrapperClass(false), "relative", local.class)}
220
- style={local.style}
221
- >
222
- <div
223
- data-textarea-field-content
224
- style={{
225
- "visibility": isEditable() ? "hidden" : undefined,
226
- "white-space": "pre-wrap",
227
- "word-break": "break-all",
228
- }}
229
- title={local.title}
230
- >
231
- {isEditable()
232
- ? contentForHeight()
233
- : value() ||
234
- (local.placeholder != null && local.placeholder !== "" ? (
235
- <span class={textMuted}>{local.placeholder}</span>
236
- ) : (
237
- "\u00A0"
238
- ))}
278
+ </Show>
239
279
  </div>
240
-
241
- <Show when={isEditable()}>
242
- <textarea
243
- class={twMerge(textareaBaseClass, local.size && textAreaSizeClasses[local.size])}
244
- value={value()}
245
- placeholder={local.placeholder}
246
- title={local.title}
247
- onKeyDown={handleKeyDown}
248
- onInput={handleInput}
249
- onCompositionStart={handleCompositionStart}
250
- onCompositionEnd={handleCompositionEnd}
251
- />
252
- </Show>
253
- </div>
254
- </Show>
280
+ </Show>
281
+ </Invalid>
255
282
  );
256
283
  };