@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,4 +1,13 @@
1
- import { children, createSignal, For, type JSX, onCleanup, Show, splitProps } from "solid-js";
1
+ import {
2
+ children,
3
+ createMemo,
4
+ createSignal,
5
+ For,
6
+ type JSX,
7
+ onCleanup,
8
+ Show,
9
+ splitProps,
10
+ } from "solid-js";
2
11
  import clsx from "clsx";
3
12
  import { IconChevronDown, IconLoader2 } from "@tabler/icons-solidjs";
4
13
  import { DebounceQueue } from "@simplysm/core-common";
@@ -9,9 +18,11 @@ import { ComboboxContext, type ComboboxContextValue } from "./ComboboxContext";
9
18
  import { ComboboxItem } from "./ComboboxItem";
10
19
  import { ripple } from "../../../directives/ripple";
11
20
  import { createControllableSignal } from "../../../hooks/createControllableSignal";
21
+ import { createItemTemplate } from "../../../hooks/createItemTemplate";
12
22
  import { splitSlots } from "../../../helpers/splitSlots";
13
23
  import { type ComponentSize, textMuted } from "../../../styles/tokens.styles";
14
24
  import { chevronWrapperClass, getTriggerClass } from "../DropdownTrigger.styles";
25
+ import { Invalid } from "../Invalid";
15
26
 
16
27
  void ripple;
17
28
 
