@simplysm/solid 13.0.0-beta.6

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 (745) hide show
  1. package/.cache/typecheck-browser.tsbuildinfo +1 -0
  2. package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
  3. package/README.md +1652 -0
  4. package/dist/components/data/Pagination.js +110 -0
  5. package/dist/components/data/Pagination.js.map +7 -0
  6. package/dist/components/data/Table.js +34 -0
  7. package/dist/components/data/Table.js.map +7 -0
  8. package/dist/components/data/calendar/Calendar.js +90 -0
  9. package/dist/components/data/calendar/Calendar.js.map +7 -0
  10. package/dist/components/data/kanban/Kanban.js +367 -0
  11. package/dist/components/data/kanban/Kanban.js.map +7 -0
  12. package/dist/components/data/kanban/KanbanContext.js +24 -0
  13. package/dist/components/data/kanban/KanbanContext.js.map +7 -0
  14. package/dist/components/data/list/List.js +133 -0
  15. package/dist/components/data/list/List.js.map +7 -0
  16. package/dist/components/data/list/ListContext.js +8 -0
  17. package/dist/components/data/list/ListContext.js.map +7 -0
  18. package/dist/components/data/list/ListItem.js +101 -0
  19. package/dist/components/data/list/ListItem.js.map +7 -0
  20. package/dist/components/data/list/ListItem.styles.js +43 -0
  21. package/dist/components/data/list/ListItem.styles.js.map +7 -0
  22. package/dist/components/data/permission-table/PermissionTable.js +189 -0
  23. package/dist/components/data/permission-table/PermissionTable.js.map +7 -0
  24. package/dist/components/data/sheet/DataSheet.js +907 -0
  25. package/dist/components/data/sheet/DataSheet.js.map +7 -0
  26. package/dist/components/data/sheet/DataSheet.styles.js +142 -0
  27. package/dist/components/data/sheet/DataSheet.styles.js.map +7 -0
  28. package/dist/components/data/sheet/DataSheetColumn.js +28 -0
  29. package/dist/components/data/sheet/DataSheetColumn.js.map +7 -0
  30. package/dist/components/data/sheet/DataSheetConfigDialog.js +83 -0
  31. package/dist/components/data/sheet/DataSheetConfigDialog.js.map +7 -0
  32. package/dist/components/data/sheet/sheetUtils.js +125 -0
  33. package/dist/components/data/sheet/sheetUtils.js.map +7 -0
  34. package/dist/components/data/sheet/types.js +1 -0
  35. package/dist/components/data/sheet/types.js.map +7 -0
  36. package/dist/components/disclosure/Collapse.js +45 -0
  37. package/dist/components/disclosure/Collapse.js.map +7 -0
  38. package/dist/components/disclosure/Dialog.js +367 -0
  39. package/dist/components/disclosure/Dialog.js.map +7 -0
  40. package/dist/components/disclosure/DialogContext.js +14 -0
  41. package/dist/components/disclosure/DialogContext.js.map +7 -0
  42. package/dist/components/disclosure/DialogInstanceContext.js +10 -0
  43. package/dist/components/disclosure/DialogInstanceContext.js.map +7 -0
  44. package/dist/components/disclosure/DialogProvider.js +88 -0
  45. package/dist/components/disclosure/DialogProvider.js.map +7 -0
  46. package/dist/components/disclosure/Dropdown.js +244 -0
  47. package/dist/components/disclosure/Dropdown.js.map +7 -0
  48. package/dist/components/disclosure/Tabs.js +75 -0
  49. package/dist/components/disclosure/Tabs.js.map +7 -0
  50. package/dist/components/disclosure/dialogZIndex.js +32 -0
  51. package/dist/components/disclosure/dialogZIndex.js.map +7 -0
  52. package/dist/components/display/Alert.js +18 -0
  53. package/dist/components/display/Alert.js.map +7 -0
  54. package/dist/components/display/Barcode.js +39 -0
  55. package/dist/components/display/Barcode.js.map +7 -0
  56. package/dist/components/display/Card.js +21 -0
  57. package/dist/components/display/Card.js.map +7 -0
  58. package/dist/components/display/Echarts.js +33 -0
  59. package/dist/components/display/Echarts.js.map +7 -0
  60. package/dist/components/display/Icon.js +10 -0
  61. package/dist/components/display/Icon.js.map +7 -0
  62. package/dist/components/display/Tag.js +20 -0
  63. package/dist/components/display/Tag.js.map +7 -0
  64. package/dist/components/feedback/Progress.js +37 -0
  65. package/dist/components/feedback/Progress.js.map +7 -0
  66. package/dist/components/feedback/loading/LoadingContainer.js +83 -0
  67. package/dist/components/feedback/loading/LoadingContainer.js.map +7 -0
  68. package/dist/components/feedback/loading/LoadingContext.js +14 -0
  69. package/dist/components/feedback/loading/LoadingContext.js.map +7 -0
  70. package/dist/components/feedback/loading/LoadingProvider.js +47 -0
  71. package/dist/components/feedback/loading/LoadingProvider.js.map +7 -0
  72. package/dist/components/feedback/notification/NotificationBanner.js +61 -0
  73. package/dist/components/feedback/notification/NotificationBanner.js.map +7 -0
  74. package/dist/components/feedback/notification/NotificationBell.js +85 -0
  75. package/dist/components/feedback/notification/NotificationBell.js.map +7 -0
  76. package/dist/components/feedback/notification/NotificationContext.js +14 -0
  77. package/dist/components/feedback/notification/NotificationContext.js.map +7 -0
  78. package/dist/components/feedback/notification/NotificationProvider.js +101 -0
  79. package/dist/components/feedback/notification/NotificationProvider.js.map +7 -0
  80. package/dist/components/feedback/notification/index.js +5 -0
  81. package/dist/components/feedback/notification/index.js.map +7 -0
  82. package/dist/components/feedback/print/Print.js +12 -0
  83. package/dist/components/feedback/print/Print.js.map +7 -0
  84. package/dist/components/feedback/print/PrintInstanceContext.js +10 -0
  85. package/dist/components/feedback/print/PrintInstanceContext.js.map +7 -0
  86. package/dist/components/form-control/Button.js +74 -0
  87. package/dist/components/form-control/Button.js.map +7 -0
  88. package/dist/components/form-control/DropdownTrigger.styles.js +44 -0
  89. package/dist/components/form-control/DropdownTrigger.styles.js.map +7 -0
  90. package/dist/components/form-control/ThemeToggle.js +57 -0
  91. package/dist/components/form-control/ThemeToggle.js.map +7 -0
  92. package/dist/components/form-control/checkbox/Checkbox.js +78 -0
  93. package/dist/components/form-control/checkbox/Checkbox.js.map +7 -0
  94. package/dist/components/form-control/checkbox/Checkbox.styles.js +57 -0
  95. package/dist/components/form-control/checkbox/Checkbox.styles.js.map +7 -0
  96. package/dist/components/form-control/checkbox/CheckboxGroup.js +65 -0
  97. package/dist/components/form-control/checkbox/CheckboxGroup.js.map +7 -0
  98. package/dist/components/form-control/checkbox/Radio.js +78 -0
  99. package/dist/components/form-control/checkbox/Radio.js.map +7 -0
  100. package/dist/components/form-control/checkbox/RadioGroup.js +60 -0
  101. package/dist/components/form-control/checkbox/RadioGroup.js.map +7 -0
  102. package/dist/components/form-control/color-picker/ColorPicker.js +55 -0
  103. package/dist/components/form-control/color-picker/ColorPicker.js.map +7 -0
  104. package/dist/components/form-control/combobox/Combobox.js +214 -0
  105. package/dist/components/form-control/combobox/Combobox.js.map +7 -0
  106. package/dist/components/form-control/combobox/ComboboxContext.js +14 -0
  107. package/dist/components/form-control/combobox/ComboboxContext.js.map +7 -0
  108. package/dist/components/form-control/combobox/ComboboxItem.js +49 -0
  109. package/dist/components/form-control/combobox/ComboboxItem.js.map +7 -0
  110. package/dist/components/form-control/date-range-picker/DateRangePicker.js +136 -0
  111. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +7 -0
  112. package/dist/components/form-control/editor/EditorToolbar.js +290 -0
  113. package/dist/components/form-control/editor/EditorToolbar.js.map +7 -0
  114. package/dist/components/form-control/editor/RichTextEditor.js +114 -0
  115. package/dist/components/form-control/editor/RichTextEditor.js.map +7 -0
  116. package/dist/components/form-control/field/DatePicker.js +167 -0
  117. package/dist/components/form-control/field/DatePicker.js.map +7 -0
  118. package/dist/components/form-control/field/DateTimePicker.js +168 -0
  119. package/dist/components/form-control/field/DateTimePicker.js.map +7 -0
  120. package/dist/components/form-control/field/Field.styles.js +35 -0
  121. package/dist/components/form-control/field/Field.styles.js.map +7 -0
  122. package/dist/components/form-control/field/NumberInput.js +193 -0
  123. package/dist/components/form-control/field/NumberInput.js.map +7 -0
  124. package/dist/components/form-control/field/TextInput.js +178 -0
  125. package/dist/components/form-control/field/TextInput.js.map +7 -0
  126. package/dist/components/form-control/field/Textarea.js +186 -0
  127. package/dist/components/form-control/field/Textarea.js.map +7 -0
  128. package/dist/components/form-control/field/TimePicker.js +138 -0
  129. package/dist/components/form-control/field/TimePicker.js.map +7 -0
  130. package/dist/components/form-control/numpad/Numpad.js +107 -0
  131. package/dist/components/form-control/numpad/Numpad.js.map +7 -0
  132. package/dist/components/form-control/select/Select.js +196 -0
  133. package/dist/components/form-control/select/Select.js.map +7 -0
  134. package/dist/components/form-control/select/SelectContext.js +14 -0
  135. package/dist/components/form-control/select/SelectContext.js.map +7 -0
  136. package/dist/components/form-control/select/SelectItem.js +65 -0
  137. package/dist/components/form-control/select/SelectItem.js.map +7 -0
  138. package/dist/components/form-control/state-preset/StatePreset.js +195 -0
  139. package/dist/components/form-control/state-preset/StatePreset.js.map +7 -0
  140. package/dist/components/layout/FormGroup.js +34 -0
  141. package/dist/components/layout/FormGroup.js.map +7 -0
  142. package/dist/components/layout/FormTable.js +24 -0
  143. package/dist/components/layout/FormTable.js.map +7 -0
  144. package/dist/components/layout/sidebar/Sidebar.js +63 -0
  145. package/dist/components/layout/sidebar/Sidebar.js.map +7 -0
  146. package/dist/components/layout/sidebar/SidebarContainer.js +70 -0
  147. package/dist/components/layout/sidebar/SidebarContainer.js.map +7 -0
  148. package/dist/components/layout/sidebar/SidebarContext.js +20 -0
  149. package/dist/components/layout/sidebar/SidebarContext.js.map +7 -0
  150. package/dist/components/layout/sidebar/SidebarMenu.js +84 -0
  151. package/dist/components/layout/sidebar/SidebarMenu.js.map +7 -0
  152. package/dist/components/layout/sidebar/SidebarUser.js +51 -0
  153. package/dist/components/layout/sidebar/SidebarUser.js.map +7 -0
  154. package/dist/components/layout/topbar/Topbar.js +48 -0
  155. package/dist/components/layout/topbar/Topbar.js.map +7 -0
  156. package/dist/components/layout/topbar/TopbarContainer.js +13 -0
  157. package/dist/components/layout/topbar/TopbarContainer.js.map +7 -0
  158. package/dist/components/layout/topbar/TopbarMenu.js +106 -0
  159. package/dist/components/layout/topbar/TopbarMenu.js.map +7 -0
  160. package/dist/components/layout/topbar/TopbarUser.js +44 -0
  161. package/dist/components/layout/topbar/TopbarUser.js.map +7 -0
  162. package/dist/core-browser/src/extensions/element-ext.d.ts +98 -0
  163. package/dist/core-browser/src/extensions/element-ext.d.ts.map +1 -0
  164. package/dist/core-browser/src/extensions/html-element-ext.d.ts +54 -0
  165. package/dist/core-browser/src/extensions/html-element-ext.d.ts.map +1 -0
  166. package/dist/core-browser/src/index.d.ts +7 -0
  167. package/dist/core-browser/src/index.d.ts.map +1 -0
  168. package/dist/core-browser/src/utils/blob.d.ts +10 -0
  169. package/dist/core-browser/src/utils/blob.d.ts.map +1 -0
  170. package/dist/core-browser/src/utils/download.d.ts +11 -0
  171. package/dist/core-browser/src/utils/download.d.ts.map +1 -0
  172. package/dist/core-common/src/common.types.d.ts +74 -0
  173. package/dist/core-common/src/common.types.d.ts.map +1 -0
  174. package/dist/core-common/src/env.d.ts +6 -0
  175. package/dist/core-common/src/env.d.ts.map +1 -0
  176. package/dist/core-common/src/errors/argument-error.d.ts +25 -0
  177. package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
  178. package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
  179. package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
  180. package/dist/core-common/src/errors/sd-error.d.ts +27 -0
  181. package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
  182. package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
  183. package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
  184. package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
  185. package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
  186. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
  187. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
  188. package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
  189. package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
  190. package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
  191. package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
  192. package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
  193. package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
  194. package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
  195. package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
  196. package/dist/core-common/src/features/event-emitter.d.ts +66 -0
  197. package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
  198. package/dist/core-common/src/features/serial-queue.d.ts +47 -0
  199. package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
  200. package/dist/core-common/src/index.d.ts +32 -0
  201. package/dist/core-common/src/index.d.ts.map +1 -0
  202. package/dist/core-common/src/types/date-only.d.ts +152 -0
  203. package/dist/core-common/src/types/date-only.d.ts.map +1 -0
  204. package/dist/core-common/src/types/date-time.d.ts +96 -0
  205. package/dist/core-common/src/types/date-time.d.ts.map +1 -0
  206. package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
  207. package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
  208. package/dist/core-common/src/types/time.d.ts +68 -0
  209. package/dist/core-common/src/types/time.d.ts.map +1 -0
  210. package/dist/core-common/src/types/uuid.d.ts +35 -0
  211. package/dist/core-common/src/types/uuid.d.ts.map +1 -0
  212. package/dist/core-common/src/utils/bytes.d.ts +51 -0
  213. package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
  214. package/dist/core-common/src/utils/date-format.d.ts +90 -0
  215. package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
  216. package/dist/core-common/src/utils/json.d.ts +34 -0
  217. package/dist/core-common/src/utils/json.d.ts.map +1 -0
  218. package/dist/core-common/src/utils/num.d.ts +60 -0
  219. package/dist/core-common/src/utils/num.d.ts.map +1 -0
  220. package/dist/core-common/src/utils/obj.d.ts +258 -0
  221. package/dist/core-common/src/utils/obj.d.ts.map +1 -0
  222. package/dist/core-common/src/utils/path.d.ts +23 -0
  223. package/dist/core-common/src/utils/path.d.ts.map +1 -0
  224. package/dist/core-common/src/utils/primitive.d.ts +18 -0
  225. package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
  226. package/dist/core-common/src/utils/str.d.ts +103 -0
  227. package/dist/core-common/src/utils/str.d.ts.map +1 -0
  228. package/dist/core-common/src/utils/template-strings.d.ts +84 -0
  229. package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
  230. package/dist/core-common/src/utils/transferable.d.ts +47 -0
  231. package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
  232. package/dist/core-common/src/utils/wait.d.ts +19 -0
  233. package/dist/core-common/src/utils/wait.d.ts.map +1 -0
  234. package/dist/core-common/src/utils/xml.d.ts +36 -0
  235. package/dist/core-common/src/utils/xml.d.ts.map +1 -0
  236. package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
  237. package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
  238. package/dist/directives/ripple.js +106 -0
  239. package/dist/directives/ripple.js.map +7 -0
  240. package/dist/helpers/createAppStructure.js +96 -0
  241. package/dist/helpers/createAppStructure.js.map +7 -0
  242. package/dist/helpers/mergeStyles.js +27 -0
  243. package/dist/helpers/mergeStyles.js.map +7 -0
  244. package/dist/helpers/splitSlots.js +25 -0
  245. package/dist/helpers/splitSlots.js.map +7 -0
  246. package/dist/hooks/createControllableSignal.js +24 -0
  247. package/dist/hooks/createControllableSignal.js.map +7 -0
  248. package/dist/hooks/createIMEHandler.js +50 -0
  249. package/dist/hooks/createIMEHandler.js.map +7 -0
  250. package/dist/hooks/createMountTransition.js +33 -0
  251. package/dist/hooks/createMountTransition.js.map +7 -0
  252. package/dist/hooks/useClipboardValueCopy.js +121 -0
  253. package/dist/hooks/useClipboardValueCopy.js.map +7 -0
  254. package/dist/hooks/usePersisted.js +25 -0
  255. package/dist/hooks/usePersisted.js.map +7 -0
  256. package/dist/hooks/usePrint.js +208 -0
  257. package/dist/hooks/usePrint.js.map +7 -0
  258. package/dist/hooks/useRouterLink.js +24 -0
  259. package/dist/hooks/useRouterLink.js.map +7 -0
  260. package/dist/index.js +94 -0
  261. package/dist/index.js.map +7 -0
  262. package/dist/orm-common/src/db-context.d.ts +669 -0
  263. package/dist/orm-common/src/db-context.d.ts.map +1 -0
  264. package/dist/orm-common/src/errors/db-transaction-error.d.ts +51 -0
  265. package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +1 -0
  266. package/dist/orm-common/src/exec/executable.d.ts +79 -0
  267. package/dist/orm-common/src/exec/executable.d.ts.map +1 -0
  268. package/dist/orm-common/src/exec/queryable.d.ts +708 -0
  269. package/dist/orm-common/src/exec/queryable.d.ts.map +1 -0
  270. package/dist/orm-common/src/exec/search-parser.d.ts +72 -0
  271. package/dist/orm-common/src/exec/search-parser.d.ts.map +1 -0
  272. package/dist/orm-common/src/expr/expr-unit.d.ts +25 -0
  273. package/dist/orm-common/src/expr/expr-unit.d.ts.map +1 -0
  274. package/dist/orm-common/src/expr/expr.d.ts +1369 -0
  275. package/dist/orm-common/src/expr/expr.d.ts.map +1 -0
  276. package/dist/orm-common/src/index.d.ts +32 -0
  277. package/dist/orm-common/src/index.d.ts.map +1 -0
  278. package/dist/orm-common/src/models/system-migration.d.ts +10 -0
  279. package/dist/orm-common/src/models/system-migration.d.ts.map +1 -0
  280. package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +95 -0
  281. package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +1 -0
  282. package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +66 -0
  283. package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +1 -0
  284. package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +84 -0
  285. package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -0
  286. package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +45 -0
  287. package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +1 -0
  288. package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +84 -0
  289. package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -0
  290. package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +54 -0
  291. package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +1 -0
  292. package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +84 -0
  293. package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -0
  294. package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +52 -0
  295. package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -0
  296. package/dist/orm-common/src/query-builder/query-builder.d.ts +7 -0
  297. package/dist/orm-common/src/query-builder/query-builder.d.ts.map +1 -0
  298. package/dist/orm-common/src/schema/factory/column-builder.d.ts +394 -0
  299. package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +1 -0
  300. package/dist/orm-common/src/schema/factory/index-builder.d.ts +151 -0
  301. package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +1 -0
  302. package/dist/orm-common/src/schema/factory/relation-builder.d.ts +337 -0
  303. package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +1 -0
  304. package/dist/orm-common/src/schema/procedure-builder.d.ts +202 -0
  305. package/dist/orm-common/src/schema/procedure-builder.d.ts.map +1 -0
  306. package/dist/orm-common/src/schema/table-builder.d.ts +259 -0
  307. package/dist/orm-common/src/schema/table-builder.d.ts.map +1 -0
  308. package/dist/orm-common/src/schema/view-builder.d.ts +183 -0
  309. package/dist/orm-common/src/schema/view-builder.d.ts.map +1 -0
  310. package/dist/orm-common/src/types/column.d.ts +172 -0
  311. package/dist/orm-common/src/types/column.d.ts.map +1 -0
  312. package/dist/orm-common/src/types/db.d.ts +175 -0
  313. package/dist/orm-common/src/types/db.d.ts.map +1 -0
  314. package/dist/orm-common/src/types/expr.d.ts +474 -0
  315. package/dist/orm-common/src/types/expr.d.ts.map +1 -0
  316. package/dist/orm-common/src/types/query-def.d.ts +351 -0
  317. package/dist/orm-common/src/types/query-def.d.ts.map +1 -0
  318. package/dist/orm-common/src/utils/result-parser.d.ts +38 -0
  319. package/dist/orm-common/src/utils/result-parser.d.ts.map +1 -0
  320. package/dist/providers/ConfigContext.js +14 -0
  321. package/dist/providers/ConfigContext.js.map +7 -0
  322. package/dist/providers/InitializeProvider.js +10 -0
  323. package/dist/providers/InitializeProvider.js.map +7 -0
  324. package/dist/providers/ServiceClientContext.js +16 -0
  325. package/dist/providers/ServiceClientContext.js.map +7 -0
  326. package/dist/providers/ServiceClientProvider.js +116 -0
  327. package/dist/providers/ServiceClientProvider.js.map +7 -0
  328. package/dist/providers/ThemeContext.js +48 -0
  329. package/dist/providers/ThemeContext.js.map +7 -0
  330. package/dist/providers/shared-data/SharedDataChangeEvent.js +8 -0
  331. package/dist/providers/shared-data/SharedDataChangeEvent.js.map +7 -0
  332. package/dist/providers/shared-data/SharedDataContext.js +16 -0
  333. package/dist/providers/shared-data/SharedDataContext.js.map +7 -0
  334. package/dist/providers/shared-data/SharedDataProvider.js +115 -0
  335. package/dist/providers/shared-data/SharedDataProvider.js.map +7 -0
  336. package/dist/service-client/src/features/event-client.d.ts +14 -0
  337. package/dist/service-client/src/features/event-client.d.ts.map +1 -0
  338. package/dist/service-client/src/features/file-client.d.ts +13 -0
  339. package/dist/service-client/src/features/file-client.d.ts.map +1 -0
  340. package/dist/service-client/src/features/orm/orm-client-connector.d.ts +10 -0
  341. package/dist/service-client/src/features/orm/orm-client-connector.d.ts.map +1 -0
  342. package/dist/service-client/src/features/orm/orm-client-db-context-executor.d.ts +26 -0
  343. package/dist/service-client/src/features/orm/orm-client-db-context-executor.d.ts.map +1 -0
  344. package/dist/service-client/src/features/orm/orm-connect-config.d.ts +13 -0
  345. package/dist/service-client/src/features/orm/orm-connect-config.d.ts.map +1 -0
  346. package/dist/service-client/src/index.d.ts +12 -0
  347. package/dist/service-client/src/index.d.ts.map +1 -0
  348. package/dist/service-client/src/protocol/client-protocol-wrapper.d.ts +23 -0
  349. package/dist/service-client/src/protocol/client-protocol-wrapper.d.ts.map +1 -0
  350. package/dist/service-client/src/service-client.d.ts +41 -0
  351. package/dist/service-client/src/service-client.d.ts.map +1 -0
  352. package/dist/service-client/src/transport/service-transport.d.ts +24 -0
  353. package/dist/service-client/src/transport/service-transport.d.ts.map +1 -0
  354. package/dist/service-client/src/transport/socket-provider.d.ts +31 -0
  355. package/dist/service-client/src/transport/socket-provider.d.ts.map +1 -0
  356. package/dist/service-client/src/types/connection-config.d.ts +8 -0
  357. package/dist/service-client/src/types/connection-config.d.ts.map +1 -0
  358. package/dist/service-client/src/types/progress.types.d.ts +10 -0
  359. package/dist/service-client/src/types/progress.types.d.ts.map +1 -0
  360. package/dist/service-common/src/index.d.ts +8 -0
  361. package/dist/service-common/src/index.d.ts.map +1 -0
  362. package/dist/service-common/src/protocol/protocol.types.d.ts +100 -0
  363. package/dist/service-common/src/protocol/protocol.types.d.ts.map +1 -0
  364. package/dist/service-common/src/protocol/service-protocol.d.ts +63 -0
  365. package/dist/service-common/src/protocol/service-protocol.d.ts.map +1 -0
  366. package/dist/service-common/src/service-types/auto-update-service.types.d.ts +17 -0
  367. package/dist/service-common/src/service-types/auto-update-service.types.d.ts.map +1 -0
  368. package/dist/service-common/src/service-types/crypto-service.types.d.ts +22 -0
  369. package/dist/service-common/src/service-types/crypto-service.types.d.ts.map +1 -0
  370. package/dist/service-common/src/service-types/orm-service.types.d.ts +30 -0
  371. package/dist/service-common/src/service-types/orm-service.types.d.ts.map +1 -0
  372. package/dist/service-common/src/service-types/smtp-service.types.d.ts +55 -0
  373. package/dist/service-common/src/service-types/smtp-service.types.d.ts.map +1 -0
  374. package/dist/service-common/src/types.d.ts +43 -0
  375. package/dist/service-common/src/types.d.ts.map +1 -0
  376. package/dist/solid/src/components/data/Pagination.d.ts +12 -0
  377. package/dist/solid/src/components/data/Pagination.d.ts.map +1 -0
  378. package/dist/solid/src/components/data/Table.d.ts +6 -0
  379. package/dist/solid/src/components/data/Table.d.ts.map +1 -0
  380. package/dist/solid/src/components/data/calendar/Calendar.d.ts +15 -0
  381. package/dist/solid/src/components/data/calendar/Calendar.d.ts.map +1 -0
  382. package/dist/solid/src/components/data/kanban/Kanban.d.ts +38 -0
  383. package/dist/solid/src/components/data/kanban/Kanban.d.ts.map +1 -0
  384. package/dist/solid/src/components/data/kanban/KanbanContext.d.ts +40 -0
  385. package/dist/solid/src/components/data/kanban/KanbanContext.d.ts.map +1 -0
  386. package/dist/solid/src/components/data/list/List.d.ts +36 -0
  387. package/dist/solid/src/components/data/list/List.d.ts.map +1 -0
  388. package/dist/solid/src/components/data/list/ListContext.d.ts +9 -0
  389. package/dist/solid/src/components/data/list/ListContext.d.ts.map +1 -0
  390. package/dist/solid/src/components/data/list/ListItem.d.ts +88 -0
  391. package/dist/solid/src/components/data/list/ListItem.d.ts.map +1 -0
  392. package/dist/solid/src/components/data/list/ListItem.styles.d.ts +10 -0
  393. package/dist/solid/src/components/data/list/ListItem.styles.d.ts.map +1 -0
  394. package/dist/solid/src/components/data/permission-table/PermissionTable.d.ts +26 -0
  395. package/dist/solid/src/components/data/permission-table/PermissionTable.d.ts.map +1 -0
  396. package/dist/solid/src/components/data/sheet/DataSheet.d.ts +12 -0
  397. package/dist/solid/src/components/data/sheet/DataSheet.d.ts.map +1 -0
  398. package/dist/solid/src/components/data/sheet/DataSheet.styles.d.ts +33 -0
  399. package/dist/solid/src/components/data/sheet/DataSheet.styles.d.ts.map +1 -0
  400. package/dist/solid/src/components/data/sheet/DataSheetColumn.d.ts +5 -0
  401. package/dist/solid/src/components/data/sheet/DataSheetColumn.d.ts.map +1 -0
  402. package/dist/solid/src/components/data/sheet/DataSheetConfigDialog.d.ts +8 -0
  403. package/dist/solid/src/components/data/sheet/DataSheetConfigDialog.d.ts.map +1 -0
  404. package/dist/solid/src/components/data/sheet/sheetUtils.d.ts +7 -0
  405. package/dist/solid/src/components/data/sheet/sheetUtils.d.ts.map +1 -0
  406. package/dist/solid/src/components/data/sheet/types.d.ts +113 -0
  407. package/dist/solid/src/components/data/sheet/types.d.ts.map +1 -0
  408. package/dist/solid/src/components/disclosure/Collapse.d.ts +21 -0
  409. package/dist/solid/src/components/disclosure/Collapse.d.ts.map +1 -0
  410. package/dist/solid/src/components/disclosure/Dialog.d.ts +65 -0
  411. package/dist/solid/src/components/disclosure/Dialog.d.ts.map +1 -0
  412. package/dist/solid/src/components/disclosure/DialogContext.d.ts +30 -0
  413. package/dist/solid/src/components/disclosure/DialogContext.d.ts.map +1 -0
  414. package/dist/solid/src/components/disclosure/DialogInstanceContext.d.ts +6 -0
  415. package/dist/solid/src/components/disclosure/DialogInstanceContext.d.ts.map +1 -0
  416. package/dist/solid/src/components/disclosure/DialogProvider.d.ts +19 -0
  417. package/dist/solid/src/components/disclosure/DialogProvider.d.ts.map +1 -0
  418. package/dist/solid/src/components/disclosure/Dropdown.d.ts +65 -0
  419. package/dist/solid/src/components/disclosure/Dropdown.d.ts.map +1 -0
  420. package/dist/solid/src/components/disclosure/Tabs.d.ts +24 -0
  421. package/dist/solid/src/components/disclosure/Tabs.d.ts.map +1 -0
  422. package/dist/solid/src/components/disclosure/dialogZIndex.d.ts +13 -0
  423. package/dist/solid/src/components/disclosure/dialogZIndex.d.ts.map +1 -0
  424. package/dist/solid/src/components/display/Alert.d.ts +8 -0
  425. package/dist/solid/src/components/display/Alert.d.ts.map +1 -0
  426. package/dist/solid/src/components/display/Barcode.d.ts +8 -0
  427. package/dist/solid/src/components/display/Barcode.d.ts.map +1 -0
  428. package/dist/solid/src/components/display/Card.d.ts +6 -0
  429. package/dist/solid/src/components/display/Card.d.ts.map +1 -0
  430. package/dist/solid/src/components/display/Echarts.d.ts +8 -0
  431. package/dist/solid/src/components/display/Echarts.d.ts.map +1 -0
  432. package/dist/solid/src/components/display/Icon.d.ts +8 -0
  433. package/dist/solid/src/components/display/Icon.d.ts.map +1 -0
  434. package/dist/solid/src/components/display/Tag.d.ts +8 -0
  435. package/dist/solid/src/components/display/Tag.d.ts.map +1 -0
  436. package/dist/solid/src/components/feedback/Progress.d.ts +12 -0
  437. package/dist/solid/src/components/feedback/Progress.d.ts.map +1 -0
  438. package/dist/solid/src/components/feedback/loading/LoadingContainer.d.ts +12 -0
  439. package/dist/solid/src/components/feedback/loading/LoadingContainer.d.ts.map +1 -0
  440. package/dist/solid/src/components/feedback/loading/LoadingContext.d.ts +11 -0
  441. package/dist/solid/src/components/feedback/loading/LoadingContext.d.ts.map +1 -0
  442. package/dist/solid/src/components/feedback/loading/LoadingProvider.d.ts +7 -0
  443. package/dist/solid/src/components/feedback/loading/LoadingProvider.d.ts.map +1 -0
  444. package/dist/solid/src/components/feedback/notification/NotificationBanner.d.ts +3 -0
  445. package/dist/solid/src/components/feedback/notification/NotificationBanner.d.ts.map +1 -0
  446. package/dist/solid/src/components/feedback/notification/NotificationBell.d.ts +6 -0
  447. package/dist/solid/src/components/feedback/notification/NotificationBell.d.ts.map +1 -0
  448. package/dist/solid/src/components/feedback/notification/NotificationContext.d.ts +39 -0
  449. package/dist/solid/src/components/feedback/notification/NotificationContext.d.ts.map +1 -0
  450. package/dist/solid/src/components/feedback/notification/NotificationProvider.d.ts +3 -0
  451. package/dist/solid/src/components/feedback/notification/NotificationProvider.d.ts.map +1 -0
  452. package/dist/solid/src/components/feedback/notification/index.d.ts +5 -0
  453. package/dist/solid/src/components/feedback/notification/index.d.ts.map +1 -0
  454. package/dist/solid/src/components/feedback/print/Print.d.ts +9 -0
  455. package/dist/solid/src/components/feedback/print/Print.d.ts.map +1 -0
  456. package/dist/solid/src/components/feedback/print/PrintInstanceContext.d.ts +6 -0
  457. package/dist/solid/src/components/feedback/print/PrintInstanceContext.d.ts.map +1 -0
  458. package/dist/solid/src/components/form-control/Button.d.ts +14 -0
  459. package/dist/solid/src/components/form-control/Button.d.ts.map +1 -0
  460. package/dist/solid/src/components/form-control/DropdownTrigger.styles.d.ts +14 -0
  461. package/dist/solid/src/components/form-control/DropdownTrigger.styles.d.ts.map +1 -0
  462. package/dist/solid/src/components/form-control/ThemeToggle.d.ts +25 -0
  463. package/dist/solid/src/components/form-control/ThemeToggle.d.ts.map +1 -0
  464. package/dist/solid/src/components/form-control/checkbox/Checkbox.d.ts +16 -0
  465. package/dist/solid/src/components/form-control/checkbox/Checkbox.d.ts.map +1 -0
  466. package/dist/solid/src/components/form-control/checkbox/Checkbox.styles.d.ts +12 -0
  467. package/dist/solid/src/components/form-control/checkbox/Checkbox.styles.d.ts.map +1 -0
  468. package/dist/solid/src/components/form-control/checkbox/CheckboxGroup.d.ts +27 -0
  469. package/dist/solid/src/components/form-control/checkbox/CheckboxGroup.d.ts.map +1 -0
  470. package/dist/solid/src/components/form-control/checkbox/Radio.d.ts +16 -0
  471. package/dist/solid/src/components/form-control/checkbox/Radio.d.ts.map +1 -0
  472. package/dist/solid/src/components/form-control/checkbox/RadioGroup.d.ts +27 -0
  473. package/dist/solid/src/components/form-control/checkbox/RadioGroup.d.ts.map +1 -0
  474. package/dist/solid/src/components/form-control/color-picker/ColorPicker.d.ts +29 -0
  475. package/dist/solid/src/components/form-control/color-picker/ColorPicker.d.ts.map +1 -0
  476. package/dist/solid/src/components/form-control/combobox/Combobox.d.ts +80 -0
  477. package/dist/solid/src/components/form-control/combobox/Combobox.d.ts.map +1 -0
  478. package/dist/solid/src/components/form-control/combobox/ComboboxContext.d.ts +11 -0
  479. package/dist/solid/src/components/form-control/combobox/ComboboxContext.d.ts.map +1 -0
  480. package/dist/solid/src/components/form-control/combobox/ComboboxItem.d.ts +12 -0
  481. package/dist/solid/src/components/form-control/combobox/ComboboxItem.d.ts.map +1 -0
  482. package/dist/solid/src/components/form-control/date-range-picker/DateRangePicker.d.ts +55 -0
  483. package/dist/solid/src/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -0
  484. package/dist/solid/src/components/form-control/editor/EditorToolbar.d.ts +8 -0
  485. package/dist/solid/src/components/form-control/editor/EditorToolbar.d.ts.map +1 -0
  486. package/dist/solid/src/components/form-control/editor/RichTextEditor.d.ts +21 -0
  487. package/dist/solid/src/components/form-control/editor/RichTextEditor.d.ts.map +1 -0
  488. package/dist/solid/src/components/form-control/field/DatePicker.d.ts +61 -0
  489. package/dist/solid/src/components/form-control/field/DatePicker.d.ts.map +1 -0
  490. package/dist/solid/src/components/form-control/field/DateTimePicker.d.ts +58 -0
  491. package/dist/solid/src/components/form-control/field/DateTimePicker.d.ts.map +1 -0
  492. package/dist/solid/src/components/form-control/field/Field.styles.d.ts +13 -0
  493. package/dist/solid/src/components/form-control/field/Field.styles.d.ts.map +1 -0
  494. package/dist/solid/src/components/form-control/field/NumberInput.d.ts +47 -0
  495. package/dist/solid/src/components/form-control/field/NumberInput.d.ts.map +1 -0
  496. package/dist/solid/src/components/form-control/field/TextInput.d.ts +51 -0
  497. package/dist/solid/src/components/form-control/field/TextInput.d.ts.map +1 -0
  498. package/dist/solid/src/components/form-control/field/Textarea.d.ts +42 -0
  499. package/dist/solid/src/components/form-control/field/Textarea.d.ts.map +1 -0
  500. package/dist/solid/src/components/form-control/field/TimePicker.d.ts +46 -0
  501. package/dist/solid/src/components/form-control/field/TimePicker.d.ts.map +1 -0
  502. package/dist/solid/src/components/form-control/numpad/Numpad.d.ts +28 -0
  503. package/dist/solid/src/components/form-control/numpad/Numpad.d.ts.map +1 -0
  504. package/dist/solid/src/components/form-control/select/Select.d.ts +104 -0
  505. package/dist/solid/src/components/form-control/select/Select.d.ts.map +1 -0
  506. package/dist/solid/src/components/form-control/select/SelectContext.d.ts +14 -0
  507. package/dist/solid/src/components/form-control/select/SelectContext.d.ts.map +1 -0
  508. package/dist/solid/src/components/form-control/select/SelectItem.d.ts +33 -0
  509. package/dist/solid/src/components/form-control/select/SelectItem.d.ts.map +1 -0
  510. package/dist/solid/src/components/form-control/state-preset/StatePreset.d.ts +14 -0
  511. package/dist/solid/src/components/form-control/state-preset/StatePreset.d.ts.map +1 -0
  512. package/dist/solid/src/components/layout/FormGroup.d.ts +14 -0
  513. package/dist/solid/src/components/layout/FormGroup.d.ts.map +1 -0
  514. package/dist/solid/src/components/layout/FormTable.d.ts +5 -0
  515. package/dist/solid/src/components/layout/FormTable.d.ts.map +1 -0
  516. package/dist/solid/src/components/layout/sidebar/Sidebar.d.ts +35 -0
  517. package/dist/solid/src/components/layout/sidebar/Sidebar.d.ts.map +1 -0
  518. package/dist/solid/src/components/layout/sidebar/SidebarContainer.d.ts +34 -0
  519. package/dist/solid/src/components/layout/sidebar/SidebarContainer.d.ts.map +1 -0
  520. package/dist/solid/src/components/layout/sidebar/SidebarContext.d.ts +28 -0
  521. package/dist/solid/src/components/layout/sidebar/SidebarContext.d.ts.map +1 -0
  522. package/dist/solid/src/components/layout/sidebar/SidebarMenu.d.ts +41 -0
  523. package/dist/solid/src/components/layout/sidebar/SidebarMenu.d.ts.map +1 -0
  524. package/dist/solid/src/components/layout/sidebar/SidebarUser.d.ts +36 -0
  525. package/dist/solid/src/components/layout/sidebar/SidebarUser.d.ts.map +1 -0
  526. package/dist/solid/src/components/layout/topbar/Topbar.d.ts +35 -0
  527. package/dist/solid/src/components/layout/topbar/Topbar.d.ts.map +1 -0
  528. package/dist/solid/src/components/layout/topbar/TopbarContainer.d.ts +25 -0
  529. package/dist/solid/src/components/layout/topbar/TopbarContainer.d.ts.map +1 -0
  530. package/dist/solid/src/components/layout/topbar/TopbarMenu.d.ts +41 -0
  531. package/dist/solid/src/components/layout/topbar/TopbarMenu.d.ts.map +1 -0
  532. package/dist/solid/src/components/layout/topbar/TopbarUser.d.ts +35 -0
  533. package/dist/solid/src/components/layout/topbar/TopbarUser.d.ts.map +1 -0
  534. package/dist/solid/src/directives/ripple.d.ts +24 -0
  535. package/dist/solid/src/directives/ripple.d.ts.map +1 -0
  536. package/dist/solid/src/helpers/createAppStructure.d.ts +52 -0
  537. package/dist/solid/src/helpers/createAppStructure.d.ts.map +1 -0
  538. package/dist/solid/src/helpers/mergeStyles.d.ts +27 -0
  539. package/dist/solid/src/helpers/mergeStyles.d.ts.map +1 -0
  540. package/dist/solid/src/helpers/splitSlots.d.ts +25 -0
  541. package/dist/solid/src/helpers/splitSlots.d.ts.map +1 -0
  542. package/dist/solid/src/hooks/createControllableSignal.d.ts +40 -0
  543. package/dist/solid/src/hooks/createControllableSignal.d.ts.map +1 -0
  544. package/dist/solid/src/hooks/createIMEHandler.d.ts +20 -0
  545. package/dist/solid/src/hooks/createIMEHandler.d.ts.map +1 -0
  546. package/dist/solid/src/hooks/createMountTransition.d.ts +14 -0
  547. package/dist/solid/src/hooks/createMountTransition.d.ts.map +1 -0
  548. package/dist/solid/src/hooks/useClipboardValueCopy.d.ts +15 -0
  549. package/dist/solid/src/hooks/useClipboardValueCopy.d.ts.map +1 -0
  550. package/dist/solid/src/hooks/usePersisted.d.ts +26 -0
  551. package/dist/solid/src/hooks/usePersisted.d.ts.map +1 -0
  552. package/dist/solid/src/hooks/usePrint.d.ts +11 -0
  553. package/dist/solid/src/hooks/usePrint.d.ts.map +1 -0
  554. package/dist/solid/src/hooks/useRouterLink.d.ts +38 -0
  555. package/dist/solid/src/hooks/useRouterLink.d.ts.map +1 -0
  556. package/dist/solid/src/index.d.ts +85 -0
  557. package/dist/solid/src/index.d.ts.map +1 -0
  558. package/dist/solid/src/providers/ConfigContext.d.ts +48 -0
  559. package/dist/solid/src/providers/ConfigContext.d.ts.map +1 -0
  560. package/dist/solid/src/providers/InitializeProvider.d.ts +23 -0
  561. package/dist/solid/src/providers/InitializeProvider.d.ts.map +1 -0
  562. package/dist/solid/src/providers/ServiceClientContext.d.ts +10 -0
  563. package/dist/solid/src/providers/ServiceClientContext.d.ts.map +1 -0
  564. package/dist/solid/src/providers/ServiceClientProvider.d.ts +3 -0
  565. package/dist/solid/src/providers/ServiceClientProvider.d.ts.map +1 -0
  566. package/dist/solid/src/providers/ThemeContext.d.ts +65 -0
  567. package/dist/solid/src/providers/ThemeContext.d.ts.map +1 -0
  568. package/dist/solid/src/providers/shared-data/SharedDataChangeEvent.d.ts +8 -0
  569. package/dist/solid/src/providers/shared-data/SharedDataChangeEvent.d.ts.map +1 -0
  570. package/dist/solid/src/providers/shared-data/SharedDataContext.d.ts +22 -0
  571. package/dist/solid/src/providers/shared-data/SharedDataContext.d.ts.map +1 -0
  572. package/dist/solid/src/providers/shared-data/SharedDataProvider.d.ts +9 -0
  573. package/dist/solid/src/providers/shared-data/SharedDataProvider.d.ts.map +1 -0
  574. package/dist/solid/src/styles/patterns.styles.d.ts +6 -0
  575. package/dist/solid/src/styles/patterns.styles.d.ts.map +1 -0
  576. package/dist/solid/src/styles/tokens.styles.d.ts +20 -0
  577. package/dist/solid/src/styles/tokens.styles.d.ts.map +1 -0
  578. package/dist/styles/patterns.styles.js +30 -0
  579. package/dist/styles/patterns.styles.js.map +7 -0
  580. package/dist/styles/tokens.styles.js +72 -0
  581. package/dist/styles/tokens.styles.js.map +7 -0
  582. package/package.json +56 -0
  583. package/src/base.css +78 -0
  584. package/src/components/data/Pagination.tsx +112 -0
  585. package/src/components/data/Table.tsx +43 -0
  586. package/src/components/data/calendar/Calendar.tsx +139 -0
  587. package/src/components/data/kanban/Kanban.css +10 -0
  588. package/src/components/data/kanban/Kanban.tsx +547 -0
  589. package/src/components/data/kanban/KanbanContext.ts +71 -0
  590. package/src/components/data/list/List.tsx +184 -0
  591. package/src/components/data/list/ListContext.ts +12 -0
  592. package/src/components/data/list/ListItem.styles.ts +49 -0
  593. package/src/components/data/list/ListItem.tsx +222 -0
  594. package/src/components/data/permission-table/PermissionTable.tsx +291 -0
  595. package/src/components/data/sheet/DataSheet.css +26 -0
  596. package/src/components/data/sheet/DataSheet.styles.ts +161 -0
  597. package/src/components/data/sheet/DataSheet.tsx +1198 -0
  598. package/src/components/data/sheet/DataSheetColumn.tsx +29 -0
  599. package/src/components/data/sheet/DataSheetConfigDialog.tsx +146 -0
  600. package/src/components/data/sheet/sheetUtils.ts +156 -0
  601. package/src/components/data/sheet/types.ts +143 -0
  602. package/src/components/disclosure/Collapse.tsx +72 -0
  603. package/src/components/disclosure/Dialog.tsx +520 -0
  604. package/src/components/disclosure/DialogContext.ts +39 -0
  605. package/src/components/disclosure/DialogInstanceContext.ts +11 -0
  606. package/src/components/disclosure/DialogProvider.tsx +133 -0
  607. package/src/components/disclosure/Dropdown.tsx +406 -0
  608. package/src/components/disclosure/Tabs.tsx +127 -0
  609. package/src/components/disclosure/dialogZIndex.ts +43 -0
  610. package/src/components/display/Alert.tsx +32 -0
  611. package/src/components/display/Barcode.tsx +158 -0
  612. package/src/components/display/Card.css +14 -0
  613. package/src/components/display/Card.tsx +26 -0
  614. package/src/components/display/Echarts.tsx +45 -0
  615. package/src/components/display/Icon.tsx +13 -0
  616. package/src/components/display/Tag.tsx +31 -0
  617. package/src/components/feedback/Progress.tsx +61 -0
  618. package/src/components/feedback/loading/LoadingContainer.css +19 -0
  619. package/src/components/feedback/loading/LoadingContainer.tsx +132 -0
  620. package/src/components/feedback/loading/LoadingContext.ts +20 -0
  621. package/src/components/feedback/loading/LoadingProvider.tsx +58 -0
  622. package/src/components/feedback/notification/NotificationBanner.tsx +83 -0
  623. package/src/components/feedback/notification/NotificationBell.tsx +132 -0
  624. package/src/components/feedback/notification/NotificationContext.ts +65 -0
  625. package/src/components/feedback/notification/NotificationProvider.tsx +143 -0
  626. package/src/components/feedback/notification/index.ts +4 -0
  627. package/src/components/feedback/print/Print.tsx +21 -0
  628. package/src/components/feedback/print/PrintInstanceContext.ts +11 -0
  629. package/src/components/form-control/Button.tsx +90 -0
  630. package/src/components/form-control/DropdownTrigger.styles.ts +47 -0
  631. package/src/components/form-control/ThemeToggle.tsx +96 -0
  632. package/src/components/form-control/checkbox/Checkbox.styles.ts +66 -0
  633. package/src/components/form-control/checkbox/Checkbox.tsx +106 -0
  634. package/src/components/form-control/checkbox/CheckboxGroup.tsx +116 -0
  635. package/src/components/form-control/checkbox/Radio.tsx +107 -0
  636. package/src/components/form-control/checkbox/RadioGroup.tsx +111 -0
  637. package/src/components/form-control/color-picker/ColorPicker.tsx +96 -0
  638. package/src/components/form-control/combobox/Combobox.tsx +390 -0
  639. package/src/components/form-control/combobox/ComboboxContext.ts +22 -0
  640. package/src/components/form-control/combobox/ComboboxItem.tsx +69 -0
  641. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +215 -0
  642. package/src/components/form-control/editor/EditorToolbar.tsx +348 -0
  643. package/src/components/form-control/editor/RichTextEditor.tsx +173 -0
  644. package/src/components/form-control/editor/editor.css +81 -0
  645. package/src/components/form-control/field/DatePicker.tsx +268 -0
  646. package/src/components/form-control/field/DateTimePicker.tsx +260 -0
  647. package/src/components/form-control/field/Field.styles.ts +42 -0
  648. package/src/components/form-control/field/NumberInput.tsx +328 -0
  649. package/src/components/form-control/field/TextInput.tsx +287 -0
  650. package/src/components/form-control/field/Textarea.tsx +262 -0
  651. package/src/components/form-control/field/TimePicker.tsx +215 -0
  652. package/src/components/form-control/numpad/Numpad.tsx +218 -0
  653. package/src/components/form-control/select/Select.tsx +404 -0
  654. package/src/components/form-control/select/SelectContext.ts +25 -0
  655. package/src/components/form-control/select/SelectItem.tsx +124 -0
  656. package/src/components/form-control/state-preset/StatePreset.tsx +277 -0
  657. package/src/components/layout/FormGroup.tsx +63 -0
  658. package/src/components/layout/FormTable.tsx +29 -0
  659. package/src/components/layout/sidebar/Sidebar.tsx +104 -0
  660. package/src/components/layout/sidebar/SidebarContainer.tsx +115 -0
  661. package/src/components/layout/sidebar/SidebarContext.ts +40 -0
  662. package/src/components/layout/sidebar/SidebarMenu.tsx +181 -0
  663. package/src/components/layout/sidebar/SidebarUser.tsx +107 -0
  664. package/src/components/layout/topbar/Topbar.tsx +93 -0
  665. package/src/components/layout/topbar/TopbarContainer.tsx +40 -0
  666. package/src/components/layout/topbar/TopbarMenu.tsx +206 -0
  667. package/src/components/layout/topbar/TopbarUser.tsx +96 -0
  668. package/src/directives/ripple.ts +151 -0
  669. package/src/helpers/createAppStructure.ts +183 -0
  670. package/src/helpers/mergeStyles.ts +55 -0
  671. package/src/helpers/splitSlots.ts +48 -0
  672. package/src/hooks/createControllableSignal.ts +63 -0
  673. package/src/hooks/createIMEHandler.ts +65 -0
  674. package/src/hooks/createMountTransition.ts +45 -0
  675. package/src/hooks/useClipboardValueCopy.ts +177 -0
  676. package/src/hooks/usePersisted.ts +51 -0
  677. package/src/hooks/usePrint.ts +277 -0
  678. package/src/hooks/useRouterLink.ts +64 -0
  679. package/src/index.ts +117 -0
  680. package/src/providers/ConfigContext.ts +59 -0
  681. package/src/providers/InitializeProvider.tsx +28 -0
  682. package/src/providers/ServiceClientContext.ts +21 -0
  683. package/src/providers/ServiceClientProvider.tsx +132 -0
  684. package/src/providers/ThemeContext.tsx +121 -0
  685. package/src/providers/shared-data/SharedDataChangeEvent.ts +8 -0
  686. package/src/providers/shared-data/SharedDataContext.ts +34 -0
  687. package/src/providers/shared-data/SharedDataProvider.tsx +149 -0
  688. package/src/styles/patterns.styles.ts +32 -0
  689. package/src/styles/tokens.styles.ts +83 -0
  690. package/tailwind.config.ts +50 -0
  691. package/tests/components/data/List.spec.tsx +683 -0
  692. package/tests/components/data/Pagination.spec.tsx +317 -0
  693. package/tests/components/data/Table.spec.tsx +55 -0
  694. package/tests/components/data/kanban/Kanban.selection.spec.tsx +209 -0
  695. package/tests/components/data/permission-table/PermissionTable.spec.tsx +280 -0
  696. package/tests/components/data/sheet/DataSheet.spec.tsx +564 -0
  697. package/tests/components/disclosure/Collapse.spec.tsx +162 -0
  698. package/tests/components/disclosure/Dialog.spec.tsx +319 -0
  699. package/tests/components/disclosure/DialogProvider.spec.tsx +110 -0
  700. package/tests/components/disclosure/Dropdown.spec.tsx +410 -0
  701. package/tests/components/disclosure/Tabs.spec.tsx +220 -0
  702. package/tests/components/display/Alert.spec.tsx +47 -0
  703. package/tests/components/display/Barcode.spec.tsx +61 -0
  704. package/tests/components/display/Card.spec.tsx +41 -0
  705. package/tests/components/display/Tag.spec.tsx +47 -0
  706. package/tests/components/feedback/notification/LiveRegion.spec.tsx +41 -0
  707. package/tests/components/feedback/notification/NotificationBanner.spec.tsx +164 -0
  708. package/tests/components/feedback/notification/NotificationBell.spec.tsx +207 -0
  709. package/tests/components/feedback/notification/NotificationContext.spec.tsx +331 -0
  710. package/tests/components/feedback/print/Print.spec.tsx +45 -0
  711. package/tests/components/form-control/Button.spec.tsx +119 -0
  712. package/tests/components/form-control/checkbox/Checkbox.spec.tsx +120 -0
  713. package/tests/components/form-control/checkbox/Radio.spec.tsx +112 -0
  714. package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +67 -0
  715. package/tests/components/form-control/combobox/Combobox.spec.tsx +174 -0
  716. package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +85 -0
  717. package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +172 -0
  718. package/tests/components/form-control/field/DatePicker.spec.tsx +305 -0
  719. package/tests/components/form-control/field/DateTimePicker.spec.tsx +287 -0
  720. package/tests/components/form-control/field/NumberInput.spec.tsx +276 -0
  721. package/tests/components/form-control/field/TextInput.spec.tsx +258 -0
  722. package/tests/components/form-control/field/Textarea.spec.tsx +181 -0
  723. package/tests/components/form-control/field/TimePicker.spec.tsx +243 -0
  724. package/tests/components/form-control/numpad/Numpad.spec.tsx +238 -0
  725. package/tests/components/form-control/select/Select.spec.tsx +239 -0
  726. package/tests/components/form-control/select/SelectItem.spec.tsx +149 -0
  727. package/tests/components/layout/FormGroup.spec.tsx +104 -0
  728. package/tests/components/layout/FormTable.spec.tsx +43 -0
  729. package/tests/components/layout/sidebar/Sidebar.spec.tsx +190 -0
  730. package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +203 -0
  731. package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +213 -0
  732. package/tests/components/layout/sidebar/SidebarUser.spec.tsx +171 -0
  733. package/tests/directives/ripple.spec.tsx +130 -0
  734. package/tests/helpers/createAppStructure.spec.tsx +338 -0
  735. package/tests/helpers/mergeStyles.spec.ts +163 -0
  736. package/tests/helpers/splitSlots.spec.tsx +188 -0
  737. package/tests/hooks/createControllableSignal.spec.ts +194 -0
  738. package/tests/hooks/createIMEHandler.spec.ts +80 -0
  739. package/tests/hooks/createMountTransition.spec.ts +86 -0
  740. package/tests/hooks/usePersisted.spec.tsx +191 -0
  741. package/tests/hooks/usePrint.spec.tsx +123 -0
  742. package/tests/hooks/useRouterLink.spec.tsx +183 -0
  743. package/tests/providers/ConfigContext.spec.ts +40 -0
  744. package/tests/providers/ServiceClientContext.spec.tsx +83 -0
  745. package/tests/providers/shared-data/SharedDataProvider.spec.tsx +233 -0
