@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
@@ -0,0 +1,1198 @@
1
+ import { children, createMemo, createSignal, For, type JSX, Show, splitProps, useContext } from "solid-js";
2
+ import { createResizeObserver } from "@solid-primitives/resize-observer";
3
+ import clsx from "clsx";
4
+ import { twMerge } from "tailwind-merge";
5
+ import {
6
+ IconArrowsSort,
7
+ IconChevronDown,
8
+ IconChevronRight,
9
+ IconGripVertical,
10
+ IconSettings,
11
+ IconSortAscending,
12
+ IconSortDescending,
13
+ } from "@tabler/icons-solidjs";
14
+ import "@simplysm/core-browser";
15
+ import type {
16
+ FlatItem,
17
+ DataSheetColumnDef,
18
+ DataSheetConfig,
19
+ DataSheetConfigColumnInfo,
20
+ DataSheetProps,
21
+ DataSheetReorderEvent,
22
+ SortingDef,
23
+ } from "./types";
24
+ import { isDataSheetColumnDef, DataSheetColumn } from "./DataSheetColumn";
25
+ import { applySorting, buildHeaderTable, collectAllExpandable, flattenTree } from "./sheetUtils";
26
+ import { createControllableSignal } from "../../../hooks/createControllableSignal";
27
+ import { Icon } from "../../display/Icon";
28
+ import { Checkbox } from "../../form-control/checkbox/Checkbox";
29
+ import { Pagination } from "../Pagination";
30
+ import { usePersisted } from "../../../hooks/usePersisted";
31
+ import { DialogContext } from "../../disclosure/DialogContext";
32
+ import "./DataSheet.css";
33
+ import {
34
+ configButtonClass,
35
+ defaultContainerClass,
36
+ expandIndentGuideClass,
37
+ expandIndentGuideLineClass,
38
+ expandToggleClass,
39
+ featureCellBodyClickableClass,
40
+ featureCellBodyWrapperClass,
41
+ featureCellClickableClass,
42
+ featureCellWrapperClass,
43
+ featureTdClass,
44
+ featureThClass,
45
+ fixedClass,
46
+ fixedLastClass,
47
+ insetContainerClass,
48
+ insetTableClass,
49
+ reorderCellWrapperClass,
50
+ reorderHandleClass,
51
+ reorderIndicatorClass,
52
+ resizeIndicatorClass,
53
+ resizerClass,
54
+ selectSingleClass,
55
+ selectSingleSelectedClass,
56
+ selectSingleUnselectedClass,
57
+ dataSheetContainerClass,
58
+ sortableThClass,
59
+ sortIconClass,
60
+ summaryThClass,
61
+ tableClass,
62
+ tdClass,
63
+ thClass,
64
+ thContentClass,
65
+ toolbarClass,
66
+ } from "./DataSheet.styles";
67
+
68
+ interface DataSheetComponent {
69
+ <T>(props: DataSheetProps<T>): JSX.Element;
70
+ Column: typeof DataSheetColumn;
71
+ }
72
+
73
+ export const DataSheet: DataSheetComponent = <T,>(props: DataSheetProps<T>) => {
74
+ const [local] = splitProps(props, [
75
+ "items",
76
+ "persistKey",
77
+ "hideConfigBar",
78
+ "inset",
79
+ "contentStyle",
80
+ "sorts",
81
+ "onSortsChange",
82
+ "autoSort",
83
+ "pageIndex",
84
+ "onPageIndexChange",
85
+ "totalPageCount",
86
+ "itemsPerPage",
87
+ "displayPageCount",
88
+ "expandedItems",
89
+ "onExpandedItemsChange",
90
+ "getChildren",
91
+ "selectMode",
92
+ "selectedItems",
93
+ "onSelectedItemsChange",
94
+ "autoSelect",
95
+ "isItemSelectable",
96
+ "cellClass",
97
+ "cellStyle",
98
+ "onItemsReorder",
99
+ "class",
100
+ "children",
101
+ ]);
102
+
103
+ const modal = useContext(DialogContext);
104
+
105
+ // #region Column Collection
106
+ const resolved = children(() => local.children);
107
+ const columnDefs = createMemo(() =>
108
+ (resolved.toArray().filter(isDataSheetColumnDef) as unknown as DataSheetColumnDef<T>[]).filter(
109
+ (col) => !col.hidden,
110
+ ),
111
+ );
112
+
113
+ // #region Config (usePersisted)
114
+ /* eslint-disable solid/reactivity -- persistKey는 정적 값으로 컴포넌트 마운트 시 한 번만 사용됨 */
115
+ const [config, setConfig] =
116
+ local.persistKey != null && local.persistKey !== ""
117
+ ? usePersisted<DataSheetConfig>(`sheet.${local.persistKey}`, { columnRecord: {} })
118
+ : createSignal<DataSheetConfig>({ columnRecord: {} });
119
+ /* eslint-enable solid/reactivity */
120
+
121
+ // 설정이 적용된 최종 컬럼 — config의 hidden/fixed/width/displayOrder 오버라이드 적용
122
+ const effectiveColumns = createMemo(() => {
123
+ const cols = columnDefs(); // 이미 col.hidden (코드 설정) 필터링됨
124
+ const record = config().columnRecord ?? {};
125
+
126
+ return cols
127
+ .filter((col) => {
128
+ // config에서 hidden으로 설정된 컬럼 제외
129
+ const saved = record[col.key];
130
+ return !saved?.hidden;
131
+ })
132
+ .map((col) => {
133
+ const saved = record[col.key];
134
+ if (saved == null) return col;
135
+ return {
136
+ ...col,
137
+ fixed: saved.fixed ?? col.fixed,
138
+ width: saved.width ?? col.width,
139
+ };
140
+ })
141
+ .sort((a, b) => {
142
+ const orderA = record[a.key]?.displayOrder ?? Infinity;
143
+ const orderB = record[b.key]?.displayOrder ?? Infinity;
144
+ return orderA - orderB;
145
+ });
146
+ });
147
+
148
+ function saveColumnWidth(colKey: string, width: string | undefined): void {
149
+ const prev = config();
150
+ const record = { ...prev.columnRecord };
151
+ record[colKey] = { ...record[colKey], width };
152
+ setConfig({ ...prev, columnRecord: record });
153
+ }
154
+
155
+ async function openConfigModal(): Promise<void> {
156
+ if (!modal) return;
157
+
158
+ const { DataSheetConfigDialog } = await import("./DataSheetConfigDialog");
159
+
160
+ const allCols = resolved.toArray().filter(isDataSheetColumnDef) as unknown as DataSheetColumnDef<T>[];
161
+
162
+ const columnInfos: DataSheetConfigColumnInfo[] = allCols
163
+ .filter((col) => !col.collapse)
164
+ .map((col) => ({
165
+ key: col.key,
166
+ header: col.header,
167
+ fixed: col.fixed,
168
+ hidden: col.hidden,
169
+ collapse: col.collapse,
170
+ width: col.width,
171
+ }));
172
+
173
+ const currentConfig = config();
174
+
175
+ const result = await modal.show<DataSheetConfig>(
176
+ () => <DataSheetConfigDialog columnInfos={columnInfos} currentConfig={currentConfig} />,
177
+ {
178
+ title: "시트 설정",
179
+ closeOnBackdrop: true,
180
+ closeOnEscape: true,
181
+ },
182
+ );
183
+
184
+ if (result) {
185
+ setConfig(result);
186
+ }
187
+ }
188
+
189
+ // #region Header
190
+ const headerTable = createMemo(() => buildHeaderTable(effectiveColumns()));
191
+ const hasSummary = createMemo(() => effectiveColumns().some((col) => col.summary != null));
192
+
193
+ // #region Sorting
194
+ const [sorts, setSorts] = createControllableSignal({
195
+ value: () => local.sorts ?? [],
196
+ onChange: () => local.onSortsChange,
197
+ });
198
+
199
+ function toggleSort(key: string, multiple: boolean): void {
200
+ const current = sorts();
201
+ const existing = current.find((s) => s.key === key);
202
+
203
+ if (existing) {
204
+ if (!existing.desc) {
205
+ // asc → desc
206
+ const updated = current.map((s) => (s.key === key ? { ...s, desc: true } : s));
207
+ setSorts(multiple ? updated : [{ key, desc: true }]);
208
+ } else {
209
+ // desc → 제거
210
+ const updated = current.filter((s) => s.key !== key);
211
+ setSorts(multiple ? updated : []);
212
+ }
213
+ } else {
214
+ // 없음 → asc 추가
215
+ const newSort: SortingDef = { key, desc: false };
216
+ setSorts(multiple ? [...current, newSort] : [newSort]);
217
+ }
218
+ }
219
+
220
+ function getSortDef(key: string): SortingDef | undefined {
221
+ return sorts().find((s) => s.key === key);
222
+ }
223
+
224
+ function getSortIndex(key: string): number | undefined {
225
+ if (sorts().length <= 1) return undefined;
226
+ const idx = sorts().findIndex((s) => s.key === key);
227
+ return idx >= 0 ? idx + 1 : undefined;
228
+ }
229
+
230
+ const sortedItems = createMemo(() => {
231
+ if (!local.autoSort) return local.items ?? [];
232
+ return applySorting(local.items ?? [], sorts());
233
+ });
234
+
235
+ // #region Paging
236
+ const [currentPage, setCurrentPage] = createControllableSignal({
237
+ value: () => local.pageIndex ?? 0,
238
+ onChange: () => local.onPageIndexChange,
239
+ });
240
+
241
+ const effectivePageCount = createMemo(() => {
242
+ const ipp = local.itemsPerPage;
243
+ if (ipp != null && ipp !== 0 && (local.items ?? []).length > 0) {
244
+ return Math.ceil((local.items ?? []).length / ipp);
245
+ }
246
+ return local.totalPageCount ?? 0;
247
+ });
248
+
249
+ const pagedItems = createMemo(() => {
250
+ const ipp = local.itemsPerPage;
251
+ if (ipp == null || ipp === 0) return sortedItems();
252
+ if ((local.items ?? []).length <= 0) return sortedItems();
253
+
254
+ const page = currentPage();
255
+ return sortedItems().slice(page * ipp, (page + 1) * ipp);
256
+ });
257
+
258
+ // #region Feature Column Setup (확장/선택 기능 컬럼 공통)
259
+ const hasExpandFeature = () => local.getChildren != null;
260
+ const hasSelectFeature = () => local.selectMode != null;
261
+ const hasReorderFeature = () => local.onItemsReorder != null;
262
+
263
+ // 기능 컬럼 너비 추적 헬퍼
264
+ function createTrackedWidth(): [() => number, (el: HTMLElement) => void] {
265
+ const [width, setWidth] = createSignal(0);
266
+ const register = (el: HTMLElement) => {
267
+ createResizeObserver(el, () => {
268
+ setWidth(el.offsetWidth);
269
+ });
270
+ };
271
+ return [width, register];
272
+ }
273
+
274
+ const [expandColWidth, registerExpandColRef] = createTrackedWidth();
275
+ const [selectColWidth, registerSelectColRef] = createTrackedWidth();
276
+ const [reorderColWidth, registerReorderColRef] = createTrackedWidth();
277
+
278
+ // 기능 컬럼 left 위치 (선택/재정렬 컬럼의 style에 사용)
279
+ const selectColLeft = createMemo(() => (hasExpandFeature() ? `${expandColWidth()}px` : "0"));
280
+
281
+ const reorderColLeft = createMemo(() => {
282
+ let left = 0;
283
+ if (hasExpandFeature()) left += expandColWidth();
284
+ if (hasSelectFeature()) left += selectColWidth();
285
+ return `${left}px`;
286
+ });
287
+
288
+ // #region ColumnFixing
289
+ // 각 컬럼 셀의 ref → 너비 측정용
290
+ const columnRefs = new Map<number, HTMLElement>();
291
+
292
+ // 각 컬럼의 측정된 너비
293
+ const [columnWidths, setColumnWidths] = createSignal<Map<number, number>>(new Map());
294
+
295
+ // 기능 컬럼(확장 등)의 총 너비 — 고정 컬럼 left 오프셋에 사용
296
+ const featureColTotalWidth = createMemo(() => {
297
+ let w = 0;
298
+ if (hasExpandFeature()) w += expandColWidth();
299
+ if (hasSelectFeature()) w += selectColWidth();
300
+ if (hasReorderFeature()) w += reorderColWidth();
301
+ return w;
302
+ });
303
+
304
+ // 고정 컬럼의 left 위치 계산
305
+ const fixedLeftMap = createMemo(() => {
306
+ const map = new Map<number, number>();
307
+ const cols = effectiveColumns();
308
+ const widths = columnWidths();
309
+ let left = featureColTotalWidth();
310
+ for (let c = 0; c < cols.length; c++) {
311
+ if (!cols[c].fixed) break; // 고정 컬럼은 앞쪽에 연속 배치
312
+ map.set(c, left);
313
+ left += widths.get(c) ?? 0;
314
+ }
315
+ return map;
316
+ });
317
+
318
+ // 마지막 고정 컬럼 인덱스
319
+ const lastFixedIndex = createMemo(() => {
320
+ const cols = effectiveColumns();
321
+ let last = -1;
322
+ for (let c = 0; c < cols.length; c++) {
323
+ if (cols[c].fixed) last = c;
324
+ else break;
325
+ }
326
+ return last;
327
+ });
328
+
329
+ function getFixedStyle(colIndex: number): string | undefined {
330
+ const leftVal = fixedLeftMap().get(colIndex);
331
+ if (leftVal == null) return undefined;
332
+ return `left: ${leftVal}px`;
333
+ }
334
+
335
+ function isLastFixed(colIndex: number): boolean {
336
+ return colIndex === lastFixedIndex();
337
+ }
338
+
339
+ // 고정 컬럼 셀에 ResizeObserver 등록
340
+ function registerColumnRef(colIndex: number, el: HTMLElement): void {
341
+ columnRefs.set(colIndex, el);
342
+ createResizeObserver(el, () => {
343
+ setColumnWidths((prev) => {
344
+ const next = new Map(prev);
345
+ next.set(colIndex, el.offsetWidth);
346
+ return next;
347
+ });
348
+ });
349
+ }
350
+
351
+ // #region Resizing
352
+ const [resizeIndicatorStyle, setResizeIndicatorStyle] = createSignal<JSX.CSSProperties>({
353
+ display: "none",
354
+ });
355
+
356
+ function onResizerPointerdown(event: PointerEvent, colKey: string): void {
357
+ event.preventDefault();
358
+ const target = event.target as HTMLElement;
359
+ target.setPointerCapture(event.pointerId);
360
+
361
+ const th = target.closest("th")!;
362
+ const container = th.closest("[data-sheet]")!.querySelector("[data-sheet-scroll]") as HTMLElement;
363
+ const startX = event.clientX;
364
+ const startWidth = th.offsetWidth;
365
+
366
+ // 리사이즈 인디케이터 표시
367
+ const containerRect = container.getBoundingClientRect();
368
+ setResizeIndicatorStyle({
369
+ display: "block",
370
+ left: `${th.getBoundingClientRect().right - containerRect.left + container.scrollLeft}px`,
371
+ top: "0",
372
+ height: `${container.scrollHeight}px`,
373
+ });
374
+
375
+ const onPointerMove = (e: PointerEvent) => {
376
+ const delta = e.clientX - startX;
377
+ const newWidth = Math.max(30, startWidth + delta);
378
+ const currentRect = container.getBoundingClientRect();
379
+ setResizeIndicatorStyle({
380
+ display: "block",
381
+ left: `${th.getBoundingClientRect().left - currentRect.left + container.scrollLeft + newWidth}px`,
382
+ top: "0",
383
+ height: `${container.scrollHeight}px`,
384
+ });
385
+ };
386
+
387
+ const onPointerUp = (e: PointerEvent) => {
388
+ const delta = e.clientX - startX;
389
+ // 실제 드래그가 발생한 경우에만 너비 저장 (더블클릭 시 DOM 재생성으로 dblclick 유실 방지)
390
+ if (delta !== 0) {
391
+ const newWidth = Math.max(30, startWidth + delta);
392
+ saveColumnWidth(colKey, `${newWidth}px`);
393
+ }
394
+ setResizeIndicatorStyle({ display: "none" });
395
+ target.removeEventListener("pointermove", onPointerMove);
396
+ target.removeEventListener("pointerup", onPointerUp);
397
+ };
398
+
399
+ target.addEventListener("pointermove", onPointerMove);
400
+ target.addEventListener("pointerup", onPointerUp);
401
+ }
402
+
403
+ function onResizerDoubleClick(colKey: string): void {
404
+ saveColumnWidth(colKey, undefined);
405
+ }
406
+
407
+ // #region HeaderSticky
408
+ // 각 헤더 행의 높이를 추적하여 누적 top 값 계산
409
+ const [headerRowHeights, setHeaderRowHeights] = createSignal<number[]>([]);
410
+
411
+ function registerHeaderRow(rowIndex: number, el: HTMLElement): void {
412
+ createResizeObserver(el, (rect) => {
413
+ setHeaderRowHeights((prev) => {
414
+ const next = [...prev];
415
+ next[rowIndex] = rect.height;
416
+ return next;
417
+ });
418
+ });
419
+ }
420
+
421
+ // 각 헤더 행의 누적 top 값
422
+ const headerRowTops = createMemo(() => {
423
+ const heights = headerRowHeights();
424
+ const tops: number[] = [];
425
+ let acc = 0;
426
+ for (let i = 0; i < heights.length; i++) {
427
+ tops.push(acc);
428
+ acc += heights[i] ?? 0;
429
+ }
430
+ return tops;
431
+ });
432
+
433
+ // 합계 행의 top 값 (모든 헤더 행 높이 합)
434
+ const summaryRowTop = createMemo(() => {
435
+ const heights = headerRowHeights();
436
+ return heights.reduce((sum, h) => sum + h, 0);
437
+ });
438
+
439
+ // #region Expanding
440
+ const [expandedItems, setExpandedItems] = createControllableSignal({
441
+ value: () => local.expandedItems ?? [],
442
+ onChange: () => local.onExpandedItemsChange,
443
+ });
444
+
445
+ function toggleExpand(item: T): void {
446
+ const current = expandedItems();
447
+ if (current.includes(item)) {
448
+ setExpandedItems(current.filter((i) => i !== item));
449
+ } else {
450
+ setExpandedItems([...current, item]);
451
+ }
452
+ }
453
+
454
+ function toggleExpandAll(): void {
455
+ if (!local.getChildren) return;
456
+ const allExpandable = collectAllExpandable(pagedItems(), local.getChildren);
457
+ const isAllExpanded = allExpandable.every((item) => expandedItems().includes(item));
458
+ setExpandedItems(isAllExpanded ? [] : allExpandable);
459
+ }
460
+
461
+ const flatItems = createMemo((): FlatItem<T>[] => {
462
+ return flattenTree(pagedItems(), expandedItems(), local.getChildren);
463
+ });
464
+
465
+ // #region Selection
466
+ const [selectedItems, setSelectedItems] = createControllableSignal({
467
+ value: () => local.selectedItems ?? [],
468
+ onChange: () => local.onSelectedItemsChange,
469
+ });
470
+
471
+ const [lastClickedRow, setLastClickedRow] = createSignal<number | null>(null);
472
+ const [lastClickAction, setLastClickAction] = createSignal<"select" | "deselect">("select");
473
+
474
+ function getItemSelectable(item: T): boolean | string {
475
+ if (!local.isItemSelectable) return true;
476
+ return local.isItemSelectable(item);
477
+ }
478
+
479
+ function toggleSelect(item: T): void {
480
+ if (getItemSelectable(item) !== true) return;
481
+ const isSelected = selectedItems().includes(item);
482
+ setLastClickAction(isSelected ? "deselect" : "select");
483
+
484
+ if (local.selectMode === "single") {
485
+ setSelectedItems(isSelected ? [] : [item]);
486
+ } else {
487
+ setSelectedItems(isSelected ? selectedItems().filter((i) => i !== item) : [...selectedItems(), item]);
488
+ }
489
+ }
490
+
491
+ function toggleSelectAll(): void {
492
+ const selectableItems = displayItems()
493
+ .map((flat) => flat.item)
494
+ .filter((item) => getItemSelectable(item) === true);
495
+ const isAllSelected = selectableItems.every((item) => selectedItems().includes(item));
496
+ setSelectedItems(isAllSelected ? [] : selectableItems);
497
+ }
498
+
499
+ function rangeSelect(targetRow: number): void {
500
+ const lastRow = lastClickedRow();
501
+ if (lastRow == null) return;
502
+
503
+ const start = Math.min(lastRow, targetRow);
504
+ const end = Math.max(lastRow, targetRow);
505
+
506
+ const rangeItems = displayItems()
507
+ .slice(start, end + 1)
508
+ .map((flat) => flat.item)
509
+ .filter((item) => getItemSelectable(item) === true);
510
+
511
+ if (lastClickAction() === "select") {
512
+ const newItems = [...selectedItems()];
513
+ for (const item of rangeItems) {
514
+ if (!newItems.includes(item)) newItems.push(item);
515
+ }
516
+ setSelectedItems(newItems);
517
+ } else {
518
+ setSelectedItems(selectedItems().filter((item) => !rangeItems.includes(item)));
519
+ }
520
+ }
521
+
522
+ // #region AutoSelect
523
+ function selectItem(item: T): void {
524
+ if (getItemSelectable(item) !== true) return;
525
+ if (local.selectMode === "single") {
526
+ setSelectedItems([item]);
527
+ } else {
528
+ if (!selectedItems().includes(item)) {
529
+ setSelectedItems([...selectedItems(), item]);
530
+ }
531
+ }
532
+ }
533
+
534
+ // #region Reorder
535
+ const [dragState, setDragState] = createSignal<{
536
+ draggingItem: T;
537
+ targetItem: T | null;
538
+ position: "before" | "after" | "inside" | null;
539
+ } | null>(null);
540
+
541
+ function isDescendant(parent: T, child: T): boolean {
542
+ if (!local.getChildren) return false;
543
+ const childItems = local.getChildren(parent, 0);
544
+ if (!childItems) return false;
545
+ for (const c of childItems) {
546
+ if (c === child) return true;
547
+ if (isDescendant(c, child)) return true;
548
+ }
549
+ return false;
550
+ }
551
+
552
+ function onReorderPointerDown(e: PointerEvent, item: T): void {
553
+ e.preventDefault();
554
+ const target = e.currentTarget as HTMLElement;
555
+ target.setPointerCapture(e.pointerId);
556
+
557
+ const tableEl = target.closest("table")!;
558
+ const tbody = tableEl.querySelector("tbody")!;
559
+ const rows = Array.from(tbody.rows);
560
+
561
+ setDragState({ draggingItem: item, targetItem: null, position: null });
562
+
563
+ const onPointerMove = (ev: PointerEvent) => {
564
+ let foundTarget: T | null = null;
565
+ let foundPosition: "before" | "after" | "inside" | null = null;
566
+
567
+ for (let i = 0; i < rows.length; i++) {
568
+ const row = rows[i];
569
+ const rect = row.getBoundingClientRect();
570
+ if (ev.clientY < rect.top || ev.clientY > rect.bottom) continue;
571
+
572
+ if (i >= displayItems().length) break;
573
+ const flat = displayItems()[i];
574
+ if (flat.item === item) break;
575
+
576
+ // 자기 자신의 하위 항목으로는 드롭 불가
577
+ if (isDescendant(item, flat.item)) break;
578
+
579
+ const relY = ev.clientY - rect.top;
580
+ const third = rect.height / 3;
581
+
582
+ if (relY < third) {
583
+ foundPosition = "before";
584
+ } else if (relY > third * 2) {
585
+ foundPosition = "after";
586
+ } else {
587
+ foundPosition = local.getChildren ? "inside" : relY < rect.height / 2 ? "before" : "after";
588
+ }
589
+ foundTarget = flat.item;
590
+ break;
591
+ }
592
+
593
+ setDragState({ draggingItem: item, targetItem: foundTarget, position: foundPosition });
594
+
595
+ // 인디케이터 DOM 업데이트
596
+ for (let i = 0; i < rows.length; i++) {
597
+ rows[i].removeAttribute("data-dragging");
598
+ rows[i].removeAttribute("data-drag-over");
599
+
600
+ if (i < displayItems().length) {
601
+ const flat = displayItems()[i];
602
+ if (flat.item === item) {
603
+ rows[i].setAttribute("data-dragging", "");
604
+ }
605
+ if (flat.item === foundTarget && foundPosition === "inside") {
606
+ rows[i].setAttribute("data-drag-over", "inside");
607
+ }
608
+ }
609
+ }
610
+
611
+ // before/after 인디케이터
612
+ const indicatorEl = tableEl
613
+ .closest("[data-sheet-scroll]")
614
+ ?.querySelector("[data-reorder-indicator]") as HTMLElement | null;
615
+ if (indicatorEl) {
616
+ if (foundTarget != null && foundPosition != null && foundPosition !== "inside") {
617
+ const targetIdx = displayItems().findIndex((f) => f.item === foundTarget);
618
+ if (targetIdx >= 0) {
619
+ const targetRow = rows[targetIdx];
620
+ const containerRect = tableEl.closest("[data-sheet-scroll]")!.getBoundingClientRect();
621
+ const rowRect = targetRow.getBoundingClientRect();
622
+ const scrollEl = tableEl.closest("[data-sheet-scroll]") as HTMLElement;
623
+
624
+ const top =
625
+ foundPosition === "before"
626
+ ? rowRect.top - containerRect.top + scrollEl.scrollTop
627
+ : rowRect.bottom - containerRect.top + scrollEl.scrollTop;
628
+
629
+ indicatorEl.style.display = "block";
630
+ indicatorEl.style.top = `${top}px`;
631
+ }
632
+ } else {
633
+ indicatorEl.style.display = "none";
634
+ }
635
+ }
636
+ };
637
+
638
+ const onPointerUp = () => {
639
+ const state = dragState();
640
+ if (state?.targetItem != null && state.position != null) {
641
+ local.onItemsReorder?.({
642
+ item: state.draggingItem,
643
+ targetItem: state.targetItem,
644
+ position: state.position,
645
+ } as DataSheetReorderEvent<T>);
646
+ }
647
+
648
+ // 클린업
649
+ for (const row of rows) {
650
+ row.removeAttribute("data-dragging");
651
+ row.removeAttribute("data-drag-over");
652
+ }
653
+ const indicatorEl = tableEl
654
+ .closest("[data-sheet-scroll]")
655
+ ?.querySelector("[data-reorder-indicator]") as HTMLElement | null;
656
+ if (indicatorEl) {
657
+ indicatorEl.style.display = "none";
658
+ }
659
+
660
+ setDragState(null);
661
+ target.removeEventListener("pointermove", onPointerMove);
662
+ target.removeEventListener("pointerup", onPointerUp);
663
+ };
664
+
665
+ target.addEventListener("pointermove", onPointerMove);
666
+ target.addEventListener("pointerup", onPointerUp);
667
+ }
668
+
669
+ // #region Keyboard Navigation (Enter/Shift+Enter로 행 이동)
670
+ function onTableKeyDown(e: KeyboardEvent): void {
671
+ if (e.key !== "Enter" || e.altKey || e.ctrlKey || e.metaKey) return;
672
+
673
+ const focused = document.activeElement;
674
+ if (!(focused instanceof HTMLElement)) return;
675
+
676
+ const td = focused.closest("td");
677
+ if (!td) return;
678
+
679
+ const tr = td.closest("tr");
680
+ if (!tr) return;
681
+
682
+ const tbody = tr.closest("tbody");
683
+ if (!tbody) return;
684
+
685
+ const rows = tbody.rows;
686
+ const rowIndex = Array.from(rows).indexOf(tr);
687
+ if (rowIndex < 0) return;
688
+
689
+ const cellIndex = Array.from(tr.cells).indexOf(td);
690
+ if (cellIndex < 0) return;
691
+
692
+ const targetRowIndex = e.shiftKey ? rowIndex - 1 : rowIndex + 1;
693
+ if (targetRowIndex < 0 || targetRowIndex >= rows.length) return;
694
+
695
+ const targetFocusable = rows[targetRowIndex].cells[cellIndex].findFirstFocusableChild();
696
+ if (!targetFocusable) return;
697
+
698
+ e.preventDefault();
699
+ targetFocusable.focus();
700
+ }
701
+
702
+ // #region Display
703
+ const displayItems = flatItems;
704
+
705
+ // 확장 기능 컬럼이 "마지막 고정"인지 (일반 고정 컬럼이 없고, 선택 컬럼도 없을 때)
706
+ const isExpandColLastFixed = () =>
707
+ hasExpandFeature() && !hasSelectFeature() && !hasReorderFeature() && lastFixedIndex() < 0;
708
+
709
+ // 선택 기능 컬럼이 "마지막 고정"인지 (일반 고정 컬럼이 없고, 선택 컬럼이 가장 오른쪽 기능 컬럼일 때)
710
+ const isSelectColLastFixed = () => hasSelectFeature() && !hasReorderFeature() && lastFixedIndex() < 0;
711
+
712
+ const isReorderColLastFixed = () => hasReorderFeature() && lastFixedIndex() < 0;
713
+
714
+ // 전체 헤더 행 수 + 합계 행 수 (기능 컬럼의 rowspan에 사용)
715
+ const featureHeaderRowspan = createMemo(() => {
716
+ const headerRows = headerTable().length;
717
+ const summaryRow = hasSummary() ? 1 : 0;
718
+ return headerRows + summaryRow;
719
+ });
720
+
721
+ // 전체 확장 상태인지
722
+ const isAllExpanded = createMemo(() => {
723
+ if (!local.getChildren) return false;
724
+ const allExpandable = collectAllExpandable(pagedItems(), local.getChildren);
725
+ return allExpandable.length > 0 && allExpandable.every((item) => expandedItems().includes(item));
726
+ });
727
+
728
+ return (
729
+ <div
730
+ data-sheet={local.persistKey ?? ""}
731
+ class={twMerge("flex flex-col", local.inset ? insetContainerClass : defaultContainerClass, local.class)}
732
+ >
733
+ <Show when={!local.hideConfigBar && (modal != null || effectivePageCount() > 1)}>
734
+ <div class={toolbarClass}>
735
+ <Show when={effectivePageCount() > 1}>
736
+ <Pagination
737
+ pageIndex={currentPage()}
738
+ onPageIndexChange={setCurrentPage}
739
+ totalPageCount={effectivePageCount()}
740
+ displayPageCount={local.displayPageCount}
741
+ size="sm"
742
+ />
743
+ </Show>
744
+ <div class="flex-1" />
745
+ <Show when={modal != null}>
746
+ <button class={configButtonClass} onClick={openConfigModal} title="시트 설정" type="button">
747
+ <Icon icon={IconSettings} size="1em" />
748
+ </button>
749
+ </Show>
750
+ </div>
751
+ </Show>
752
+ <div data-sheet-scroll class={twMerge(dataSheetContainerClass, "flex-1 min-h-0")} style={local.contentStyle}>
753
+ <table
754
+ class={twMerge(tableClass, local.inset ? insetTableClass : undefined)}
755
+ onKeyDown={onTableKeyDown}
756
+ onPointerDown={(e) => {
757
+ if (e.shiftKey && hasSelectFeature()) {
758
+ e.preventDefault();
759
+ }
760
+ }}
761
+ >
762
+ <colgroup>
763
+ <Show when={hasExpandFeature()}>
764
+ <col />
765
+ </Show>
766
+ <Show when={hasSelectFeature()}>
767
+ <col />
768
+ </Show>
769
+ <Show when={hasReorderFeature()}>
770
+ <col />
771
+ </Show>
772
+ <For each={effectiveColumns()}>
773
+ {(col) => <col style={col.width != null ? { width: col.width } : undefined} />}
774
+ </For>
775
+ </colgroup>
776
+ <thead>
777
+ <For each={headerTable()}>
778
+ {(row, rowIndex) => (
779
+ <tr ref={(el: HTMLElement) => registerHeaderRow(rowIndex(), el)}>
780
+ {/* 확장 기능 컬럼 헤더 — 첫 번째 행에만 표시 (rowspan으로 전체 덮기) */}
781
+ <Show when={hasExpandFeature() && rowIndex() === 0}>
782
+ <th
783
+ class={twMerge(
784
+ featureThClass,
785
+ fixedClass,
786
+ "z-[5]",
787
+ isExpandColLastFixed() ? fixedLastClass : undefined,
788
+ )}
789
+ rowspan={featureHeaderRowspan()}
790
+ style={{ top: "0", left: "0" }}
791
+ ref={registerExpandColRef}
792
+ >
793
+ <div class={featureCellWrapperClass}>
794
+ <button
795
+ type="button"
796
+ class={expandToggleClass}
797
+ onClick={toggleExpandAll}
798
+ title={isAllExpanded() ? "전체 접기" : "전체 펼치기"}
799
+ >
800
+ <Icon
801
+ icon={IconChevronDown}
802
+ size="1em"
803
+ class={clsx("transition-transform", isAllExpanded() ? "rotate-0" : "-rotate-90")}
804
+ />
805
+ </button>
806
+ </div>
807
+ </th>
808
+ </Show>
809
+ {/* 선택 기능 컬럼 헤더 — 첫 번째 행에만 표시 (rowspan으로 전체 덮기) */}
810
+ <Show when={hasSelectFeature() && rowIndex() === 0}>
811
+ <th
812
+ class={twMerge(
813
+ featureThClass,
814
+ fixedClass,
815
+ "z-[5]",
816
+ isSelectColLastFixed() ? fixedLastClass : undefined,
817
+ )}
818
+ rowspan={featureHeaderRowspan()}
819
+ style={{
820
+ top: "0",
821
+ left: selectColLeft(),
822
+ }}
823
+ ref={registerSelectColRef}
824
+ >
825
+ <Show when={local.selectMode === "multiple"}>
826
+ <div class={featureCellClickableClass} onClick={() => toggleSelectAll()}>
827
+ <Checkbox
828
+ value={(() => {
829
+ const selectableItems = displayItems()
830
+ .map((flat) => flat.item)
831
+ .filter((item) => getItemSelectable(item) === true);
832
+ return (
833
+ selectableItems.length > 0 &&
834
+ selectableItems.every((item) => selectedItems().includes(item))
835
+ );
836
+ })()}
837
+ inset
838
+ class="pointer-events-none"
839
+ />
840
+ </div>
841
+ </Show>
842
+ </th>
843
+ </Show>
844
+ {/* 드래그 재정렬 기능 컬럼 헤더 — 첫 번째 행에만 표시 */}
845
+ <Show when={hasReorderFeature() && rowIndex() === 0}>
846
+ <th
847
+ class={twMerge(
848
+ featureThClass,
849
+ fixedClass,
850
+ "z-[5]",
851
+ isReorderColLastFixed() ? fixedLastClass : undefined,
852
+ )}
853
+ rowspan={featureHeaderRowspan()}
854
+ style={{
855
+ top: "0",
856
+ left: reorderColLeft(),
857
+ }}
858
+ ref={registerReorderColRef}
859
+ />
860
+ </Show>
861
+ <For each={row}>
862
+ {(cell, cellColIndex) => (
863
+ <Show when={cell}>
864
+ {(c) => {
865
+ const isSortable = () =>
866
+ c().isLastRow && c().colIndex != null && effectiveColumns()[c().colIndex!].sortable;
867
+ const colKey = () =>
868
+ c().colIndex != null ? effectiveColumns()[c().colIndex!].key : undefined;
869
+
870
+ // 그룹 헤더의 고정 여부: colspan 범위 내 모든 컬럼이 fixed인지
871
+ const isGroupFixed = (): boolean => {
872
+ if (c().isLastRow) return false;
873
+ const start = cellColIndex();
874
+ const span = c().colspan;
875
+ const cols = effectiveColumns();
876
+ for (let i = start; i < start + span && i < cols.length; i++) {
877
+ if (!cols[i].fixed) return false;
878
+ }
879
+ return true;
880
+ };
881
+
882
+ // 셀의 고정 컬럼 여부 (마지막 행이면 colIndex 기반, 그 외 그룹 기반)
883
+ const isCellFixed = () =>
884
+ (c().isLastRow && c().colIndex != null && effectiveColumns()[c().colIndex!].fixed) ||
885
+ isGroupFixed();
886
+
887
+ // 셀의 마지막 고정 여부
888
+ const isCellLastFixed = () => {
889
+ if (c().isLastRow && c().colIndex != null) return isLastFixed(c().colIndex!);
890
+ if (isGroupFixed()) {
891
+ const lastCol = cellColIndex() + c().colspan - 1;
892
+ return isLastFixed(lastCol);
893
+ }
894
+ return false;
895
+ };
896
+
897
+ // 고정 셀의 left + top 인라인 style
898
+ const cellStyle = (): string | undefined => {
899
+ const parts: string[] = [];
900
+ // top: 모든 th에 적용 (헤더 상단 고정)
901
+ const top = headerRowTops()[rowIndex()];
902
+ parts.push(`top: ${top}px`);
903
+ // left: 고정 컬럼에만 적용
904
+ if (c().isLastRow && c().colIndex != null) {
905
+ const left = getFixedStyle(c().colIndex!);
906
+ if (left != null) parts.push(left);
907
+ // max-width: 명시적 너비가 있으면 적용 (컬럼이 내용물보다 작아질 수 있도록)
908
+ const col = effectiveColumns()[c().colIndex!];
909
+ if (col.width != null) parts.push(`max-width: ${col.width}`);
910
+ } else if (isGroupFixed()) {
911
+ const left = getFixedStyle(cellColIndex());
912
+ if (left != null) parts.push(left);
913
+ }
914
+ return parts.length > 0 ? parts.join("; ") : undefined;
915
+ };
916
+
917
+ return (
918
+ <th
919
+ class={twMerge(
920
+ thClass,
921
+ fixedClass,
922
+ isSortable() ? sortableThClass : undefined,
923
+ isCellFixed() ? "z-[5]" : "z-[3]",
924
+ isCellLastFixed() ? fixedLastClass : undefined,
925
+ )}
926
+ colspan={c().colspan > 1 ? c().colspan : undefined}
927
+ rowspan={c().rowspan > 1 ? c().rowspan : undefined}
928
+ style={cellStyle()}
929
+ title={
930
+ c().isLastRow && c().colIndex != null
931
+ ? (effectiveColumns()[c().colIndex!].tooltip ?? c().text)
932
+ : c().text
933
+ }
934
+ ref={(el: HTMLElement) => {
935
+ if (c().isLastRow && c().colIndex != null && effectiveColumns()[c().colIndex!].fixed) {
936
+ registerColumnRef(c().colIndex!, el);
937
+ }
938
+ }}
939
+ onClick={(e) => {
940
+ if (!isSortable()) return;
941
+ const key = colKey();
942
+ if (key == null) return;
943
+ toggleSort(key, e.shiftKey || e.ctrlKey);
944
+ }}
945
+ >
946
+ <div class={clsx("flex items-center", thContentClass)}>
947
+ <div class="flex-1">{c().headerContent?.() ?? c().text}</div>
948
+ <Show when={isSortable() && colKey()}>
949
+ {(key) => {
950
+ const sortDef = () => getSortDef(key());
951
+ const sortIndex = () => getSortIndex(key());
952
+ return (
953
+ <div class={sortIconClass}>
954
+ <Show when={sortDef()?.desc === false}>
955
+ <Icon icon={IconSortAscending} size="1em" />
956
+ </Show>
957
+ <Show when={sortDef()?.desc === true}>
958
+ <Icon icon={IconSortDescending} size="1em" />
959
+ </Show>
960
+ <Show when={sortDef() == null}>
961
+ <Icon icon={IconArrowsSort} size="1em" class="opacity-30" />
962
+ </Show>
963
+ <Show when={sortIndex()}>{(idx) => <sub>{idx()}</sub>}</Show>
964
+ </div>
965
+ );
966
+ }}
967
+ </Show>
968
+ </div>
969
+ <Show
970
+ when={
971
+ c().isLastRow && c().colIndex != null && effectiveColumns()[c().colIndex!].resizable
972
+ }
973
+ >
974
+ <div
975
+ class={resizerClass}
976
+ onClick={(e) => e.stopPropagation()}
977
+ onPointerDown={(e) => onResizerPointerdown(e, effectiveColumns()[c().colIndex!].key)}
978
+ onDblClick={(e) => {
979
+ e.stopPropagation();
980
+ onResizerDoubleClick(effectiveColumns()[c().colIndex!].key);
981
+ }}
982
+ />
983
+ </Show>
984
+ </th>
985
+ );
986
+ }}
987
+ </Show>
988
+ )}
989
+ </For>
990
+ </tr>
991
+ )}
992
+ </For>
993
+ <Show when={hasSummary()}>
994
+ <tr>
995
+ {/* 확장 기능 컬럼의 합계 셀은 rowspan으로 이미 덮여있으므로 제외 */}
996
+ <For each={effectiveColumns()}>
997
+ {(col, colIndex) => {
998
+ const summaryStyle = (): string | undefined => {
999
+ const parts: string[] = [];
1000
+ parts.push(`top: ${summaryRowTop()}px`);
1001
+ const left = getFixedStyle(colIndex());
1002
+ if (left != null) parts.push(left);
1003
+ return parts.join("; ");
1004
+ };
1005
+
1006
+ return (
1007
+ <th
1008
+ class={twMerge(
1009
+ thClass,
1010
+ summaryThClass,
1011
+ fixedClass,
1012
+ col.fixed ? "z-[5]" : "z-[3]",
1013
+ isLastFixed(colIndex()) ? fixedLastClass : undefined,
1014
+ )}
1015
+ style={summaryStyle()}
1016
+ >
1017
+ <div class={thContentClass}>{col.summary?.()}</div>
1018
+ </th>
1019
+ );
1020
+ }}
1021
+ </For>
1022
+ </tr>
1023
+ </Show>
1024
+ </thead>
1025
+ <tbody>
1026
+ <For each={displayItems()}>
1027
+ {(flat) => (
1028
+ <tr
1029
+ data-selected={selectedItems().includes(flat.item) ? "" : undefined}
1030
+ onClick={() => {
1031
+ if (local.autoSelect === "click") {
1032
+ selectItem(flat.item);
1033
+ }
1034
+ }}
1035
+ class={local.autoSelect === "click" ? "cursor-pointer" : undefined}
1036
+ >
1037
+ {/* 확장 기능 컬럼 바디 셀 */}
1038
+ <Show when={hasExpandFeature()}>
1039
+ <td
1040
+ class={twMerge(
1041
+ featureTdClass,
1042
+ fixedClass,
1043
+ "z-[2]",
1044
+ isExpandColLastFixed() ? fixedLastClass : undefined,
1045
+ )}
1046
+ style={{ left: "0" }}
1047
+ >
1048
+ <div class={featureCellBodyWrapperClass}>
1049
+ <For each={Array.from({ length: flat.depth })}>
1050
+ {() => (
1051
+ <div class={expandIndentGuideClass}>
1052
+ <div class={expandIndentGuideLineClass} />
1053
+ </div>
1054
+ )}
1055
+ </For>
1056
+ <Show when={flat.hasChildren}>
1057
+ <button type="button" class={expandToggleClass} onClick={() => toggleExpand(flat.item)}>
1058
+ <Icon
1059
+ icon={IconChevronDown}
1060
+ size="1em"
1061
+ class={clsx(
1062
+ "transition-transform",
1063
+ expandedItems().includes(flat.item) ? "rotate-0" : "-rotate-90",
1064
+ )}
1065
+ />
1066
+ </button>
1067
+ </Show>
1068
+ </div>
1069
+ </td>
1070
+ </Show>
1071
+ {/* 선택 기능 컬럼 바디 셀 */}
1072
+ <Show when={hasSelectFeature()}>
1073
+ {(() => {
1074
+ const selectable = () => getItemSelectable(flat.item);
1075
+ const isSelected = () => selectedItems().includes(flat.item);
1076
+ const rowIndex = () => displayItems().indexOf(flat);
1077
+
1078
+ return (
1079
+ <td
1080
+ class={twMerge(
1081
+ featureTdClass,
1082
+ fixedClass,
1083
+ "z-[2]",
1084
+ isSelectColLastFixed() ? fixedLastClass : undefined,
1085
+ )}
1086
+ style={{
1087
+ left: selectColLeft(),
1088
+ }}
1089
+ >
1090
+ <Show
1091
+ when={local.selectMode === "multiple"}
1092
+ fallback={
1093
+ /* single 모드 */
1094
+ <Show when={selectable() === true}>
1095
+ <div class={featureCellBodyClickableClass} onClick={() => toggleSelect(flat.item)}>
1096
+ <div
1097
+ class={twMerge(
1098
+ selectSingleClass,
1099
+ isSelected() ? selectSingleSelectedClass : selectSingleUnselectedClass,
1100
+ )}
1101
+ >
1102
+ <Icon icon={IconChevronRight} size="1em" />
1103
+ </div>
1104
+ </div>
1105
+ </Show>
1106
+ }
1107
+ >
1108
+ {/* multi 모드 */}
1109
+ <div
1110
+ class={featureCellBodyClickableClass}
1111
+ onClick={(e) => {
1112
+ if (e.shiftKey) {
1113
+ rangeSelect(rowIndex());
1114
+ } else {
1115
+ toggleSelect(flat.item);
1116
+ }
1117
+ setLastClickedRow(rowIndex());
1118
+ }}
1119
+ title={typeof selectable() === "string" ? (selectable() as string) : undefined}
1120
+ >
1121
+ <Checkbox
1122
+ value={isSelected()}
1123
+ disabled={selectable() !== true}
1124
+ inset
1125
+ class={twMerge(
1126
+ "pointer-events-none",
1127
+ lastClickedRow() === rowIndex()
1128
+ ? "[&>div]:ring-2 [&>div]:ring-primary-200 dark:[&>div]:ring-primary-700"
1129
+ : undefined,
1130
+ )}
1131
+ />
1132
+ </div>
1133
+ </Show>
1134
+ </td>
1135
+ );
1136
+ })()}
1137
+ </Show>
1138
+ {/* 드래그 재정렬 기능 컬럼 바디 셀 */}
1139
+ <Show when={hasReorderFeature()}>
1140
+ <td
1141
+ class={twMerge(
1142
+ featureTdClass,
1143
+ fixedClass,
1144
+ "z-[2]",
1145
+ isReorderColLastFixed() ? fixedLastClass : undefined,
1146
+ )}
1147
+ style={{
1148
+ left: reorderColLeft(),
1149
+ }}
1150
+ >
1151
+ <div class={reorderCellWrapperClass} onPointerDown={(e) => onReorderPointerDown(e, flat.item)}>
1152
+ <div class={reorderHandleClass}>
1153
+ <Icon icon={IconGripVertical} size="1em" />
1154
+ </div>
1155
+ </div>
1156
+ </td>
1157
+ </Show>
1158
+ <For each={effectiveColumns()}>
1159
+ {(col, colIndex) => (
1160
+ <td
1161
+ class={twMerge(
1162
+ tdClass,
1163
+ col.fixed ? clsx(fixedClass, "z-[2]") : undefined,
1164
+ isLastFixed(colIndex()) ? fixedLastClass : undefined,
1165
+ col.class,
1166
+ local.cellClass?.(flat.item, col.key),
1167
+ )}
1168
+ style={
1169
+ [
1170
+ getFixedStyle(colIndex()),
1171
+ col.width != null ? `max-width: ${col.width}` : undefined,
1172
+ local.cellStyle?.(flat.item, col.key),
1173
+ ]
1174
+ .filter(Boolean)
1175
+ .join("; ") || undefined
1176
+ }
1177
+ >
1178
+ {col.cell({
1179
+ item: flat.item,
1180
+ index: flat.index,
1181
+ depth: flat.depth,
1182
+ })}
1183
+ </td>
1184
+ )}
1185
+ </For>
1186
+ </tr>
1187
+ )}
1188
+ </For>
1189
+ </tbody>
1190
+ </table>
1191
+ <div class={resizeIndicatorClass} style={resizeIndicatorStyle()} />
1192
+ <div data-reorder-indicator class={reorderIndicatorClass} style={{ display: "none" }} />
1193
+ </div>
1194
+ </div>
1195
+ );
1196
+ };
1197
+
1198
+ DataSheet.Column = DataSheetColumn;