@@ -25,25 +36,8 @@ const inputClass = clsx(
25
36
 
26
37
  const noResultsClass = clsx("px-3 py-2", textMuted);
27
38
 
28
- /**
29
- * Combobox 아이템 렌더링 템플릿
30
- */
31
- interface ComboboxItemTemplateProps<TItem> {
32
- children: (item: TItem, index: number) => JSX.Element;
33
- }
34
-
35
- // 템플릿 함수를 저장하는 전역 WeakMap
36
- const templateFnMap = new WeakMap<HTMLElement, (item: unknown, index: number) => JSX.Element>();
37
-
38
- const ComboboxItemTemplate = <T,>(props: ComboboxItemTemplateProps<T>) => (
39
- <span
40
- ref={(el) => {
41
- templateFnMap.set(el, props.children as (item: unknown, index: number) => JSX.Element);
42
- }}
43
- data-combobox-item-template
44
- style={{ display: "none" }}
45
- />
46
- );
39
+ const { TemplateSlot: ComboboxItemTemplate, getTemplate: getComboboxItemTemplate } =
40
+ createItemTemplate<[item: unknown, index: number]>("data-combobox-item-template");
47
41
 
48
42
  // Props 정의
49
43
  export interface ComboboxProps<TValue = unknown> {
@@ -54,7 +48,7 @@ export interface ComboboxProps<TValue = unknown> {
54
48
  onValueChange?: (value: TValue) => void;
55
49
 
56
50
  /** 아이템 로드 함수 (필수) */
57
- loadItems: (query: string) => Promise<TValue[]>;
51
+ loadItems: (query: string) => TValue[] | Promise<TValue[]>;
58
52
 
59
53
  /** 디바운스 딜레이 (기본값: 300ms) */
60
54
  debounceMs?: number;
@@ -74,6 +68,12 @@ export interface ComboboxProps<TValue = unknown> {
74
68
  /** 필수 입력 */
75
69
  required?: boolean;
76
70
 
71
+ /** 커스텀 유효성 검사 함수 */
72
+ validate?: (value: TValue | undefined) => string | undefined;
73
+
74
+ /** touchMode: 포커스 해제 후에만 에러 표시 */
75
+ touchMode?: boolean;
76
+
77
77
  /** 플레이스홀더 */
78
78
  placeholder?: string;
79
79
 
@@ -146,6 +146,8 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
146
146
  "placeholder",
147
147
  "size",
148
148
  "inset",
149
+ "validate",
150
+ "touchMode",
149
151
  ]);
150
152
 
151
153
  let triggerRef!: HTMLDivElement;
@@ -154,7 +156,7 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
154
156
  const [open, setOpen] = createSignal(false);
155
157
  const [query, setQuery] = createSignal("");
156
158
  const [items, setItems] = createSignal<T[]>([]);
157
- const [loading, setLoading] = createSignal(false);
159
+ const [busyCount, setBusyCount] = createSignal(0);
158
160
 
159
161
  // 선택된 값 관리 (controlled/uncontrolled 패턴)
160
162
  const [getValue, setInternalValue] = createControllableSignal<T | undefined>({
@@ -200,12 +202,12 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
200
202
  // loadItems 함수 참조를 캡처하여 사용
201
203
  const loadItemsFn = local.loadItems;
202
204
  debounceQueue.run(async () => {
203
- setLoading(true);
205
+ setBusyCount((c) => c + 1);
204
206
  try {
205
- const result = await loadItemsFn(searchQuery);
207
+ const result = await Promise.resolve(loadItemsFn(searchQuery));
206
208
  setItems(result);
207
209
  } finally {
208
- setLoading(false);
210
+ setBusyCount((c) => c - 1);
209
211
  }
210
212
  });
211
213
  };
@@ -261,6 +263,14 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
261
263
  }
262
264
  };
263
265
 
266
+ // 유효성 검사 메시지
267
+ const errorMsg = createMemo(() => {
268
+ const v = getValue();
269
+ if (local.required && (v === undefined || v === null || v === ""))
270
+ return "필수 입력 항목입니다";
271
+ return local.validate?.(v);
272
+ });
273
+
264
274
  // 트리거 클래스
265
275
  const getTriggerClassName = () =>
266
276
  getTriggerClass({
@@ -280,9 +290,9 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
280
290
 
281
291
  // itemTemplate 함수 추출
282
292
  const getItemTemplate = (): ((item: T, index: number) => JSX.Element) | undefined => {
283
- const templateSlots = slots().comboboxItemTemplate;
284
- if (templateSlots.length === 0) return undefined;
285
- return templateFnMap.get(templateSlots[0]) as ((item: T, index: number) => JSX.Element) | undefined;
293
+ return getComboboxItemTemplate(slots().comboboxItemTemplate) as
294
+ | ((item: T, index: number) => JSX.Element)
295
+ | undefined;
286
296
  };
287
297
 
288
298
  // 선택된 값 또는 입력 표시
@@ -318,7 +328,7 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
318
328
  const itemTemplate = getItemTemplate();
319
329
 
320
330
  // 로딩 중
321
- if (loading()) {
331
+ if (busyCount() > 0) {
322
332
  return <div class={noResultsClass}>검색 중...</div>;
323
333
  }
324
334
 
@@ -337,13 +347,19 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
337
347
  if (itemTemplate) {
338
348
  return (
339
349
  <For each={items()}>
340
- {(item, index) => <ComboboxItem value={item}>{itemTemplate(item, index())}</ComboboxItem>}
350
+ {(item, index) => (
351
+ <ComboboxItem value={item}>{itemTemplate(item, index())}</ComboboxItem>
352
+ )}
341
353
  </For>
342
354
  );
343
355
  }
344
356
 
345
357
  // 기본 렌더링
346
- return <For each={items()}>{(item) => <ComboboxItem value={item}>{String(item)}</ComboboxItem>}</For>;
358
+ return (
359
+ <For each={items()}>
360
+ {(item) => <ComboboxItem value={item}>{String(item)}</ComboboxItem>}
361
+ </For>
362
+ );
347
363
  };
348
364
 
349
365
  return (
@@ -364,7 +380,7 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
364
380
  >
365
381
  <div class={selectedValueClass}>{renderDisplayContent()}</div>
366
382
  <div class={chevronWrapperClass}>
367
- <Show when={loading()} fallback={<Icon icon={IconChevronDown} size="1em" />}>
383
+ <Show when={busyCount() > 0} fallback={<Icon icon={IconChevronDown} size="1em" />}>
368
384
  <Icon icon={IconLoader2} size="1em" class="animate-spin" />
369
385
  </Show>
370
386
  </div>
@@ -380,9 +396,11 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
380
396
  };
381
397
 
382
398
  return (
383
- <ComboboxContext.Provider value={contextValue as ComboboxContextValue}>
384
- <ComboboxInner>{local.children}</ComboboxInner>
385
- </ComboboxContext.Provider>
399
+ <Invalid message={errorMsg()} variant="border" touchMode={local.touchMode}>
400
+ <ComboboxContext.Provider value={contextValue as ComboboxContextValue}>
401
+ <ComboboxInner>{local.children}</ComboboxInner>
402
+ </ComboboxContext.Provider>
403
+ </Invalid>
386
404
  );
387
405
  };
388
406
 
@@ -3,6 +3,7 @@ import clsx from "clsx";
3
3
  import { twMerge } from "tailwind-merge";
4
4
  import type { Editor } from "@tiptap/core";
5
5
  import { createEditorTransaction } from "solid-tiptap";
6
+ import { iconButtonBase } from "../../../styles/patterns.styles";
6
7
  import {
7
8
  IconBold,
8
9
  IconItalic,
@@ -39,28 +40,19 @@ const toolbarClass = clsx(
39
40
  );
40
41
 
41
42
  // 툴바 버튼 기본 스타일
42
- const toolbarBtnClass = clsx(
43
- "inline-flex items-center justify-center",
44
- "size-7 rounded",
45
- "text-base-600 dark:text-base-400",
46
- "hover:bg-base-100 dark:hover:bg-base-800",
47
- "transition-colors",
48
- );
43
+ const toolbarBtnClass = twMerge(iconButtonBase, "size-7");
49
44
 
50
45
  // 툴바 버튼 활성 스타일
51
- const toolbarBtnActiveClass = clsx("bg-primary-100 text-primary-700", "dark:bg-primary-900/40 dark:text-primary-300");
46
+ const toolbarBtnActiveClass = clsx(
47
+ "bg-primary-100 text-primary-700",
48
+ "dark:bg-primary-900/40 dark:text-primary-300",
49
+ );
52
50
 
53
51
  // 구분선 스타일
54
52
  const separatorClass = clsx("mx-1 h-5 w-px", "bg-base-300 dark:bg-base-700");
55
53
 
56
54
  // 색상 선택 label 스타일
57
- const colorLabelClass = clsx(
58
- "relative inline-flex items-center justify-center",
59
- "size-7 cursor-pointer rounded",
60
- "text-base-600 dark:text-base-400",
61
- "hover:bg-base-100 dark:hover:bg-base-800",
62
- "transition-colors",
63
- );
55
+ const colorLabelClass = twMerge(iconButtonBase, "relative", "size-7");
64
56
 
65
57
  // 색상 input 숨기기 스타일
66
58
  const colorInputClass = clsx("absolute opacity-0", "size-0");
@@ -107,7 +99,8 @@ export const EditorToolbar: Component<EditorToolbarProps> = (props) => {
107
99
  (editor) => (editor.getAttributes("highlight")["color"] as string | undefined) ?? "#ffff00",
108
100
  );
109
101
 
110
- const btnClass = (active: () => boolean) => twMerge(toolbarBtnClass, active() && toolbarBtnActiveClass);
102
+ const btnClass = (active: () => boolean) =>
103
+ twMerge(toolbarBtnClass, active() && toolbarBtnActiveClass);
111
104
 
112
105
  // 이미지 삽입 핸들러
113
106
  const handleImageInsert = () => {
@@ -202,14 +195,19 @@ export const EditorToolbar: Component<EditorToolbarProps> = (props) => {
202
195
  />
203
196
  </label>
204
197
  <label class={colorLabelClass} title="배경색">
205
- <span class={clsx("rounded px-0.5 text-sm font-bold")} style={{ "background-color": currentHighlight() }}>
198
+ <span
199
+ class={clsx("rounded px-0.5 text-sm font-bold")}
200
+ style={{ "background-color": currentHighlight() }}
201
+ >
206
202
  A
207
203
  </span>
208
204
  <input
209
205
  type="color"
210
206
  class={colorInputClass}
211
207
  value={currentHighlight()}
212
- onInput={(ev) => props.editor.chain().focus().toggleHighlight({ color: ev.currentTarget.value }).run()}
208
+ onInput={(ev) =>
209
+ props.editor.chain().focus().toggleHighlight({ color: ev.currentTarget.value }).run()
210
+ }
213
211
  />
214
212
  </label>
215
213
 
@@ -321,7 +319,9 @@ export const EditorToolbar: Component<EditorToolbarProps> = (props) => {
321
319
  type="button"
322
320
  class={toolbarBtnClass}
323
321
  title="테이블 삽입"
324
- onClick={() => props.editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()}
322
+ onClick={() =>
323
+ props.editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()
324
+ }
325
325
  >
326
326
  <Icon icon={IconTablePlus} size="1em" />
327
327
  </button>
@@ -1,4 +1,13 @@
1
- import { type Component, type JSX, Show, createEffect, on, onCleanup, splitProps, untrack } from "solid-js";
1
+ import {
2
+ type Component,
3
+ type JSX,
4
+ Show,
5
+ createEffect,
6
+ on,
7
+ onCleanup,
8
+ splitProps,
9
+ untrack,
10
+ } from "solid-js";
2
11
  import clsx from "clsx";
3
12
  import "./editor.css";
4
13
  import { twMerge } from "tailwind-merge";
@@ -67,7 +76,14 @@ const editorContentSizeClasses: Record<FieldSize, string> = {
67
76
  };
68
77
 
69
78
  export const RichTextEditor: Component<RichTextEditorProps> = (props) => {
70
- const [local, rest] = splitProps(props, ["value", "onValueChange", "disabled", "size", "class", "style"]);
79
+ const [local, rest] = splitProps(props, [
80
+ "value",
81
+ "onValueChange",
82
+ "disabled",
83
+ "size",
84
+ "class",
85
+ "style",
86
+ ]);
71
87
 
72
88
  const [value, setValue] = createControllableSignal({
73
89
  value: () => local.value ?? "",
@@ -148,9 +164,11 @@ export const RichTextEditor: Component<RichTextEditorProps> = (props) => {
148
164
  editor()?.destroy();
149
165
  });
150
166
 
151
- const getWrapperClass = () => twMerge(editorWrapperClass, local.disabled && editorDisabledClass, local.class);
167
+ const getWrapperClass = () =>
168
+ twMerge(editorWrapperClass, local.disabled && editorDisabledClass, local.class);
152
169
 
153
- const getContentClass = () => twMerge(editorContentClass, local.size && editorContentSizeClasses[local.size]);
170
+ const getContentClass = () =>
171
+ twMerge(editorContentClass, local.size && editorContentSizeClasses[local.size]);
154
172
 
155
173
  return (
156
174
  <div {...rest} data-rich-text-editor class={getWrapperClass()} style={local.style}>
@@ -1,18 +1,10 @@
1
1
  import clsx from "clsx";
2
- import { type Component, type JSX, Show, splitProps } from "solid-js";
2
+ import { type Component, createMemo, type JSX, Show, splitProps } from "solid-js";
3
3
  import { twMerge } from "tailwind-merge";
4
4
  import { DateOnly } from "@simplysm/core-common";
5
5
  import { createControllableSignal } from "../../../hooks/createControllableSignal";
6
- import {
7
- type FieldSize,
8
- fieldBaseClass,
9
- fieldSizeClasses,
10
- fieldInsetClass,
11
- fieldInsetHeightClass,
12
- fieldInsetSizeHeightClasses,
13
- fieldDisabledClass,
14
- fieldInputClass,
15
- } from "./Field.styles";
6
+ import { type FieldSize, fieldInputClass, getFieldWrapperClass } from "./Field.styles";
7
+ import { Invalid } from "../../form-control/Invalid";
16
8
 
17
9
  type DatePickerUnit = "year" | "month" | "date";
18
10
 
@@ -52,13 +44,22 @@ export interface DatePickerProps {
52
44
 
53
45
  /** 커스텀 style */
54
46
  style?: JSX.CSSProperties;
47
+
48
+ /** 필수 입력 여부 */
49
+ required?: boolean;
50
+
51
+ /** 커스텀 유효성 검사 함수 */
52
+ validate?: (value: DateOnly | undefined) => string | undefined;
53
+
54
+ /** touchMode: 포커스 해제 후에만 에러 표시 */
55
+ touchMode?: boolean;
55
56
  }
56
57
 
57
58
  /**
58
- * DateOnly 값을 input value용 문자열로 변환 (ISO 형식)
59
+ * DateOnly 값을 타입에 맞는 문자열로 변환
59
60
  */
60
- function formatValue(value: DateOnly | undefined, type: DatePickerUnit): string {
61
- if (value == null) return "";
61
+ function formatDateValue(value: DateOnly | undefined, type: DatePickerUnit): string | undefined {
62
+ if (value == null) return undefined;
62
63
 
63
64
  switch (type) {
64
65
  case "year":
@@ -109,22 +110,6 @@ function getInputType(type: DatePickerUnit): string {
109
110
  }
110
111
  }
111
112
 
112
- /**
113
- * min/max 속성을 타입에 맞는 문자열로 변환
114
- */
115
- function formatMinMax(value: DateOnly | undefined, type: DatePickerUnit): string | undefined {
116
- if (value == null) return undefined;
117
-
118
- switch (type) {
119
- case "year":
120
- return value.toFormatString("yyyy");
121
- case "month":
122
- return value.toFormatString("yyyy-MM");
123
- case "date":
124
- return value.toFormatString("yyyy-MM-dd");
125
- }
126
- }
127
-
128
113
  /**
129
114
  * DatePicker 컴포넌트
130
115
  *
@@ -165,6 +150,9 @@ export const DatePicker: Component<DatePickerProps> = (props) => {
165
150
  "inset",
166
151
  "class",
167
152
  "style",
153
+ "required",
154
+ "validate",
155
+ "touchMode",
168
156
  ]);
169
157
 
170
158
  // 기본 단위는 date
@@ -177,7 +165,7 @@ export const DatePicker: Component<DatePickerProps> = (props) => {
177
165
  });
178
166
 
179
167
  // 표시 값
180
- const displayValue = () => formatValue(value(), fieldType());
168
+ const displayValue = () => formatDateValue(value(), fieldType()) ?? "";
181
169
 
182
170
  // 값 확정 핸들러 (포커스 아웃 또는 Enter 시)
183
171
  const handleChange: JSX.EventHandler<HTMLInputElement, Event> = (e) => {
@@ -188,75 +176,93 @@ export const DatePicker: Component<DatePickerProps> = (props) => {
188
176
 
189
177
  // wrapper 클래스 (includeCustomClass: 외부 class를 포함할지 여부)
190
178
  const getWrapperClass = (includeCustomClass: boolean) =>
191
- twMerge(
192
- fieldBaseClass,
193
- local.size && fieldSizeClasses[local.size],
194
- local.disabled && fieldDisabledClass,
195
- local.inset && fieldInsetClass + " block",
196
- local.inset && (local.size ? fieldInsetSizeHeightClasses[local.size] : fieldInsetHeightClass),
197
-
198
- includeCustomClass && local.class,
199
- );
179
+ getFieldWrapperClass({
180
+ size: local.size,
181
+ disabled: local.disabled,
182
+ inset: local.inset,
183
+ includeCustomClass: includeCustomClass && local.class,
184
+ });
200
185
 
201
186
  // 편집 가능 여부
202
187
  const isEditable = () => !local.disabled && !local.readonly;
203
188
 
189
+ // 유효성 검사 메시지 (순서대로 검사, 최초 실패 메시지 반환)
190
+ const errorMsg = createMemo(() => {
191
+ const v = value();
192
+ if (local.required && v === undefined) return "필수 입력 항목입니다";
193
+ if (v !== undefined) {
194
+ if (local.min !== undefined && v.tick < local.min.tick)
195
+ return `${local.min}보다 크거나 같아야 합니다`;
196
+ if (local.max !== undefined && v.tick > local.max.tick)
197
+ return `${local.max}보다 작거나 같아야 합니다`;
198
+ }
199
+ return local.validate?.(v);
200
+ });
201
+
204
202
  return (
205
- <Show
206
- when={local.inset}
207
- fallback={
208
- // standalone 모드: 기존 Show 패턴 유지
209
- <Show
210
- when={isEditable()}
211
- fallback={
212
- <div
213
- {...rest}
214
- data-date-field
215
- class={twMerge(getWrapperClass(true), "sd-date-field")}
216
- style={local.style}
217
- title={local.title}
218
- >
219
- {displayValue() || "\u00A0"}
220
- </div>
221
- }
222
- >
223
- <div {...rest} data-date-field class={getWrapperClass(true)} style={local.style}>
224
- <input
225
- type={getInputType(fieldType())}
226
- class={fieldInputClass}
227
- value={displayValue()}
228
- title={local.title}
229
- min={formatMinMax(local.min, fieldType())}
230
- max={formatMinMax(local.max, fieldType())}
231
- onChange={handleChange}
232
- />
233
- </div>
234
- </Show>
235
- }
203
+ <Invalid
204
+ message={errorMsg()}
205
+ variant={local.inset ? "dot" : "border"}
206
+ touchMode={local.touchMode}
236
207
  >
237
- {/* inset 모드: dual-element overlay 패턴 */}
238
- <div
239
- {...rest}
240
- data-date-field
241
- class={twMerge(getWrapperClass(false), "relative", local.class)}
242
- style={local.style}
208
+ <Show
209
+ when={local.inset}
210
+ fallback={
211
+ // standalone 모드: 기존 Show 패턴 유지
212
+ <Show
213
+ when={isEditable()}
214
+ fallback={
215
+ <div
216
+ {...rest}
217
+ data-date-field
218
+ class={twMerge(getWrapperClass(true), "sd-date-field")}
219
+ style={local.style}
220
+ title={local.title}
221
+ >
222
+ {displayValue() || "\u00A0"}
223
+ </div>
224
+ }
225
+ >
226
+ <div {...rest} data-date-field class={getWrapperClass(true)} style={local.style}>
227
+ <input
228
+ type={getInputType(fieldType())}
229
+ class={fieldInputClass}
230
+ value={displayValue()}
231
+ title={local.title}
232
+ min={formatDateValue(local.min, fieldType())}
233
+ max={formatDateValue(local.max, fieldType())}
234
+ onChange={handleChange}
235
+ />
236
+ </div>
237
+ </Show>
238
+ }
243
239
  >
244
- <div data-date-field-content style={{ visibility: isEditable() ? "hidden" : undefined }} title={local.title}>
245
- {displayValue() || "\u00A0"}
246
- </div>
247
-
248
- <Show when={isEditable()}>
249
- <input
250
- type={getInputType(fieldType())}
251
- class={clsx(fieldInputClass, "absolute left-0 top-0 size-full", "px-2 py-1")}
252
- value={displayValue()}
240
+ {/* inset 모드: dual-element overlay 패턴 */}
241
+ <div {...rest} data-date-field class={clsx("relative", local.class)} style={local.style}>
242
+ <div
243
+ data-date-field-content
244
+ class={getWrapperClass(false)}
245
+ style={{ visibility: isEditable() ? "hidden" : undefined }}
253
246
  title={local.title}
254
- min={formatMinMax(local.min, fieldType())}
255
- max={formatMinMax(local.max, fieldType())}
256
- onChange={handleChange}
257
- />
258
- </Show>
259
- </div>
260
- </Show>
247
+ >
248
+ {displayValue() || "\u00A0"}
249
+ </div>
250
+
251
+ <Show when={isEditable()}>
252
+ <div class={twMerge(getWrapperClass(false), "absolute left-0 top-0 size-full")}>
253
+ <input
254
+ type={getInputType(fieldType())}
255
+ class={fieldInputClass}
256
+ value={displayValue()}
257
+ title={local.title}
258
+ min={formatDateValue(local.min, fieldType())}
259
+ max={formatDateValue(local.max, fieldType())}
260
+ onChange={handleChange}
261
+ />
262
+ </div>
263
+ </Show>
264
+ </div>
265
+ </Show>
266
+ </Invalid>
261
267
  );
262
268
  };