package/README.md ADDED
@@ -0,0 +1,1652 @@
1
+ # @simplysm/solid
2
+
3
+ A SolidJS UI component library for enterprise back-office applications such as ERP and MES. Provides components for data-intensive forms, tables, and sidebar layouts with Tailwind CSS styling, dark mode, and responsive design.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @simplysm/solid
9
+ ```
10
+
11
+ **Peer Dependencies:**
12
+ - `solid-js` ^1.9
13
+ - `tailwindcss` ^3.4
14
+
15
+ **Optional Peer Dependencies:**
16
+ - `echarts` ^6.0 -- Required for Echarts chart components
17
+
18
+ ## Configuration
19
+
20
+ ### Tailwind CSS
21
+
22
+ `@simplysm/solid` provides a Tailwind CSS preset. Register it as a preset in your app's `tailwind.config.ts` to automatically apply custom themes including semantic colors, field sizes, and z-index values.
23
+
24
+ ```typescript
25
+ // tailwind.config.ts
26
+ import simplysmPreset from "@simplysm/solid/tailwind.config";
27
+
28
+ export default {
29
+ darkMode: "class",
30
+ presets: [simplysmPreset],
31
+ content: [
32
+ "./src/**/*.{ts,tsx}",
33
+ ...simplysmPreset.content,
34
+ ],
35
+ };
36
+ ```
37
+
38
+ ### Provider Setup
39
+
40
+ Wrap your app root with `InitializeProvider` and `ThemeProvider`. `InitializeProvider` provides app-wide configuration (clientName, storage), and `ThemeProvider` manages dark mode state.
41
+
42
+ ```tsx
43
+ import { InitializeProvider, ThemeProvider } from "@simplysm/solid";
44
+
45
+ function App() {
46
+ return (
47
+ <InitializeProvider config={{ clientName: "my-app" }}>
48
+ <ThemeProvider>
49
+ {/* app content */}
50
+ </ThemeProvider>
51
+ </InitializeProvider>
52
+ );
53
+ }
54
+ ```
55
+
56
+ Alternatively, you can use `ConfigContext.Provider` directly:
57
+
58
+ ```tsx
59
+ import { ConfigContext, ThemeProvider } from "@simplysm/solid";
60
+
61
+ function App() {
62
+ return (
63
+ <ConfigContext.Provider value={{ clientName: "my-app" }}>
64
+ <ThemeProvider>
65
+ {/* app content */}
66
+ </ThemeProvider>
67
+ </ConfigContext.Provider>
68
+ );
69
+ }
70
+ ```
71
+
72
+ ### Base CSS
73
+
74
+ Import the base CSS in your entry point:
75
+
76
+ ```typescript
77
+ // entry point (e.g., index.tsx)
78
+ import "@simplysm/solid/base.css";
79
+ ```
80
+
81
+ ---
82
+
83
+ ## Components
84
+
85
+ ### Form Control
86
+
87
+ #### Button
88
+
89
+ Interactive button component with built-in Material Design ripple effect.
90
+
91
+ ```tsx
92
+ import { Button } from "@simplysm/solid";
93
+
94
+ <Button theme="primary" variant="solid">Confirm</Button>
95
+ <Button theme="danger" variant="outline" size="sm">Delete</Button>
96
+ <Button variant="ghost">Cancel</Button>
97
+ <Button disabled>Disabled</Button>
98
+ ```
99
+
100
+ | Prop | Type | Default | Description |
101
+ |------|------|---------|-------------|
102
+ | `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"base"` | Color theme |
103
+ | `variant` | `"solid" \| "outline" \| "ghost"` | `"outline"` | Style variant |
104
+ | `size` | `"sm" \| "lg"` | - | Size |
105
+ | `inset` | `boolean` | - | Inset style (removes border/rounded corners) |
106
+ | `disabled` | `boolean` | - | Disabled state |
107
+
108
+ All standard HTML `<button>` element attributes can also be passed.
109
+
110
+ ---
111
+
112
+ #### TextInput
113
+
114
+ Text input field with format mask and IME (Korean, etc.) composition support.
115
+
116
+ ```tsx
117
+ import { TextInput } from "@simplysm/solid";
118
+
119
+ // Basic usage
120
+ <TextInput value={name()} onValueChange={setName} placeholder="Enter name" />
121
+
122
+ // Password
123
+ <TextInput type="password" />
124
+
125
+ // Format mask (e.g., phone number)
126
+ <TextInput format="XXX-XXXX-XXXX" value={phone()} onValueChange={setPhone} />
127
+ ```
128
+
129
+ | Prop | Type | Default | Description |
130
+ |------|------|---------|-------------|
131
+ | `value` | `string` | `""` | Input value |
132
+ | `onValueChange` | `(value: string) => void` | - | Value change callback |
133
+ | `type` | `"text" \| "password" \| "email"` | `"text"` | Input type |
134
+ | `format` | `string` | - | Input format (`X` represents character position, rest are separators) |
135
+ | `placeholder` | `string` | - | Placeholder |
136
+ | `disabled` | `boolean` | - | Disabled state |
137
+ | `readonly` | `boolean` | - | Read-only state |
138
+ | `error` | `boolean` | - | Error state (red border) |
139
+ | `size` | `"sm" \| "lg"` | - | Size |
140
+ | `inset` | `boolean` | - | Inset style |
141
+
142
+ ---
143
+
144
+ #### NumberInput
145
+
146
+ Number input field with thousand separators and minimum decimal places support.
147
+
148
+ ```tsx
149
+ import { NumberInput } from "@simplysm/solid";
150
+
151
+ // Basic usage (thousand separators auto-applied)
152
+ <NumberInput value={amount()} onValueChange={setAmount} />
153
+
154
+ // Without thousand separators
155
+ <NumberInput value={num()} comma={false} />
156
+
157
+ // Minimum 2 decimal places
158
+ <NumberInput value={price()} minDigits={2} />
159
+ ```
160
+
161
+ | Prop | Type | Default | Description |
162
+ |------|------|---------|-------------|
163
+ | `value` | `number` | - | Input value |
164
+ | `onValueChange` | `(value: number \| undefined) => void` | - | Value change callback |
165
+ | `comma` | `boolean` | `true` | Show thousand separators |
166
+ | `minDigits` | `number` | - | Minimum decimal places |
167
+ | `placeholder` | `string` | - | Placeholder |
168
+ | `disabled` | `boolean` | - | Disabled state |
169
+ | `readonly` | `boolean` | - | Read-only state |
170
+ | `error` | `boolean` | - | Error state |
171
+ | `size` | `"sm" \| "lg"` | - | Size |
172
+ | `inset` | `boolean` | - | Inset style |
173
+
174
+ ---
175
+
176
+ #### DatePicker
177
+
178
+ Date input field supporting year, month, and date units. Values are handled using the `DateOnly` type.
179
+
180
+ ```tsx
181
+ import { DatePicker } from "@simplysm/solid";
182
+ import { DateOnly } from "@simplysm/core-common";
183
+
184
+ // Date input
185
+ <DatePicker unit="date" value={date()} onValueChange={setDate} />
186
+
187
+ // Year-month input
188
+ <DatePicker unit="month" value={monthDate()} onValueChange={setMonthDate} />
189
+
190
+ // Year-only input
191
+ <DatePicker unit="year" value={yearDate()} onValueChange={setYearDate} />
192
+
193
+ // min/max constraints
194
+ <DatePicker
195
+ unit="date"
196
+ value={date()}
197
+ onValueChange={setDate}
198
+ min={new DateOnly(2025, 1, 1)}
199
+ max={new DateOnly(2025, 12, 31)}
200
+ />
201
+ ```
202
+
203
+ | Prop | Type | Default | Description |
204
+ |------|------|---------|-------------|
205
+ | `value` | `DateOnly` | - | Input value |
206
+ | `onValueChange` | `(value: DateOnly \| undefined) => void` | - | Value change callback |
207
+ | `unit` | `"year" \| "month" \| "date"` | `"date"` | Date unit |
208
+ | `min` | `DateOnly` | - | Minimum date |
209
+ | `max` | `DateOnly` | - | Maximum date |
210
+ | `disabled` | `boolean` | - | Disabled state |
211
+ | `readonly` | `boolean` | - | Read-only state |
212
+ | `error` | `boolean` | - | Error state |
213
+ | `size` | `"sm" \| "lg"` | - | Size |
214
+ | `inset` | `boolean` | - | Inset style |
215
+
216
+ > `DateTimePicker` and `TimePicker` follow the same pattern for datetime (`DateTime`) and time (`Time`) input.
217
+
218
+ ---
219
+
220
+ #### DateRangePicker
221
+
222
+ Component for inputting date ranges with period type selection (day/month/range). The from/to values are automatically adjusted when periodType changes.
223
+
224
+ ```tsx
225
+ import { DateRangePicker, type DateRangePeriodType } from "@simplysm/solid";
226
+ import { createSignal } from "solid-js";
227
+ import { DateOnly } from "@simplysm/core-common";
228
+
229
+ const [periodType, setPeriodType] = createSignal<DateRangePeriodType>("range");
230
+ const [from, setFrom] = createSignal<DateOnly>();
231
+ const [to, setTo] = createSignal<DateOnly>();
232
+
233
+ <DateRangePicker
234
+ periodType={periodType()}
235
+ onPeriodTypeChange={setPeriodType}
236
+ from={from()}
237
+ onFromChange={setFrom}
238
+ to={to()}
239
+ onToChange={setTo}
240
+ />
241
+ ```
242
+
243
+ | Prop | Type | Default | Description |
244
+ |------|------|---------|-------------|
245
+ | `periodType` | `"day" \| "month" \| "range"` | `"range"` | Period type |
246
+ | `onPeriodTypeChange` | `(value: DateRangePeriodType) => void` | - | Period type change callback |
247
+ | `from` | `DateOnly` | - | Start date |
248
+ | `onFromChange` | `(value: DateOnly \| undefined) => void` | - | Start date change callback |
249
+ | `to` | `DateOnly` | - | End date |
250
+ | `onToChange` | `(value: DateOnly \| undefined) => void` | - | End date change callback |
251
+ | `disabled` | `boolean` | - | Disabled state |
252
+ | `size` | `"sm" \| "lg"` | - | Size |
253
+ | `periodLabels` | `Partial<Record<DateRangePeriodType, string>>` | `{ day: "Day", month: "Month", range: "Range" }` | Period type labels |
254
+
255
+ ---
256
+
257
+ #### Textarea
258
+
259
+ Multi-line text input field. Height adjusts automatically based on content, with IME composition support.
260
+
261
+ ```tsx
262
+ import { Textarea } from "@simplysm/solid";
263
+
264
+ <Textarea value={text()} onValueChange={setText} />
265
+
266
+ // Minimum 3 rows height
267
+ <Textarea minRows={3} value={text()} onValueChange={setText} />
268
+ ```
269
+
270
+ | Prop | Type | Default | Description |
271
+ |------|------|---------|-------------|
272
+ | `value` | `string` | `""` | Input value |
273
+ | `onValueChange` | `(value: string) => void` | - | Value change callback |
274
+ | `placeholder` | `string` | - | Placeholder |
275
+ | `minRows` | `number` | `1` | Minimum number of rows |
276
+ | `disabled` | `boolean` | - | Disabled state |
277
+ | `readonly` | `boolean` | - | Read-only state |
278
+ | `error` | `boolean` | - | Error state |
279
+ | `size` | `"sm" \| "lg"` | - | Size |
280
+ | `inset` | `boolean` | - | Inset style |
281
+
282
+ ---
283
+
284
+ #### Select
285
+
286
+ Dropdown selection component. Supports both items prop approach and children (Compound Components) approach. Single and multiple selection supported.
287
+
288
+ ```tsx
289
+ import { Select } from "@simplysm/solid";
290
+
291
+ // items approach (simple array)
292
+ <Select
293
+ items={["Apple", "Banana", "Strawberry"]}
294
+ value={fruit()}
295
+ onValueChange={setFruit}
296
+ placeholder="Select fruit"
297
+ />
298
+
299
+ // children approach (Compound Components)
300
+ <Select value={fruit()} onValueChange={setFruit} renderValue={(v) => v.name}>
301
+ <Select.Item value={item1}>{item1.name}</Select.Item>
302
+ <Select.Item value={item2}>{item2.name}</Select.Item>
303
+ </Select>
304
+
305
+ // items approach + ItemTemplate for custom rendering
306
+ <Select items={users} value={selectedUser()} onValueChange={setSelectedUser}>
307
+ <Select.ItemTemplate>
308
+ {(user) => <>{user.name} ({user.email})</>}
309
+ </Select.ItemTemplate>
310
+ </Select>
311
+
312
+ // Multiple selection
313
+ <Select items={options} value={selected()} onValueChange={setSelected} multiple />
314
+
315
+ // With action buttons and header
316
+ <Select value={item()} onValueChange={setItem} renderValue={(v) => v.name}>
317
+ <Select.Header><div>Custom header</div></Select.Header>
318
+ <Select.Action onClick={handleAdd}>+</Select.Action>
319
+ <Select.Item value={item1}>{item1.name}</Select.Item>
320
+ </Select>
321
+ ```
322
+
323
+ | Prop | Type | Default | Description |
324
+ |------|------|---------|-------------|
325
+ | `value` | `T \| T[]` | - | Selected value |
326
+ | `onValueChange` | `(value: T \| T[]) => void` | - | Value change callback |
327
+ | `items` | `T[]` | - | Items array (items approach) |
328
+ | `getChildren` | `(item: T, index: number, depth: number) => T[] \| undefined` | - | Tree structure children getter |
329
+ | `renderValue` | `(value: T) => JSX.Element` | - | Value rendering function (required for children approach) |
330
+ | `multiple` | `boolean` | `false` | Multiple selection |
331
+ | `multiDisplayDirection` | `"horizontal" \| "vertical"` | `"horizontal"` | Display direction for multiple selection |
332
+ | `hideSelectAll` | `boolean` | - | Hide select all button (multiple selection) |
333
+ | `placeholder` | `string` | - | Placeholder |
334
+ | `disabled` | `boolean` | - | Disabled state |
335
+ | `required` | `boolean` | - | Required field |
336
+ | `size` | `"sm" \| "lg"` | - | Size |
337
+ | `inset` | `boolean` | - | Inset style |
338
+
339
+ **Sub-components:**
340
+ - `Select.Item` -- Selection item
341
+ - `Select.Action` -- Right-side action button
342
+ - `Select.Header` -- Dropdown top custom area
343
+ - `Select.ItemTemplate` -- Item rendering template for items approach
344
+
345
+ ---
346
+
347
+ #### Combobox
348
+
349
+ Autocomplete component with async search and item selection support. Debouncing is built-in.
350
+
351
+ ```tsx
352
+ import { Combobox } from "@simplysm/solid";
353
+
354
+ <Combobox
355
+ loadItems={async (query) => {
356
+ const response = await fetch(`/api/search?q=${query}`);
357
+ return response.json();
358
+ }}
359
+ renderValue={(item) => item.name}
360
+ value={selected()}
361
+ onValueChange={setSelected}
362
+ placeholder="Search..."
363
+ >
364
+ <Combobox.ItemTemplate>
365
+ {(item) => <>{item.name}</>}
366
+ </Combobox.ItemTemplate>
367
+ </Combobox>
368
+ ```
369
+
370
+ | Prop | Type | Default | Description |
371
+ |------|------|---------|-------------|
372
+ | `value` | `T` | - | Selected value |
373
+ | `onValueChange` | `(value: T) => void` | - | Value change callback |
374
+ | `loadItems` | `(query: string) => Promise<T[]>` | **(required)** | Item loading function |
375
+ | `renderValue` | `(value: T) => JSX.Element` | **(required)** | Value rendering function |
376
+ | `debounceMs` | `number` | `300` | Debounce delay (ms) |
377
+ | `allowCustomValue` | `boolean` | - | Allow custom values |
378
+ | `parseCustomValue` | `(text: string) => T` | - | Custom value parsing function |
379
+ | `placeholder` | `string` | - | Placeholder |
380
+ | `disabled` | `boolean` | - | Disabled state |
381
+ | `size` | `"sm" \| "lg"` | - | Size |
382
+ | `inset` | `boolean` | - | Inset style |
383
+
384
+ **Sub-components:**
385
+ - `Combobox.Item` -- Selection item
386
+ - `Combobox.ItemTemplate` -- Item rendering template
387
+
388
+ ---
389
+
390
+ #### Checkbox / Radio
391
+
392
+ Checkbox and radio button components.
393
+
394
+ ```tsx
395
+ import { Checkbox, Radio } from "@simplysm/solid";
396
+
397
+ <Checkbox value={checked()} onValueChange={setChecked}>I agree</Checkbox>
398
+ <Checkbox theme="success" value={active()} onValueChange={setActive}>Activate</Checkbox>
399
+
400
+ <Radio value={option() === "a"} onValueChange={() => setOption("a")}>Option A</Radio>
401
+ <Radio value={option() === "b"} onValueChange={() => setOption("b")}>Option B</Radio>
402
+ ```
403
+
404
+ | Prop | Type | Default | Description |
405
+ |------|------|---------|-------------|
406
+ | `value` | `boolean` | `false` | Checked state |
407
+ | `onValueChange` | `(value: boolean) => void` | - | Value change callback |
408
+ | `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"primary"` | Color theme |
409
+ | `size` | `"sm" \| "lg"` | - | Size |
410
+ | `disabled` | `boolean` | - | Disabled state |
411
+ | `inset` | `boolean` | - | Inset style |
412
+ | `inline` | `boolean` | - | Inline style |
413
+
414
+ ---
415
+
416
+ #### CheckboxGroup / RadioGroup
417
+
418
+ Group components for managing multiple/single selection across items.
419
+
420
+ ```tsx
421
+ import { CheckboxGroup, RadioGroup } from "@simplysm/solid";
422
+
423
+ // Multiple selection
424
+ <CheckboxGroup value={selectedColors()} onValueChange={setSelectedColors}>
425
+ <CheckboxGroup.Item value="red">Red</CheckboxGroup.Item>
426
+ <CheckboxGroup.Item value="green">Green</CheckboxGroup.Item>
427
+ <CheckboxGroup.Item value="blue">Blue</CheckboxGroup.Item>
428
+ </CheckboxGroup>
429
+
430
+ // Single selection
431
+ <RadioGroup value={size()} onValueChange={setSize}>
432
+ <RadioGroup.Item value="sm">Small</RadioGroup.Item>
433
+ <RadioGroup.Item value="md">Medium</RadioGroup.Item>
434
+ <RadioGroup.Item value="lg">Large</RadioGroup.Item>
435
+ </RadioGroup>
436
+ ```
437
+
438
+ **CheckboxGroup Props:**
439
+
440
+ | Prop | Type | Default | Description |
441
+ |------|------|---------|-------------|
442
+ | `value` | `T[]` | `[]` | Selected values array |
443
+ | `onValueChange` | `(value: T[]) => void` | - | Value change callback |
444
+ | `theme` | `SemanticTheme` | `"primary"` | Color theme |
445
+ | `size` | `"sm" \| "lg"` | - | Size |
446
+ | `disabled` | `boolean` | - | Disable all items |
447
+ | `inline` | `boolean` | - | Inline style |
448
+ | `inset` | `boolean` | - | Inset style |
449
+
450
+ **RadioGroup Props:**
451
+
452
+ | Prop | Type | Default | Description |
453
+ |------|------|---------|-------------|
454
+ | `value` | `T` | - | Selected value |
455
+ | `onValueChange` | `(value: T) => void` | - | Value change callback |
456
+ | `theme` | `SemanticTheme` | `"primary"` | Color theme |
457
+ | `size` | `"sm" \| "lg"` | - | Size |
458
+ | `disabled` | `boolean` | - | Disable all items |
459
+ | `inline` | `boolean` | - | Inline style |
460
+ | `inset` | `boolean` | - | Inset style |
461
+
462
+ ---
463
+
464
+ #### ColorPicker
465
+
466
+ Color selection component.
467
+
468
+ ```tsx
469
+ import { ColorPicker } from "@simplysm/solid";
470
+
471
+ <ColorPicker value={color()} onValueChange={setColor} />
472
+ <ColorPicker value={color()} size="sm" disabled />
473
+ ```
474
+
475
+ | Prop | Type | Default | Description |
476
+ |------|------|---------|-------------|
477
+ | `value` | `string` | `"#000000"` | Color value (#RRGGBB format) |
478
+ | `onValueChange` | `(value: string) => void` | - | Value change callback |
479
+ | `size` | `"sm" \| "lg"` | - | Size |
480
+ | `disabled` | `boolean` | - | Disabled state |
481
+
482
+ ---
483
+
484
+ #### ThemeToggle
485
+
486
+ Dark/light/system theme cycle toggle button. Must be used inside `ThemeProvider`.
487
+
488
+ ```tsx
489
+ import { ThemeToggle } from "@simplysm/solid";
490
+
491
+ <ThemeToggle />
492
+ <ThemeToggle size="sm" />
493
+ <ThemeToggle size="lg" />
494
+ ```
495
+
496
+ Clicking cycles through `light -> system -> dark -> light`, displaying an icon matching the current mode.
497
+
498
+ | Prop | Type | Default | Description |
499
+ |------|------|---------|-------------|
500
+ | `size` | `"sm" \| "lg"` | - | Button size |
501
+
502
+ ---
503
+
504
+ #### RichTextEditor
505
+
506
+ Tiptap-based rich text editor. Supports text formatting (bold, italic, strikethrough), alignment, colors, highlights, tables, and image insertion.
507
+
508
+ ```tsx
509
+ import { RichTextEditor } from "@simplysm/solid";
510
+
511
+ <RichTextEditor value={html()} onValueChange={setHtml} />
512
+ ```
513
+
514
+ | Prop | Type | Default | Description |
515
+ |------|------|---------|-------------|
516
+ | `value` | `string` | - | HTML string value |
517
+ | `onValueChange` | `(value: string) => void` | - | Value change callback |
518
+ | `disabled` | `boolean` | - | Disabled state |
519
+ | `error` | `boolean` | - | Error state |
520
+ | `size` | `"sm" \| "lg"` | - | Size |
521
+
522
+ ---
523
+
524
+ #### Numpad
525
+
526
+ Numeric keypad component. Used in environments requiring touch-based number input.
527
+
528
+ ```tsx
529
+ import { Numpad } from "@simplysm/solid";
530
+
531
+ <Numpad value={amount()} onValueChange={setAmount} />
532
+
533
+ // With ENT/minus buttons
534
+ <Numpad
535
+ value={amount()}
536
+ onValueChange={setAmount}
537
+ useEnterButton
538
+ useMinusButton
539
+ onEnterButtonClick={handleSubmit}
540
+ />
541
+ ```
542
+
543
+ | Prop | Type | Default | Description |
544
+ |------|------|---------|-------------|
545
+ | `value` | `number` | - | Input value |
546
+ | `onValueChange` | `(value: number \| undefined) => void` | - | Value change callback |
547
+ | `placeholder` | `string` | - | Placeholder |
548
+ | `required` | `boolean` | - | Required field |
549
+ | `inputDisabled` | `boolean` | - | Disable direct text field input |
550
+ | `useEnterButton` | `boolean` | - | Show ENT button |
551
+ | `useMinusButton` | `boolean` | - | Show minus button |
552
+ | `onEnterButtonClick` | `() => void` | - | ENT click callback |
553
+ | `size` | `"sm" \| "lg"` | - | Size |
554
+
555
+ ---
556
+
557
+ #### StatePreset
558
+
559
+ Component for saving/loading screen state (search conditions, etc.) as presets. Persisted in localStorage.
560
+
561
+ ```tsx
562
+ import { StatePreset } from "@simplysm/solid";
563
+
564
+ <StatePreset
565
+ presetKey="user-search"
566
+ value={searchState()}
567
+ onValueChange={setSearchState}
568
+ />
569
+ ```
570
+
571
+ | Prop | Type | Default | Description |
572
+ |------|------|---------|-------------|
573
+ | `presetKey` | `string` | **(required)** | Preset storage key |
574
+ | `value` | `T` | **(required)** | Current state value |
575
+ | `onValueChange` | `(value: T) => void` | **(required)** | State restore callback |
576
+ | `size` | `"sm" \| "lg"` | - | Size |
577
+
578
+ ---
579
+
580
+ ### Navigation
581
+
582
+ #### Tabs
583
+
584
+ Tab navigation component.
585
+
586
+ ```tsx
587
+ import { Tabs } from "@simplysm/solid";
588
+
589
+ <Tabs value={activeTab()} onValueChange={setActiveTab}>
590
+ <Tabs.Tab value="tab1">Tab 1</Tabs.Tab>
591
+ <Tabs.Tab value="tab2">Tab 2</Tabs.Tab>
592
+ <Tabs.Tab value="tab3" disabled>Tab 3</Tabs.Tab>
593
+ </Tabs>
594
+ ```
595
+
596
+ | Prop | Type | Default | Description |
597
+ |------|------|---------|-------------|
598
+ | `value` | `string` | - | Selected tab value |
599
+ | `onValueChange` | `(value: string) => void` | - | Tab change callback |
600
+ | `size` | `"sm" \| "lg"` | - | Size |
601
+
602
+ **Sub-components:**
603
+ - `Tabs.Tab` -- Individual tab (`value: string`, `disabled?: boolean`)
604
+
605
+ ---
606
+
607
+ ### Display
608
+
609
+ #### Card
610
+
611
+ Container with shadow effect.
612
+
613
+ ```tsx
614
+ import { Card } from "@simplysm/solid";
615
+
616
+ <Card>Card content</Card>
617
+ <Card class="p-4">Card with padding</Card>
618
+ ```
619
+
620
+ ---
621
+
622
+ #### Tag
623
+
624
+ Inline tag/badge component.
625
+
626
+ ```tsx
627
+ import { Tag } from "@simplysm/solid";
628
+
629
+ <Tag theme="primary">New</Tag>
630
+ <Tag theme="success">Complete</Tag>
631
+ <Tag theme="danger">Urgent</Tag>
632
+ ```
633
+
634
+ | Prop | Type | Default | Description |
635
+ |------|------|---------|-------------|
636
+ | `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"base"` | Color theme |
637
+
638
+ ---
639
+
640
+ #### Alert
641
+
642
+ Block-level alert/notice component.
643
+
644
+ ```tsx
645
+ import { Alert } from "@simplysm/solid";
646
+
647
+ <Alert theme="info">This is an information message.</Alert>
648
+ <Alert theme="warning">Please pay attention to this.</Alert>
649
+ <Alert theme="danger">An error has occurred.</Alert>
650
+ ```
651
+
652
+ | Prop | Type | Default | Description |
653
+ |------|------|---------|-------------|
654
+ | `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"base"` | Color theme |
655
+
656
+ ---
657
+
658
+ #### Icon
659
+
660
+ Tabler Icons wrapper component. Displayed in `em` units to scale proportionally with surrounding text.
661
+
662
+ ```tsx
663
+ import { Icon } from "@simplysm/solid";
664
+ import { IconCheck, IconAlertTriangle } from "@tabler/icons-solidjs";
665
+
666
+ <Icon icon={IconCheck} />
667
+ <Icon icon={IconAlertTriangle} size="2em" />
668
+ ```
669
+
670
+ | Prop | Type | Default | Description |
671
+ |------|------|---------|-------------|
672
+ | `icon` | `Component` | **(required)** | Tabler icon component |
673
+ | `size` | `string \| number` | `"1.25em"` | Icon size |
674
+
675
+ ---
676
+
677
+ #### Progress
678
+
679
+ Progress indicator component.
680
+
681
+ ```tsx
682
+ import { Progress } from "@simplysm/solid";
683
+
684
+ <Progress value={0.65} />
685
+ <Progress value={0.8} theme="success" size="lg" />
686
+
687
+ // Custom text
688
+ <Progress value={progress()}>
689
+ {Math.round(progress() * 100)}% complete
690
+ </Progress>
691
+ ```
692
+
693
+ | Prop | Type | Default | Description |
694
+ |------|------|---------|-------------|
695
+ | `value` | `number` | **(required)** | Progress (0~1) |
696
+ | `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"primary"` | Color theme |
697
+ | `size` | `"sm" \| "lg"` | - | Size |
698
+ | `inset` | `boolean` | - | Inset style |
699
+
700
+ ---
701
+
702
+ #### Barcode
703
+
704
+ bwip-js-based barcode/QR code rendering component. Supports over 100 barcode types.
705
+
706
+ ```tsx
707
+ import { Barcode } from "@simplysm/solid";
708
+
709
+ <Barcode type="qrcode" value="https://example.com" />
710
+ <Barcode type="code128" value="ABC-12345" />
711
+ <Barcode type="ean13" value="4901234567890" />
712
+ ```
713
+
714
+ | Prop | Type | Default | Description |
715
+ |------|------|---------|-------------|
716
+ | `type` | `BarcodeType` | **(required)** | Barcode type (`"qrcode"`, `"code128"`, `"ean13"`, etc.) |
717
+ | `value` | `string` | - | Barcode value |
718
+
719
+ ---
720
+
721
+ #### Echarts
722
+
723
+ Apache ECharts chart wrapper component. Requires `echarts` peer dependency installation.
724
+
725
+ ```tsx
726
+ import { Echarts } from "@simplysm/solid";
727
+
728
+ <Echarts
729
+ option={{
730
+ xAxis: { type: "category", data: ["Mon", "Tue", "Wed"] },
731
+ yAxis: { type: "value" },
732
+ series: [{ data: [120, 200, 150], type: "bar" }],
733
+ }}
734
+ />
735
+
736
+ <Echarts option={chartOption()} loading={isLoading()} />
737
+ ```
738
+
739
+ | Prop | Type | Default | Description |
740
+ |------|------|---------|-------------|
741
+ | `option` | `echarts.EChartsOption` | **(required)** | ECharts option object |
742
+ | `loading` | `boolean` | - | Show loading state |
743
+
744
+ ---
745
+
746
+ ### Layout
747
+
748
+ #### Sidebar
749
+
750
+ Sidebar navigation with responsive support (mobile overlay below 520px). Open/closed state is saved in localStorage.
751
+
752
+ ```tsx
753
+ import { Sidebar } from "@simplysm/solid";
754
+
755
+ <Sidebar.Container>
756
+ <Sidebar>
757
+ <Sidebar.User name="John Doe" menus={userMenus}>
758
+ <span>John Doe</span>
759
+ </Sidebar.User>
760
+ <Sidebar.Menu menus={menuItems} />
761
+ </Sidebar>
762
+ <div class="flex flex-1 flex-col">
763
+ <Topbar>
764
+ <h1>App Name</h1>
765
+ </Topbar>
766
+ <main class="flex-1 overflow-auto p-4">
767
+ {/* main content */}
768
+ </main>
769
+ </div>
770
+ </Sidebar.Container>
771
+ ```
772
+
773
+ **Sub-components:**
774
+ - `Sidebar.Container` -- Container wrapping sidebar and main area (required)
775
+ - `Sidebar.Menu` -- Menu items list (`menus: SidebarMenuItem[]`)
776
+ - `Sidebar.User` -- User info area
777
+
778
+ ---
779
+
780
+ #### Topbar
781
+
782
+ Top navigation bar. When used inside `Sidebar.Container`, a sidebar toggle button appears automatically.
783
+
784
+ ```tsx
785
+ import { Topbar } from "@simplysm/solid";
786
+
787
+ <Topbar>
788
+ <h1 class="text-lg font-bold">App Name</h1>
789
+ <Topbar.Menu menus={menuItems} />
790
+ <div class="flex-1" />
791
+ <Topbar.User menus={userMenus}>User</Topbar.User>
792
+ </Topbar>
793
+ ```
794
+
795
+ **Sub-components:**
796
+ - `Topbar.Container` -- Container wrapping main content below topbar
797
+ - `Topbar.Menu` -- Menu items list
798
+ - `Topbar.User` -- User menu (dropdown)
799
+
800
+ ---
801
+
802
+ #### FormGroup
803
+
804
+ Layout component for arranging form fields with labels vertically or inline.
805
+
806
+ ```tsx
807
+ import { FormGroup, TextInput } from "@simplysm/solid";
808
+
809
+ // Vertical layout (default)
810
+ <FormGroup>
811
+ <FormGroup.Item label="Name">
812
+ <TextInput value={name()} onValueChange={setName} />
813
+ </FormGroup.Item>
814
+ <FormGroup.Item label="Email">
815
+ <TextInput type="email" value={email()} onValueChange={setEmail} />
816
+ </FormGroup.Item>
817
+ </FormGroup>
818
+
819
+ // Inline layout
820
+ <FormGroup inline>
821
+ <FormGroup.Item label="Search">
822
+ <TextInput value={query()} onValueChange={setQuery} />
823
+ </FormGroup.Item>
824
+ <FormGroup.Item>
825
+ <Button theme="primary">Search</Button>
826
+ </FormGroup.Item>
827
+ </FormGroup>
828
+ ```
829
+
830
+ | Prop | Type | Default | Description |
831
+ |------|------|---------|-------------|
832
+ | `inline` | `boolean` | `false` | Inline layout mode |
833
+
834
+ **Sub-components:**
835
+ - `FormGroup.Item` -- Form item (`label?: JSX.Element`)
836
+
837
+ ---
838
+
839
+ #### FormTable
840
+
841
+ `<table>`-based form layout. Labels go in `<th>`, input fields in `<td>`.
842
+
843
+ ```tsx
844
+ import { FormTable, TextInput, NumberInput } from "@simplysm/solid";
845
+
846
+ <FormTable>
847
+ <tbody>
848
+ <tr>
849
+ <th>Name</th>
850
+ <td><TextInput value={name()} onValueChange={setName} /></td>
851
+ <th>Age</th>
852
+ <td><NumberInput value={age()} onValueChange={setAge} /></td>
853
+ </tr>
854
+ <tr>
855
+ <th>Email</th>
856
+ <td colSpan={3}><TextInput type="email" value={email()} onValueChange={setEmail} /></td>
857
+ </tr>
858
+ </tbody>
859
+ </FormTable>
860
+ ```
861
+
862
+ ---
863
+
864
+ #### Kanban
865
+
866
+ Kanban board layout component.
867
+
868
+ ---
869
+
870
+ ### Data
871
+
872
+ #### Table
873
+
874
+ Basic HTML table wrapper. Provides consistent styling for borders, header backgrounds, etc.
875
+
876
+ ```tsx
877
+ import { Table } from "@simplysm/solid";
878
+
879
+ <Table>
880
+ <thead>
881
+ <tr><th>Name</th><th>Age</th></tr>
882
+ </thead>
883
+ <tbody>
884
+ <tr><td>John Doe</td><td>30</td></tr>
885
+ <tr><td>Jane Smith</td><td>25</td></tr>
886
+ </tbody>
887
+ </Table>
888
+
889
+ // Inset style (removes outer border, fits parent container)
890
+ <Table inset>...</Table>
891
+ ```
892
+
893
+ | Prop | Type | Default | Description |
894
+ |------|------|---------|-------------|
895
+ | `inset` | `boolean` | - | Inset style |
896
+
897
+ ---
898
+
899
+ #### DataSheet
900
+
901
+ Advanced data table component. Supports sorting, pagination, row selection, tree expansion, column resize, column configuration, and row reordering.
902
+
903
+ ```tsx
904
+ import { DataSheet } from "@simplysm/solid";
905
+
906
+ <DataSheet items={users()} key="user-table">
907
+ <DataSheet.Column key="name" header="Name" sortable>
908
+ {({ item }) => <>{item.name}</>}
909
+ </DataSheet.Column>
910
+ <DataSheet.Column key="age" header="Age" sortable width="80px">
911
+ {({ item }) => <>{item.age}</>}
912
+ </DataSheet.Column>
913
+ <DataSheet.Column key="email" header="Email">
914
+ {({ item }) => <>{item.email}</>}
915
+ </DataSheet.Column>
916
+ </DataSheet>
917
+
918
+ // With pagination + sorting + selection
919
+ <DataSheet
920
+ items={data()}
921
+ key="data-table"
922
+ page={page()}
923
+ onPageChange={setPage}
924
+ totalPageCount={totalPages()}
925
+ sorts={sorts()}
926
+ onSortsChange={setSorts}
927
+ selectMode="multiple"
928
+ selectedItems={selectedItems()}
929
+ onSelectedItemsChange={setSelectedItems}
930
+ >
931
+ {/* columns */}
932
+ </DataSheet>
933
+ ```
934
+
935
+ **DataSheet Props (key items):**
936
+
937
+ | Prop | Type | Default | Description |
938
+ |------|------|---------|-------------|
939
+ | `items` | `T[]` | - | Data array |
940
+ | `key` | `string` | - | Column configuration storage key |
941
+ | `inset` | `boolean` | - | Inset style |
942
+ | `sorts` | `SortingDef[]` | - | Sort definition |
943
+ | `onSortsChange` | `(sorts: SortingDef[]) => void` | - | Sort change callback |
944
+ | `autoSort` | `boolean` | - | Client-side auto-sorting |
945
+ | `page` | `number` | - | Current page (0-based) |
946
+ | `onPageChange` | `(page: number) => void` | - | Page change callback |
947
+ | `totalPageCount` | `number` | - | Total page count |
948
+ | `selectMode` | `"single" \| "multiple"` | - | Selection mode |
949
+ | `selectedItems` | `T[]` | - | Selected items |
950
+ | `onSelectedItemsChange` | `(items: T[]) => void` | - | Selection change callback |
951
+ | `getChildren` | `(item: T, index: number) => T[] \| undefined` | - | Tree structure children getter |
952
+ | `hideConfigBar` | `boolean` | - | Hide configuration bar |
953
+
954
+ **DataSheet.Column Props:**
955
+
956
+ | Prop | Type | Default | Description |
957
+ |------|------|---------|-------------|
958
+ | `key` | `string` | **(required)** | Column identifier key |
959
+ | `header` | `string \| string[]` | - | Header text (array for multi-level headers) |
960
+ | `headerContent` | `() => JSX.Element` | - | Custom header rendering |
961
+ | `summary` | `() => JSX.Element` | - | Summary row rendering |
962
+ | `width` | `string` | - | Column width |
963
+ | `fixed` | `boolean` | - | Fixed column |
964
+ | `hidden` | `boolean` | - | Hidden column |
965
+ | `sortable` | `boolean` | - | Sortable |
966
+ | `resizable` | `boolean` | - | Resizable |
967
+ | `children` | `(ctx: { item: T, index: number, depth: number }) => JSX.Element` | **(required)** | Cell rendering function |
968
+
969
+ ---
970
+
971
+ #### List
972
+
973
+ Tree-view style list component. Supports keyboard navigation.
974
+
975
+ ```tsx
976
+ import { List } from "@simplysm/solid";
977
+
978
+ <List>
979
+ <List.Item>Item 1</List.Item>
980
+ <List.Item>Item 2</List.Item>
981
+ <List.Item>
982
+ Parent item
983
+ <List.Item.Children>
984
+ <List.Item>Child item 1</List.Item>
985
+ <List.Item>Child item 2</List.Item>
986
+ </List.Item.Children>
987
+ </List.Item>
988
+ </List>
989
+
990
+ // Inset style
991
+ <List inset>
992
+ <List.Item>Inset item</List.Item>
993
+ </List>
994
+ ```
995
+
996
+ **Keyboard navigation:**
997
+ - `ArrowUp` / `ArrowDown` -- Move focus to previous/next item
998
+ - `Space` / `Enter` -- Click current item
999
+ - `ArrowRight` -- Expand if collapsed, focus first child if expanded
1000
+ - `ArrowLeft` -- Collapse if expanded, focus parent if collapsed
1001
+ - `Home` / `End` -- Focus first/last item
1002
+
1003
+ | Prop | Type | Default | Description |
1004
+ |------|------|---------|-------------|
1005
+ | `inset` | `boolean` | - | Transparent background style |
1006
+
1007
+ ---
1008
+
1009
+ #### Pagination
1010
+
1011
+ Page navigation component.
1012
+
1013
+ ```tsx
1014
+ import { Pagination } from "@simplysm/solid";
1015
+
1016
+ <Pagination
1017
+ page={currentPage()}
1018
+ onPageChange={setCurrentPage}
1019
+ totalPageCount={20}
1020
+ displayPageCount={10}
1021
+ />
1022
+ ```
1023
+
1024
+ | Prop | Type | Default | Description |
1025
+ |------|------|---------|-------------|
1026
+ | `page` | `number` | **(required)** | Current page (0-based) |
1027
+ | `onPageChange` | `(page: number) => void` | - | Page change callback |
1028
+ | `totalPageCount` | `number` | **(required)** | Total page count |
1029
+ | `displayPageCount` | `number` | `10` | Number of pages to display at once |
1030
+ | `size` | `"sm" \| "lg"` | - | Size |
1031
+
1032
+ ---
1033
+
1034
+ #### Calendar
1035
+
1036
+ Calendar-style data display component.
1037
+
1038
+ ```tsx
1039
+ import { Calendar } from "@simplysm/solid";
1040
+
1041
+ <Calendar
1042
+ items={events()}
1043
+ getItemDate={(event) => event.date}
1044
+ renderItem={(event) => <div>{event.title}</div>}
1045
+ yearMonth={yearMonth()}
1046
+ onYearMonthChange={setYearMonth}
1047
+ />
1048
+ ```
1049
+
1050
+ | Prop | Type | Default | Description |
1051
+ |------|------|---------|-------------|
1052
+ | `items` | `T[]` | **(required)** | Data array |
1053
+ | `getItemDate` | `(item: T, index: number) => DateOnly` | **(required)** | Item date extraction function |
1054
+ | `renderItem` | `(item: T, index: number) => JSX.Element` | **(required)** | Item rendering function |
1055
+ | `yearMonth` | `DateOnly` | - | Year-month to display |
1056
+ | `onYearMonthChange` | `(value: DateOnly) => void` | - | Year-month change callback |
1057
+ | `weekStartDay` | `number` | `0` (Sunday) | Week start day |
1058
+
1059
+ ---
1060
+
1061
+ #### PermissionTable
1062
+
1063
+ Permission management table component.
1064
+
1065
+ ---
1066
+
1067
+ ### Disclosure
1068
+
1069
+ #### Collapse
1070
+
1071
+ Content collapse/expand animation component. Uses `margin-top`-based transition for smooth open/close effects.
1072
+
1073
+ ```tsx
1074
+ import { Collapse, Button } from "@simplysm/solid";
1075
+ import { createSignal } from "solid-js";
1076
+
1077
+ const [open, setOpen] = createSignal(false);
1078
+
1079
+ <Button
1080
+ aria-expanded={open()}
1081
+ aria-controls="content"
1082
+ onClick={() => setOpen(!open())}
1083
+ >
1084
+ Toggle
1085
+ </Button>
1086
+ <Collapse id="content" open={open()}>
1087
+ <p>Collapsible content</p>
1088
+ </Collapse>
1089
+ ```
1090
+
1091
+ | Prop | Type | Default | Description |
1092
+ |------|------|---------|-------------|
1093
+ | `open` | `boolean` | `false` | Open state |
1094
+
1095
+ Animation is automatically disabled when `prefers-reduced-motion` is set.
1096
+
1097
+ ---
1098
+
1099
+ #### Dropdown
1100
+
1101
+ Positioned dropdown popup. Position is determined relative to trigger element or absolute coordinates.
1102
+
1103
+ ```tsx
1104
+ import { Dropdown, Button } from "@simplysm/solid";
1105
+ import { createSignal } from "solid-js";
1106
+
1107
+ const [open, setOpen] = createSignal(false);
1108
+ let triggerRef!: HTMLButtonElement;
1109
+
1110
+ <Button ref={triggerRef} onClick={() => setOpen(!open())}>Open</Button>
1111
+ <Dropdown triggerRef={() => triggerRef} open={open()} onOpenChange={setOpen}>
1112
+ <p class="p-3">Dropdown content</p>
1113
+ </Dropdown>
1114
+
1115
+ // Context menu (absolute position)
1116
+ <Dropdown position={{ x: 100, y: 200 }} open={menuOpen()} onOpenChange={setMenuOpen}>
1117
+ <List inset>
1118
+ <List.Item>Menu item 1</List.Item>
1119
+ <List.Item>Menu item 2</List.Item>
1120
+ </List>
1121
+ </Dropdown>
1122
+ ```
1123
+
1124
+ | Prop | Type | Default | Description |
1125
+ |------|------|---------|-------------|
1126
+ | `triggerRef` | `() => HTMLElement \| undefined` | - | Trigger element reference (mutually exclusive with position) |
1127
+ | `position` | `{ x: number; y: number }` | - | Absolute position (mutually exclusive with triggerRef) |
1128
+ | `open` | `boolean` | - | Open state |
1129
+ | `onOpenChange` | `(open: boolean) => void` | - | State change callback |
1130
+ | `maxHeight` | `number` | `300` | Maximum height (px) |
1131
+ | `keyboardNav` | `boolean` | - | Enable keyboard navigation (used by Select, etc.) |
1132
+
1133
+ ---
1134
+
1135
+ #### Dialog
1136
+
1137
+ Modal dialog component. Supports drag movement, resize, floating mode, and fullscreen mode.
1138
+
1139
+ ```tsx
1140
+ import { Dialog, Button } from "@simplysm/solid";
1141
+ import { createSignal } from "solid-js";
1142
+
1143
+ const [open, setOpen] = createSignal(false);
1144
+
1145
+ <Button onClick={() => setOpen(true)}>Open</Button>
1146
+ <Dialog
1147
+ title="Dialog Title"
1148
+ open={open()}
1149
+ onOpenChange={setOpen}
1150
+ closeOnBackdrop
1151
+ widthPx={600}
1152
+ >
1153
+ <div class="p-4">
1154
+ Dialog content
1155
+ </div>
1156
+ </Dialog>
1157
+
1158
+ // Floating mode (no backdrop)
1159
+ <Dialog
1160
+ title="Notification"
1161
+ open={open()}
1162
+ onOpenChange={setOpen}
1163
+ float
1164
+ position="bottom-right"
1165
+ >
1166
+ <div class="p-4">Floating dialog</div>
1167
+ </Dialog>
1168
+ ```
1169
+
1170
+ | Prop | Type | Default | Description |
1171
+ |------|------|---------|-------------|
1172
+ | `open` | `boolean` | - | Open state |
1173
+ | `onOpenChange` | `(open: boolean) => void` | - | State change callback |
1174
+ | `title` | `string` | **(required)** | Modal title |
1175
+ | `hideHeader` | `boolean` | - | Hide header |
1176
+ | `closable` | `boolean` | `true` | Show close button |
1177
+ | `closeOnBackdrop` | `boolean` | - | Close on backdrop click |
1178
+ | `closeOnEscape` | `boolean` | `true` | Close on Escape key |
1179
+ | `resizable` | `boolean` | `false` | Resizable |
1180
+ | `movable` | `boolean` | `true` | Draggable |
1181
+ | `float` | `boolean` | - | Floating mode (no backdrop) |
1182
+ | `fill` | `boolean` | - | Fullscreen mode |
1183
+ | `widthPx` | `number` | - | Width (px) |
1184
+ | `heightPx` | `number` | - | Height (px) |
1185
+ | `minWidthPx` | `number` | - | Minimum width (px) |
1186
+ | `minHeightPx` | `number` | - | Minimum height (px) |
1187
+ | `position` | `"bottom-right" \| "top-right"` | - | Fixed position |
1188
+ | `headerAction` | `JSX.Element` | - | Header action area |
1189
+ | `canDeactivate` | `() => boolean` | - | Pre-close confirmation function |
1190
+ | `onCloseComplete` | `() => void` | - | Post-close animation callback |
1191
+
1192
+ ---
1193
+
1194
+ ### Feedback
1195
+
1196
+ #### Notification
1197
+
1198
+ Notification system. Wrap with `NotificationProvider` and trigger notifications using the `useNotification` hook.
1199
+
1200
+ ```tsx
1201
+ import {
1202
+ NotificationProvider,
1203
+ NotificationBanner,
1204
+ NotificationBell,
1205
+ useNotification,
1206
+ } from "@simplysm/solid";
1207
+
1208
+ // Set up Provider at app root
1209
+ <NotificationProvider>
1210
+ <NotificationBanner />
1211
+ <header>
1212
+ <NotificationBell />
1213
+ </header>
1214
+ <MyApp />
1215
+ </NotificationProvider>
1216
+
1217
+ // Trigger notifications within components
1218
+ function MyComponent() {
1219
+ const notification = useNotification();
1220
+
1221
+ const handleSave = () => {
1222
+ notification.success("Success", "Saved successfully.");
1223
+ };
1224
+
1225
+ const handleError = () => {
1226
+ notification.danger("Error", "An issue occurred.", {
1227
+ action: { label: "Retry", onClick: handleRetry },
1228
+ });
1229
+ };
1230
+
1231
+ return <Button onClick={handleSave}>Save</Button>;
1232
+ }
1233
+ ```
1234
+
1235
+ **useNotification API:**
1236
+
1237
+ | Method | Signature | Description |
1238
+ |--------|-----------|-------------|
1239
+ | `info` | `(title: string, message?: string, options?: NotificationOptions) => string` | Info notification |
1240
+ | `success` | `(title: string, message?: string, options?: NotificationOptions) => string` | Success notification |
1241
+ | `warning` | `(title: string, message?: string, options?: NotificationOptions) => string` | Warning notification |
1242
+ | `danger` | `(title: string, message?: string, options?: NotificationOptions) => string` | Error notification |
1243
+ | `update` | `(id: string, updates: Partial<NotificationItem>, options?: { renotify?: boolean }) => void` | Update notification |
1244
+ | `remove` | `(id: string) => void` | Remove notification |
1245
+ | `markAsRead` | `(id: string) => void` | Mark as read |
1246
+ | `markAllAsRead` | `() => void` | Mark all as read |
1247
+ | `dismissBanner` | `() => void` | Dismiss banner |
1248
+ | `clear` | `() => void` | Clear all |
1249
+
1250
+ **Components:**
1251
+ - `NotificationProvider` -- Notification state management Provider
1252
+ - `NotificationBanner` -- Top-of-screen notification banner
1253
+ - `NotificationBell` -- Notification bell icon (shows unread count)
1254
+
1255
+ ---
1256
+
1257
+ #### Loading
1258
+
1259
+ Loading overlay system. Wrap with `LoadingProvider` and control loading state using the `useLoading` hook.
1260
+
1261
+ ```tsx
1262
+ import {
1263
+ LoadingProvider,
1264
+ LoadingContainer,
1265
+ useLoading,
1266
+ } from "@simplysm/solid";
1267
+
1268
+ // Set up Provider at app root
1269
+ <LoadingProvider>
1270
+ <LoadingContainer />
1271
+ <MyApp />
1272
+ </LoadingProvider>
1273
+
1274
+ // Control loading within components
1275
+ function MyComponent() {
1276
+ const loading = useLoading();
1277
+
1278
+ const fetchData = async () => {
1279
+ loading.show("Loading data...");
1280
+ try {
1281
+ await fetch("/api/data");
1282
+ } finally {
1283
+ loading.hide();
1284
+ }
1285
+ };
1286
+
1287
+ return <Button onClick={fetchData}>Load Data</Button>;
1288
+ }
1289
+ ```
1290
+
1291
+ **useLoading API:**
1292
+
1293
+ | Method | Signature | Description |
1294
+ |--------|-----------|-------------|
1295
+ | `show` | `(message?: string) => void` | Show loading |
1296
+ | `hide` | `() => void` | Hide loading |
1297
+ | `setProgress` | `(percent: number \| undefined) => void` | Set progress |
1298
+
1299
+ ---
1300
+
1301
+ ### Print
1302
+
1303
+ #### Print / usePrint
1304
+
1305
+ Browser printing and PDF generation. Requires `LoadingProvider`.
1306
+
1307
+ ```tsx
1308
+ import { Print, usePrint } from "@simplysm/solid";
1309
+
1310
+ function MyComponent() {
1311
+ const { toPrinter, toPdf } = usePrint();
1312
+
1313
+ const handlePrint = async () => {
1314
+ await toPrinter(
1315
+ () => (
1316
+ <Print>
1317
+ <Print.Page>
1318
+ <h1>Print content</h1>
1319
+ <p>Page 1</p>
1320
+ </Print.Page>
1321
+ <Print.Page>
1322
+ <p>Page 2</p>
1323
+ </Print.Page>
1324
+ </Print>
1325
+ ),
1326
+ { size: "A4", margin: "10mm" },
1327
+ );
1328
+ };
1329
+
1330
+ const handlePdf = async () => {
1331
+ const pdfData = await toPdf(
1332
+ () => (
1333
+ <Print>
1334
+ <Print.Page>
1335
+ <h1>PDF content</h1>
1336
+ </Print.Page>
1337
+ </Print>
1338
+ ),
1339
+ { size: "A4 landscape" },
1340
+ );
1341
+ // pdfData: Uint8Array
1342
+ };
1343
+
1344
+ return (
1345
+ <>
1346
+ <Button onClick={handlePrint}>Print</Button>
1347
+ <Button onClick={handlePdf}>Download PDF</Button>
1348
+ </>
1349
+ );
1350
+ }
1351
+ ```
1352
+
1353
+ **usePrint API:**
1354
+
1355
+ | Method | Signature | Description |
1356
+ |--------|-----------|-------------|
1357
+ | `toPrinter` | `(factory: () => JSX.Element, options?: PrintOptions) => Promise<void>` | Browser print |
1358
+ | `toPdf` | `(factory: () => JSX.Element, options?: PrintOptions) => Promise<Uint8Array>` | PDF generation |
1359
+
1360
+ **PrintOptions:**
1361
+
1362
+ | Option | Type | Default | Description |
1363
+ |--------|------|---------|-------------|
1364
+ | `size` | `string` | `"A4"` | Paper size (`"A4"`, `"A3"`, `"A4 landscape"`, `"210mm 297mm"`, etc.) |
1365
+ | `margin` | `string` | `"0"` | Margins (`"10mm"`, `"1cm"`, etc.) |
1366
+
1367
+ **Sub-components:**
1368
+ - `Print.Page` -- Explicit page breaks (auto-breaks if not used)
1369
+
1370
+ ---
1371
+
1372
+ ## Context & Hooks
1373
+
1374
+ ### useTheme
1375
+
1376
+ Hook to access theme (dark/light/system) state. Must be used inside `ThemeProvider`.
1377
+
1378
+ ```tsx
1379
+ import { useTheme } from "@simplysm/solid";
1380
+
1381
+ const theme = useTheme();
1382
+ theme.mode(); // "light" | "dark" | "system"
1383
+ theme.resolvedTheme(); // "light" | "dark" (follows OS setting when system)
1384
+ theme.setMode("dark");
1385
+ theme.cycleMode(); // light -> system -> dark -> light
1386
+ ```
1387
+
1388
+ | Property/Method | Type | Description |
1389
+ |-----------------|------|-------------|
1390
+ | `mode` | `() => ThemeMode` | Current theme mode |
1391
+ | `resolvedTheme` | `() => ResolvedTheme` | Actual applied theme |
1392
+ | `setMode` | `(mode: ThemeMode) => void` | Set theme mode |
1393
+ | `cycleMode` | `() => void` | Cycle to next mode |
1394
+
1395
+ ---
1396
+
1397
+ ### usePersisted
1398
+
1399
+ localStorage-based persistent signal. Must be used inside `ConfigContext`, and keys are automatically stored as `{clientName}.{key}`. Supports serialization of `@simplysm/core-common` custom types like `DateTime`, `DateOnly`.
1400
+
1401
+ ```tsx
1402
+ import { usePersisted } from "@simplysm/solid";
1403
+
1404
+ const [value, setValue] = usePersisted("settings.view", "grid");
1405
+
1406
+ // loading state (for async storage)
1407
+ const [data, setData, loading] = usePersisted("cache.data", defaultData);
1408
+ ```
1409
+
1410
+ | Return value | Type | Description |
1411
+ |--------------|------|-------------|
1412
+ | `[0]` | `Accessor<T>` | Value getter |
1413
+ | `[1]` | `Setter<T>` | Value setter |
1414
+ | `[2]` | `Accessor<boolean>` | Loading state (async storage only) |
1415
+
1416
+ ---
1417
+
1418
+ ### useNotification
1419
+
1420
+ Hook to access notification system. Must be used inside `NotificationProvider`. See [Notification](#notification) section for detailed API.
1421
+
1422
+ ---
1423
+
1424
+ ### useLoading
1425
+
1426
+ Hook to access loading overlay. Must be used inside `LoadingProvider`. See [Loading](#loading) section for detailed API.
1427
+
1428
+ ---
1429
+
1430
+ ### usePrint
1431
+
1432
+ Hook for printing and PDF generation. Must be used inside `LoadingProvider`. See [Print](#print--useprint) section for detailed API.
1433
+
1434
+ ---
1435
+
1436
+ ### useConfig
1437
+
1438
+ Hook to access app-wide configuration. Must be used inside `ConfigContext.Provider` or `InitializeProvider`.
1439
+
1440
+ ```tsx
1441
+ import { useConfig } from "@simplysm/solid";
1442
+
1443
+ const config = useConfig();
1444
+ console.log(config.clientName); // "my-app"
1445
+ ```
1446
+
1447
+ ---
1448
+
1449
+ ### createControllableSignal
1450
+
1451
+ Signal hook that automatically handles Controlled/Uncontrolled patterns. Operates in controlled mode when `onChange` is provided, uncontrolled mode otherwise.
1452
+
1453
+ ```tsx
1454
+ import { createControllableSignal } from "@simplysm/solid";
1455
+
1456
+ // Use inside components
1457
+ const [value, setValue] = createControllableSignal({
1458
+ value: () => props.value ?? "",
1459
+ onChange: () => props.onValueChange,
1460
+ });
1461
+
1462
+ // Supports functional setter
1463
+ setValue((prev) => prev + "!");
1464
+ ```
1465
+
1466
+ ---
1467
+
1468
+ ### createMountTransition
1469
+
1470
+ Mount transition hook for open/close CSS animations. Control DOM rendering with `mounted()` and toggle CSS classes with `animating()`.
1471
+
1472
+ ```tsx
1473
+ import { createMountTransition } from "@simplysm/solid";
1474
+
1475
+ const { mounted, animating, unmount } = createMountTransition(() => open());
1476
+ ```
1477
+
1478
+ | Return value | Type | Description |
1479
+ |--------------|------|-------------|
1480
+ | `mounted` | `() => boolean` | Whether mounted in DOM |
1481
+ | `animating` | `() => boolean` | Animation active state |
1482
+ | `unmount` | `() => void` | Manual unmount |
1483
+
1484
+ ---
1485
+
1486
+ ### createIMEHandler
1487
+
1488
+ Hook that delays `onValueChange` calls during IME (Korean, etc.) composition to prevent interrupted input.
1489
+
1490
+ ---
1491
+
1492
+ ### useRouterLink
1493
+
1494
+ `@solidjs/router`-based navigation hook. Automatically handles Ctrl/Alt + click (new tab), Shift + click (new window).
1495
+
1496
+ ```tsx
1497
+ import { useRouterLink } from "@simplysm/solid";
1498
+
1499
+ const navigate = useRouterLink();
1500
+
1501
+ <List.Item onClick={navigate({ href: "/home/dashboard" })}>
1502
+ Dashboard
1503
+ </List.Item>
1504
+
1505
+ // Pass state
1506
+ <List.Item onClick={navigate({ href: "/users/123", state: { from: "list" } })}>
1507
+ User
1508
+ </List.Item>
1509
+ ```
1510
+
1511
+ ---
1512
+
1513
+ ### createAppStructure
1514
+
1515
+ Utility for declaratively defining app structure (routing, menus, permissions).
1516
+
1517
+ ```tsx
1518
+ import { createAppStructure, type AppStructureItem } from "@simplysm/solid";
1519
+
1520
+ const items: AppStructureItem<string>[] = [
1521
+ {
1522
+ code: "home",
1523
+ title: "Home",
1524
+ component: HomePage,
1525
+ perms: ["use"],
1526
+ },
1527
+ {
1528
+ code: "admin",
1529
+ title: "Admin",
1530
+ children: [
1531
+ { code: "users", title: "User Management", component: UsersPage, perms: ["use", "edit"] },
1532
+ ],
1533
+ },
1534
+ ];
1535
+
1536
+ const structure = createAppStructure(items, {
1537
+ modules: () => activeModules(),
1538
+ basePath: "/app",
1539
+ });
1540
+
1541
+ // structure.routes -- Route array (pass to Route component)
1542
+ // structure.usableMenus() -- Sidebar menu array
1543
+ // structure.permRecord() -- Permission record (Record<string, boolean>)
1544
+ ```
1545
+
1546
+ ---
1547
+
1548
+ ## Directives
1549
+
1550
+ ### ripple
1551
+
1552
+ Material Design ripple effect directive. Displays ripple effect on click.
1553
+
1554
+ ```tsx
1555
+ import { ripple } from "@simplysm/solid";
1556
+ // Keep reference to register directive
1557
+ void ripple;
1558
+
1559
+ <button use:ripple={true}>Click</button>
1560
+ <button use:ripple={!props.disabled}>Conditional activation</button>
1561
+ ```
1562
+
1563
+ - Creates internal ripple container, operates without affecting parent element
1564
+ - Automatically disabled when `prefers-reduced-motion: reduce` is set
1565
+ - Single ripple mode: removes previous ripple on new click
1566
+
1567
+ ---
1568
+
1569
+ ## Tailwind Theme
1570
+
1571
+ `@simplysm/solid` provides the following custom themes via Tailwind CSS preset.
1572
+
1573
+ ### Semantic Colors
1574
+
1575
+ | Name | Base Color | Usage |
1576
+ |------|------------|-------|
1577
+ | `primary` | blue | Primary actions |
1578
+ | `info` | sky | Information |
1579
+ | `success` | green | Success |
1580
+ | `warning` | amber | Warning |
1581
+ | `danger` | red | Danger/error |
1582
+ | `base` | zinc | Neutral (backgrounds, borders, secondary text, etc.) |
1583
+
1584
+ > Use `base-*` instead of directly using `zinc-*`.
1585
+
1586
+ ### Custom Sizes
1587
+
1588
+ | Class | Description |
1589
+ |-------|-------------|
1590
+ | `h-field` / `size-field` | Default field height (based on `py-1`) |
1591
+ | `h-field-sm` / `size-field-sm` | Small field height (based on `py-0.5`) |
1592
+ | `h-field-lg` / `size-field-lg` | Large field height (based on `py-2`) |
1593
+ | `h-field-inset` / `size-field-inset` | Inset field height (excludes border) |
1594
+ | `h-field-inset-sm` / `size-field-inset-sm` | Small inset field height |
1595
+ | `h-field-inset-lg` / `size-field-inset-lg` | Large inset field height |
1596
+
1597
+ ### z-index Layers
1598
+
1599
+ | Class | Value | Description |
1600
+ |-------|-------|-------------|
1601
+ | `z-sidebar` | 100 | Sidebar |
1602
+ | `z-sidebar-backdrop` | 99 | Sidebar backdrop |
1603
+ | `z-busy` | 500 | Loading overlay |
1604
+ | `z-dropdown` | 1000 | Dropdown popup |
1605
+ | `z-modal-backdrop` | 1999 | Modal backdrop |
1606
+ | `z-modal` | 2000 | Modal dialog |
1607
+
1608
+ ### Dark Mode
1609
+
1610
+ Uses Tailwind's `class` strategy. `ThemeProvider` automatically toggles the `dark` class on the `<html>` element.
1611
+
1612
+ ```html
1613
+ <!-- Light mode -->
1614
+ <html>
1615
+ <!-- Dark mode -->
1616
+ <html class="dark">
1617
+ ```
1618
+
1619
+ ### Styling Patterns
1620
+
1621
+ When using Tailwind classes in components, group them by semantic units with `clsx` and resolve conflicts with `twMerge`:
1622
+
1623
+ ```typescript
1624
+ import clsx from "clsx";
1625
+ import { twMerge } from "tailwind-merge";
1626
+
1627
+ const baseClass = clsx(
1628
+ "inline-flex items-center",
1629
+ "px-2 py-1",
1630
+ "rounded",
1631
+ "border border-transparent",
1632
+ );
1633
+
1634
+ const className = twMerge(baseClass, props.class);
1635
+ ```
1636
+
1637
+ ---
1638
+
1639
+ ## Demo
1640
+
1641
+ Check out real-world usage examples of all components in the `solid-demo` package:
1642
+
1643
+ ```bash
1644
+ pnpm dev
1645
+ # http://localhost:40081 (port may vary)
1646
+ ```
1647
+
1648
+ ---
1649
+
1650
+ ## License
1651
+
1652
+ Apache-2.0