@svadmin/ui 0.70.0 → 0.73.0

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 (372) hide show
  1. package/README.md +40 -25
  2. package/THIRD_PARTY_NOTICES.md +52 -0
  3. package/dist/actions.js +1 -1
  4. package/dist/app.css +7804 -5188
  5. package/dist/app.theme.css +7738 -5173
  6. package/dist/class-properties.generated.d.ts +1 -0
  7. package/dist/class-properties.generated.js +2 -0
  8. package/dist/classnames.d.ts +8 -0
  9. package/dist/classnames.js +26 -0
  10. package/dist/component-registry.svelte.d.ts +33 -19
  11. package/dist/component-registry.svelte.js +6 -4
  12. package/dist/components/AdminApp.svelte +55 -53
  13. package/dist/components/AdminApp.svelte.d.ts +2 -2
  14. package/dist/components/ApiSettings.svelte +19 -1
  15. package/dist/components/AuditLogDrawer.svelte +14 -3
  16. package/dist/components/AutoForm.svelte +162 -50
  17. package/dist/components/AutoForm.svelte.d.ts +4 -0
  18. package/dist/components/AutoTable.svelte +599 -259
  19. package/dist/components/AutoTable.svelte.d.ts +6 -0
  20. package/dist/components/BoundRecordDetailDrawer.svelte +172 -0
  21. package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +11 -0
  22. package/dist/components/Breadcrumbs.svelte +7 -4
  23. package/dist/components/CancelTaskButton.svelte +9 -5
  24. package/dist/components/ColumnHeaderFilter.svelte +4 -3
  25. package/dist/components/ColumnSettings.svelte +1 -0
  26. package/dist/components/ComboboxField.svelte +118 -36
  27. package/dist/components/ComboboxField.svelte.d.ts +5 -4
  28. package/dist/components/CreatePage.svelte +7 -1
  29. package/dist/components/CreatePage.svelte.d.ts +2 -0
  30. package/dist/components/DateRangeInput.svelte +75 -0
  31. package/dist/components/DateRangeInput.svelte.d.ts +25 -0
  32. package/dist/components/DateTimeInput.svelte +65 -0
  33. package/dist/components/DateTimeInput.svelte.d.ts +19 -0
  34. package/dist/components/DetailDrawer.svelte +4 -0
  35. package/dist/components/DetailDrawer.svelte.d.ts +1 -0
  36. package/dist/components/DevTools.svelte +8 -21
  37. package/dist/components/DraggableGrid.svelte +1 -0
  38. package/dist/components/DraggableHeader.svelte +5 -9
  39. package/dist/components/DraggableHeader.svelte.d.ts +43 -18
  40. package/dist/components/DraggableRowTable.svelte +2 -2
  41. package/dist/components/DynamicFormList.svelte +17 -17
  42. package/dist/components/DynamicFormList.svelte.d.ts +2 -1
  43. package/dist/components/EditPage.svelte +7 -1
  44. package/dist/components/EditPage.svelte.d.ts +2 -0
  45. package/dist/components/EditableTable.svelte +4 -0
  46. package/dist/components/ErrorPage.svelte +3 -1
  47. package/dist/components/FieldDisplay.svelte +14 -0
  48. package/dist/components/FieldDisplay.svelte.d.ts +7 -0
  49. package/dist/components/FieldRenderer.svelte +96 -20
  50. package/dist/components/FileUpload.svelte +250 -0
  51. package/dist/components/FileUpload.svelte.d.ts +32 -0
  52. package/dist/components/FilterBuilder.svelte +236 -268
  53. package/dist/components/FilterBuilder.svelte.d.ts +3 -0
  54. package/dist/components/FilterDropdown.svelte.d.ts +1 -1
  55. package/dist/components/Header.svelte +5 -6
  56. package/dist/components/ImportWizard.svelte +182 -94
  57. package/dist/components/InfiniteList.svelte +22 -8
  58. package/dist/components/InfiniteList.svelte.d.ts +5 -3
  59. package/dist/components/InlineEdit.svelte +114 -44
  60. package/dist/components/JsonSchemaForm.svelte +256 -95
  61. package/dist/components/JsonSchemaForm.svelte.d.ts +12 -1
  62. package/dist/components/Layout.svelte +20 -17
  63. package/dist/components/LazyTaskQueueDrawer.svelte +26 -0
  64. package/dist/components/LazyTaskQueueDrawer.svelte.d.ts +8 -0
  65. package/dist/components/ListPage.svelte +11 -6
  66. package/dist/components/ListPage.svelte.d.ts +2 -0
  67. package/dist/components/LoginPage.svelte +1 -1
  68. package/dist/components/MasterDetailView.svelte +3 -3
  69. package/dist/components/MediaLibraryModal.svelte +5 -2
  70. package/dist/components/MentionsInput.svelte +4 -3
  71. package/dist/components/MoneyInput.svelte +25 -0
  72. package/dist/components/MoneyInput.svelte.d.ts +20 -0
  73. package/dist/components/NavigateToResource.svelte +3 -2
  74. package/dist/components/NumberInput.svelte +25 -0
  75. package/dist/components/NumberInput.svelte.d.ts +19 -0
  76. package/dist/components/NumericInput.svelte +110 -0
  77. package/dist/components/NumericInput.svelte.d.ts +23 -0
  78. package/dist/components/PercentInput.svelte +25 -0
  79. package/dist/components/PercentInput.svelte.d.ts +20 -0
  80. package/dist/components/PermissionMatrix.svelte +4 -3
  81. package/dist/components/ProfilePage.svelte +2 -2
  82. package/dist/components/QuickEditDrawer.svelte +42 -0
  83. package/dist/components/QuickEditDrawer.svelte.d.ts +10 -0
  84. package/dist/components/RecordDetailDrawer.svelte +16 -108
  85. package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
  86. package/dist/components/RecordRowActions.svelte +41 -0
  87. package/dist/components/RecordRowActions.svelte.d.ts +14 -0
  88. package/dist/components/ResourceAccessGuard.svelte +7 -5
  89. package/dist/components/ResourceOperationsPage.svelte +25 -19
  90. package/dist/components/ResourceOperationsPage.svelte.d.ts +5 -1
  91. package/dist/components/RetryTaskButton.svelte +9 -5
  92. package/dist/components/RowActions.svelte +5 -3
  93. package/dist/components/SensitiveDataMask.svelte +3 -3
  94. package/dist/components/SettingsPage.svelte +1 -1
  95. package/dist/components/ShowInferencer.svelte +4 -2
  96. package/dist/components/ShowInferencer.svelte.d.ts +2 -0
  97. package/dist/components/ShowPage.svelte +49 -39
  98. package/dist/components/ShowPage.svelte.d.ts +2 -0
  99. package/dist/components/Sidebar.svelte +15 -13
  100. package/dist/components/SplitPaneLayout.svelte +4 -2
  101. package/dist/components/SpreadsheetView.svelte +81 -286
  102. package/dist/components/StepsForm.svelte +166 -49
  103. package/dist/components/StepsForm.svelte.d.ts +1 -0
  104. package/dist/components/SvarAutoTable.svelte +39 -0
  105. package/dist/components/SvarAutoTable.svelte.d.ts +13 -0
  106. package/dist/components/SvarDataGrid.svelte +362 -0
  107. package/dist/components/SvarDataGrid.svelte.d.ts +57 -0
  108. package/dist/components/SvarGridCell.svelte +10 -0
  109. package/dist/components/SvarGridCell.svelte.d.ts +7 -0
  110. package/dist/components/SvarResourceRead.svelte +50 -0
  111. package/dist/components/SvarResourceRead.svelte.d.ts +23 -0
  112. package/dist/components/SvarResourceTable.svelte +63 -0
  113. package/dist/components/SvarResourceTable.svelte.d.ts +42 -0
  114. package/dist/components/SvarResourceTableView.svelte +364 -0
  115. package/dist/components/SvarResourceTableView.svelte.d.ts +4 -0
  116. package/dist/components/TaskDetails.svelte +20 -7
  117. package/dist/components/TaskList.svelte +19 -7
  118. package/dist/components/TaskQueueDrawer.svelte +92 -37
  119. package/dist/components/Toast.svelte +4 -2
  120. package/dist/components/TooltipButton.svelte +1 -1
  121. package/dist/components/TreeSelect.svelte +212 -30
  122. package/dist/components/TreeSelect.svelte.d.ts +3 -1
  123. package/dist/components/ValidatedField.svelte +27 -0
  124. package/dist/components/ValidatedField.svelte.d.ts +35 -0
  125. package/dist/components/account/ImportMembersPage.svelte +2 -2
  126. package/dist/components/account/SecurityLogPage.svelte +3 -1
  127. package/dist/components/account/SettingsEnterprisePage.svelte +7 -5
  128. package/dist/components/account/TeamMembersPage.svelte +1 -1
  129. package/dist/components/auto-table-grid.d.ts +26 -0
  130. package/dist/components/auto-table-grid.js +1 -0
  131. package/dist/components/buttons/CloneButton.svelte +6 -4
  132. package/dist/components/buttons/DeleteButton.svelte +95 -29
  133. package/dist/components/buttons/DeleteButton.svelte.d.ts +2 -0
  134. package/dist/components/buttons/EditButton.svelte +6 -4
  135. package/dist/components/buttons/ExportButton.svelte +22 -4
  136. package/dist/components/buttons/ImportButton.svelte +83 -38
  137. package/dist/components/buttons/ImportButton.svelte.d.ts +6 -10
  138. package/dist/components/buttons/RefreshButton.svelte +48 -8
  139. package/dist/components/buttons/ShowButton.svelte +6 -4
  140. package/dist/components/content/ApiKeyList.svelte +3 -1
  141. package/dist/components/content/ContentPageHeader.svelte +12 -9
  142. package/dist/components/content/ContentPageShell.svelte +8 -9
  143. package/dist/components/content/FileBrowser.svelte +35 -0
  144. package/dist/components/content/FileBrowser.svelte.d.ts +14 -0
  145. package/dist/components/content/FileList.svelte +3 -1
  146. package/dist/components/content/MemberList.svelte +3 -1
  147. package/dist/components/content/MetricBlock.svelte +10 -13
  148. package/dist/components/content/NetworkTable.svelte +6 -4
  149. package/dist/components/content/NetworkTable.svelte.d.ts +1 -0
  150. package/dist/components/content/PageToolbar.svelte +6 -10
  151. package/dist/components/content/SectionHeader.svelte +8 -13
  152. package/dist/components/content/SecurityEventTable.svelte +3 -1
  153. package/dist/components/content/SettingsFieldRow.svelte +9 -23
  154. package/dist/components/content/SettingsGroup.svelte +11 -27
  155. package/dist/components/content/StatusBadge.svelte +3 -8
  156. package/dist/components/content/StatusTabs.svelte +2 -2
  157. package/dist/components/content/WorkspaceLayout.svelte +8 -12
  158. package/dist/components/enterprise/filter-tree.d.ts +48 -0
  159. package/dist/components/enterprise/filter-tree.js +224 -0
  160. package/dist/components/enterprise/json-schema-form.d.ts +39 -0
  161. package/dist/components/enterprise/json-schema-form.js +195 -0
  162. package/dist/components/enterprise/recursive-schema-form.d.ts +30 -0
  163. package/dist/components/enterprise/recursive-schema-form.js +196 -0
  164. package/dist/components/enterprise/spreadsheet-formula.d.ts +12 -0
  165. package/dist/components/enterprise/spreadsheet-formula.js +245 -0
  166. package/dist/components/fieldComponentMap.d.ts +18 -13
  167. package/dist/components/fieldComponentMap.js +100 -47
  168. package/dist/components/fields/AvatarField.svelte +1 -1
  169. package/dist/components/fields/ChoiceField.svelte +16 -0
  170. package/dist/components/fields/ChoiceField.svelte.d.ts +10 -0
  171. package/dist/components/fields/CodeField.svelte +11 -12
  172. package/dist/components/fields/CodeField.svelte.d.ts +1 -1
  173. package/dist/components/fields/DateField.svelte +4 -3
  174. package/dist/components/fields/DateRangeField.svelte +2 -4
  175. package/dist/components/fields/ImageField.svelte +3 -1
  176. package/dist/components/fields/ImagesField.svelte +23 -0
  177. package/dist/components/fields/ImagesField.svelte.d.ts +6 -0
  178. package/dist/components/fields/JsonField.svelte +19 -13
  179. package/dist/components/fields/PasswordField.svelte +5 -0
  180. package/dist/components/fields/PasswordField.svelte.d.ts +6 -0
  181. package/dist/components/fields/date-field-value.d.ts +2 -0
  182. package/dist/components/fields/date-field-value.js +13 -0
  183. package/dist/components/fields/json-value.d.ts +11 -0
  184. package/dist/components/fields/json-value.js +28 -0
  185. package/dist/components/json-schema-form-state.d.ts +37 -0
  186. package/dist/components/json-schema-form-state.js +168 -0
  187. package/dist/components/profile/ActivityTimeline.svelte +2 -2
  188. package/dist/components/record-detail.svelte.d.ts +19 -0
  189. package/dist/components/record-detail.svelte.js +34 -0
  190. package/dist/components/saved-list-views.js +29 -29
  191. package/dist/components/svar-grid-cells.d.ts +14 -0
  192. package/dist/components/svar-grid-cells.js +2 -0
  193. package/dist/components/svar-grid-contract.d.ts +80 -0
  194. package/dist/components/svar-grid-contract.js +159 -0
  195. package/dist/components/svar-grid-interactions.d.ts +54 -0
  196. package/dist/components/svar-grid-interactions.js +174 -0
  197. package/dist/components/svar-grid-loading.d.ts +40 -0
  198. package/dist/components/svar-grid-loading.js +180 -0
  199. package/dist/components/svar-grid-operations.d.ts +37 -0
  200. package/dist/components/svar-grid-operations.js +186 -0
  201. package/dist/components/svar-grid-panes.d.ts +34 -0
  202. package/dist/components/svar-grid-panes.js +66 -0
  203. package/dist/components/svar-grid-resource-loading.d.ts +18 -0
  204. package/dist/components/svar-grid-resource-loading.js +68 -0
  205. package/dist/components/svar-grid-resource-session.svelte.d.ts +29 -0
  206. package/dist/components/svar-grid-resource-session.svelte.js +61 -0
  207. package/dist/components/table-contract.d.ts +13 -0
  208. package/dist/components/table-contract.js +42 -0
  209. package/dist/components/task-utils.js +4 -2
  210. package/dist/components/ui/alert/alert-variants.d.ts +2 -3
  211. package/dist/components/ui/alert/alert-variants.js +1 -2
  212. package/dist/components/ui/alert/alert.svelte +4 -5
  213. package/dist/components/ui/alert/alert.svelte.d.ts +3 -8
  214. package/dist/components/ui/alert/index.js +0 -2
  215. package/dist/components/ui/avatar/avatar-variants.d.ts +2 -3
  216. package/dist/components/ui/avatar/avatar-variants.js +1 -2
  217. package/dist/components/ui/avatar/avatar.svelte +5 -6
  218. package/dist/components/ui/avatar/avatar.svelte.d.ts +3 -8
  219. package/dist/components/ui/badge/badge-variants.d.ts +2 -3
  220. package/dist/components/ui/badge/badge-variants.js +3 -2
  221. package/dist/components/ui/badge/badge.svelte +4 -5
  222. package/dist/components/ui/badge/badge.svelte.d.ts +3 -8
  223. package/dist/components/ui/badge/index.js +0 -2
  224. package/dist/components/ui/button/button-variants.d.ts +2 -3
  225. package/dist/components/ui/button/button-variants.js +5 -3
  226. package/dist/components/ui/button/button.svelte +100 -44
  227. package/dist/components/ui/button/button.svelte.d.ts +8 -12
  228. package/dist/components/ui/button/index.js +0 -2
  229. package/dist/components/ui/command/command-dialog.svelte +3 -1
  230. package/dist/components/ui/command/command-dialog.svelte.d.ts +1 -1
  231. package/dist/components/ui/command/command-group.svelte +4 -2
  232. package/dist/components/ui/command/command-item.svelte +4 -2
  233. package/dist/components/ui/command/command-separator.svelte +3 -1
  234. package/dist/components/ui/command/index.d.ts +5 -5
  235. package/dist/components/ui/input/input.svelte +41 -24
  236. package/dist/components/ui/input/input.svelte.d.ts +5 -4
  237. package/dist/components/ui/sheet/sheet.svelte +9 -3
  238. package/dist/components/ui/sheet/sheet.svelte.d.ts +1 -0
  239. package/dist/components/ui/textarea/textarea.svelte +2 -1
  240. package/dist/components/ui/tooltip/tooltip.svelte +4 -2
  241. package/dist/components.css +3079 -0
  242. package/dist/design-contract.d.ts +13 -0
  243. package/dist/design-contract.js +11 -0
  244. package/dist/design-system.d.ts +15 -0
  245. package/dist/design-system.js +7 -0
  246. package/dist/index.d.ts +15 -1
  247. package/dist/index.js +9 -0
  248. package/dist/inline-value.d.ts +5 -0
  249. package/dist/inline-value.js +24 -0
  250. package/dist/numeric-input.d.ts +2 -0
  251. package/dist/numeric-input.js +9 -0
  252. package/dist/page-chrome.css +12 -49
  253. package/dist/recipes.d.ts +4 -0
  254. package/dist/recipes.js +4 -0
  255. package/dist/rendering/index.d.ts +87 -0
  256. package/dist/rendering/index.js +117 -0
  257. package/dist/styled-system/css/conditions.js +36 -0
  258. package/dist/styled-system/css/css.d.ts +22 -0
  259. package/dist/styled-system/css/css.js +45 -0
  260. package/dist/styled-system/css/cva.d.ts +6 -0
  261. package/dist/styled-system/css/cva.js +87 -0
  262. package/dist/styled-system/css/cx.d.ts +5 -0
  263. package/dist/styled-system/css/cx.js +15 -0
  264. package/dist/styled-system/css/index.d.ts +5 -0
  265. package/dist/styled-system/css/index.js +4 -0
  266. package/dist/styled-system/css/sva.d.ts +4 -0
  267. package/dist/styled-system/css/sva.js +46 -0
  268. package/dist/styled-system/helpers.js +316 -0
  269. package/dist/styled-system/patterns/aspect-ratio.d.ts +20 -0
  270. package/dist/styled-system/patterns/aspect-ratio.js +38 -0
  271. package/dist/styled-system/patterns/bleed.d.ts +21 -0
  272. package/dist/styled-system/patterns/bleed.js +24 -0
  273. package/dist/styled-system/patterns/box.d.ts +20 -0
  274. package/dist/styled-system/patterns/box.js +15 -0
  275. package/dist/styled-system/patterns/center.d.ts +20 -0
  276. package/dist/styled-system/patterns/center.js +21 -0
  277. package/dist/styled-system/patterns/circle.d.ts +20 -0
  278. package/dist/styled-system/patterns/circle.js +25 -0
  279. package/dist/styled-system/patterns/container.d.ts +20 -0
  280. package/dist/styled-system/patterns/container.js +21 -0
  281. package/dist/styled-system/patterns/cq.d.ts +21 -0
  282. package/dist/styled-system/patterns/cq.js +21 -0
  283. package/dist/styled-system/patterns/divider.d.ts +22 -0
  284. package/dist/styled-system/patterns/divider.js +25 -0
  285. package/dist/styled-system/patterns/flex.d.ts +26 -0
  286. package/dist/styled-system/patterns/flex.js +26 -0
  287. package/dist/styled-system/patterns/float.d.ts +23 -0
  288. package/dist/styled-system/patterns/float.js +52 -0
  289. package/dist/styled-system/patterns/grid-item.d.ts +25 -0
  290. package/dist/styled-system/patterns/grid-item.js +25 -0
  291. package/dist/styled-system/patterns/grid.d.ts +24 -0
  292. package/dist/styled-system/patterns/grid.js +27 -0
  293. package/dist/styled-system/patterns/hstack.d.ts +21 -0
  294. package/dist/styled-system/patterns/hstack.js +24 -0
  295. package/dist/styled-system/patterns/index.d.ts +21 -0
  296. package/dist/styled-system/patterns/index.js +20 -0
  297. package/dist/styled-system/patterns/link-overlay.d.ts +20 -0
  298. package/dist/styled-system/patterns/link-overlay.js +24 -0
  299. package/dist/styled-system/patterns/spacer.d.ts +20 -0
  300. package/dist/styled-system/patterns/spacer.js +25 -0
  301. package/dist/styled-system/patterns/square.d.ts +20 -0
  302. package/dist/styled-system/patterns/square.js +24 -0
  303. package/dist/styled-system/patterns/stack.d.ts +23 -0
  304. package/dist/styled-system/patterns/stack.js +24 -0
  305. package/dist/styled-system/patterns/visually-hidden.d.ts +20 -0
  306. package/dist/styled-system/patterns/visually-hidden.js +18 -0
  307. package/dist/styled-system/patterns/vstack.d.ts +21 -0
  308. package/dist/styled-system/patterns/vstack.js +24 -0
  309. package/dist/styled-system/patterns/wrap.d.ts +24 -0
  310. package/dist/styled-system/patterns/wrap.js +25 -0
  311. package/dist/styled-system/recipes/content-header.d.ts +31 -0
  312. package/dist/styled-system/recipes/content-header.js +65 -0
  313. package/dist/styled-system/recipes/content-page.d.ts +34 -0
  314. package/dist/styled-system/recipes/content-page.js +43 -0
  315. package/dist/styled-system/recipes/create-recipe.js +82 -0
  316. package/dist/styled-system/recipes/index.d.ts +17 -0
  317. package/dist/styled-system/recipes/index.js +16 -0
  318. package/dist/styled-system/recipes/metric-block.d.ts +34 -0
  319. package/dist/styled-system/recipes/metric-block.js +76 -0
  320. package/dist/styled-system/recipes/product-list.d.ts +31 -0
  321. package/dist/styled-system/recipes/product-list.js +73 -0
  322. package/dist/styled-system/recipes/product-section.d.ts +31 -0
  323. package/dist/styled-system/recipes/product-section.js +49 -0
  324. package/dist/styled-system/recipes/product-settings-row.d.ts +34 -0
  325. package/dist/styled-system/recipes/product-settings-row.js +58 -0
  326. package/dist/styled-system/recipes/product-settings.d.ts +31 -0
  327. package/dist/styled-system/recipes/product-settings.js +57 -0
  328. package/dist/styled-system/recipes/product-status.d.ts +34 -0
  329. package/dist/styled-system/recipes/product-status.js +45 -0
  330. package/dist/styled-system/recipes/product-toolbar.d.ts +31 -0
  331. package/dist/styled-system/recipes/product-toolbar.js +41 -0
  332. package/dist/styled-system/recipes/product-workspace.d.ts +34 -0
  333. package/dist/styled-system/recipes/product-workspace.js +58 -0
  334. package/dist/styled-system/recipes/surface-metric.d.ts +38 -0
  335. package/dist/styled-system/recipes/surface-metric.js +63 -0
  336. package/dist/styled-system/recipes/surface-table.d.ts +34 -0
  337. package/dist/styled-system/recipes/surface-table.js +62 -0
  338. package/dist/styled-system/recipes/ui-badge.d.ts +31 -0
  339. package/dist/styled-system/recipes/ui-badge.js +38 -0
  340. package/dist/styled-system/recipes/ui-button.d.ts +32 -0
  341. package/dist/styled-system/recipes/ui-button.js +43 -0
  342. package/dist/styled-system/recipes/ui-input.d.ts +31 -0
  343. package/dist/styled-system/recipes/ui-input.js +49 -0
  344. package/dist/styled-system/recipes/ui-textarea.d.ts +31 -0
  345. package/dist/styled-system/recipes/ui-textarea.js +24 -0
  346. package/dist/styled-system/styles.css +1257 -0
  347. package/dist/styled-system/tokens/index.d.ts +9 -0
  348. package/dist/styled-system/tokens/index.js +268 -0
  349. package/dist/styled-system/tokens/tokens.d.ts +36 -0
  350. package/dist/styled-system/types/composition.d.ts +227 -0
  351. package/dist/styled-system/types/conditions.d.ts +236 -0
  352. package/dist/styled-system/types/csstype.d.ts +22570 -0
  353. package/dist/styled-system/types/index.d.ts +6 -0
  354. package/dist/styled-system/types/parts.d.ts +8 -0
  355. package/dist/styled-system/types/pattern.d.ts +78 -0
  356. package/dist/styled-system/types/prop-type.d.ts +223 -0
  357. package/dist/styled-system/types/recipe.d.ts +181 -0
  358. package/dist/styled-system/types/selectors.d.ts +59 -0
  359. package/dist/styled-system/types/static-css.d.ts +56 -0
  360. package/dist/styled-system/types/style-props.d.ts +8088 -0
  361. package/dist/styled-system/types/system-types.d.ts +151 -0
  362. package/dist/styles/aliases.css +49 -0
  363. package/dist/styles/compatibility.epilogue.css +384 -0
  364. package/dist/styles/compatibility.prelude.css +5513 -0
  365. package/dist/styles/conditional-states.css +28 -0
  366. package/dist/styles/conditional-utilities.css +22 -0
  367. package/dist/styles/recipes.css +1262 -0
  368. package/dist/types.d.ts +3 -3
  369. package/dist/utils.d.ts +1 -1
  370. package/dist/utils.js +1 -1
  371. package/package.json +38 -14
  372. package/styles-compatibility.json +12 -0
@@ -2,15 +2,15 @@
2
2
  import { Button } from './ui/button/index.js';
3
3
  import { Plus, Download, FileSpreadsheet } from '@lucide/svelte';
4
4
  import { cn } from '../utils.js';
5
+ import { evaluateFormula, safeSpreadsheetCsvText } from './enterprise/spreadsheet-formula.js';
5
6
 
6
7
  export interface SheetData {
7
8
  id: string;
8
9
  name: string;
9
10
  rows: number;
10
11
  cols: number;
11
- cells: Record<string, string>; // e.g. "A1": "100", "A2": "=SUM(A1:A1)"
12
+ cells: Record<string, string>;
12
13
  }
13
-
14
14
  interface Props {
15
15
  sheets?: SheetData[];
16
16
  activeSheetId?: string;
@@ -19,308 +19,125 @@
19
19
  onexport?: (csv: string) => void;
20
20
  class?: string;
21
21
  }
22
-
23
22
  let {
24
- sheets = $bindable([
25
- {
26
- id: 'sheet1',
27
- name: 'Financial Summary',
28
- rows: 8,
29
- cols: 6,
30
- cells: {
31
- A1: 'Category',
32
- B1: 'Q1',
33
- C1: 'Q2',
34
- D1: 'Q3',
35
- E1: 'Q4',
36
- F1: 'Total',
37
- A2: 'Revenue',
38
- B2: '12000',
39
- C2: '15000',
40
- D2: '18000',
41
- E2: '21000',
42
- F2: '=SUM(B2:E2)',
43
- A3: 'Cost',
44
- B3: '4000',
45
- C3: '5000',
46
- D3: '6000',
47
- E3: '7000',
48
- F3: '=SUM(B3:E3)',
49
- },
50
- },
51
- ]),
52
- activeSheetId = $bindable('sheet1'),
53
- readonly = false,
54
- onchange,
55
- onexport,
56
- class: className = '',
23
+ sheets = $bindable([{ id: 'sheet1', name: 'Financial Summary', rows: 8, cols: 6, cells: {
24
+ A1: 'Category', B1: 'Q1', C1: 'Q2', D1: 'Q3', E1: 'Q4', F1: 'Total',
25
+ A2: 'Revenue', B2: '12000', C2: '15000', D2: '18000', E2: '21000', F2: '=SUM(B2:E2)',
26
+ A3: 'Cost', B3: '4000', C3: '5000', D3: '6000', E3: '7000', F3: '=SUM(B3:E3)',
27
+ } }]),
28
+ activeSheetId = $bindable('sheet1'), readonly = false, onchange, onexport, class: className = '',
57
29
  }: Props = $props();
58
-
59
- let selectedCell = $state<string>('A1');
60
- let formulaInput = $state('');
61
-
62
- const currentSheet = $derived(
63
- sheets.find((s) => s.id === activeSheetId) ?? sheets[0]
64
- );
30
+ let selectedCell = $state('A1');
31
+ let nextSheetId = 0;
32
+ const currentSheet = $derived(sheets.find((sheet) => sheet.id === activeSheetId) ?? sheets[0]);
33
+ const formulaInput = $derived(currentSheet?.cells[selectedCell] ?? '');
65
34
 
66
35
  function getColName(index: number): string {
67
- let result = '';
68
- let i = index;
69
- while (i >= 0) {
70
- result = String.fromCharCode((i % 26) + 65) + result;
71
- i = Math.floor(i / 26) - 1;
72
- }
36
+ let result = '', current = index;
37
+ while (current >= 0) { result = String.fromCharCode(current % 26 + 65) + result; current = Math.floor(current / 26) - 1; }
73
38
  return result;
74
39
  }
75
-
76
- function colNameToIndex(col: string): number {
77
- let idx = 0;
78
- for (let i = 0; i < col.length; i++) {
79
- idx = idx * 26 + (col.charCodeAt(i) - 64);
80
- }
81
- return idx - 1;
82
- }
83
-
84
- function parseCellKey(key: string): { col: string; row: number } | null {
85
- const match = key.match(/^([A-Z]+)(\d+)$/);
86
- if (!match || !match[1] || !match[2]) return null;
87
- return { col: match[1], row: parseInt(match[2], 10) };
88
- }
89
-
90
- function evaluateFormula(formula: string, cells: Record<string, string>): number | string {
91
- const sumMatch = formula.match(/^=SUM\(([A-Z]+\d+):([A-Z]+\d+)\)$/i);
92
- const avgMatch = formula.match(/^=AVG\(([A-Z]+\d+):([A-Z]+\d+)\)$/i);
93
- const countMatch = formula.match(/^=COUNT\(([A-Z]+\d+):([A-Z]+\d+)\)$/i);
94
-
95
- const match = sumMatch || avgMatch || countMatch;
96
- if (match && match[1] && match[2]) {
97
- const start = parseCellKey(match[1].toUpperCase());
98
- const end = parseCellKey(match[2].toUpperCase());
99
- if (!start || !end) return '#ERROR!';
100
-
101
- const startCol = colNameToIndex(start.col);
102
- const endCol = colNameToIndex(end.col);
103
- const minCol = Math.min(startCol, endCol);
104
- const maxCol = Math.max(startCol, endCol);
105
- const minRow = Math.min(start.row, end.row);
106
- const maxRow = Math.max(start.row, end.row);
107
-
108
- const numbers: number[] = [];
109
- for (let c = minCol; c <= maxCol; c++) {
110
- for (let r = minRow; r <= maxRow; r++) {
111
- const k = `${getColName(c)}${r}`;
112
- const raw = cells[k] ?? '';
113
- const val = raw.startsWith('=') ? evaluateFormula(raw, cells) : Number(raw);
114
- if (typeof val === 'number' && !isNaN(val)) {
115
- numbers.push(val);
116
- }
117
- }
118
- }
119
-
120
- if (sumMatch) return numbers.reduce((a, b) => a + b, 0);
121
- if (avgMatch) return numbers.length ? numbers.reduce((a, b) => a + b, 0) / numbers.length : 0;
122
- if (countMatch) return numbers.length;
123
- }
124
-
125
- // Direct arithmetic
126
- if (formula.startsWith('=')) {
127
- try {
128
- const expr = formula.slice(1).replace(/([A-Z]+\d+)/g, (k) => {
129
- const val = cells[k.toUpperCase()] ?? '0';
130
- return String(Number(val) || 0);
131
- });
132
- const sanitized = expr.replace(/[^0-9+\-*/(). ]/g, '');
133
- const fn = new Function(`return (${sanitized || 0})`);
134
- return Number(fn());
135
- } catch {
136
- return '#VALUE!';
137
- }
138
- }
139
-
140
- return formula;
141
- }
142
-
143
40
  function getRenderedValue(key: string): string {
144
41
  if (!currentSheet) return '';
145
- const raw = currentSheet.cells[key] ?? '';
146
- if (raw.startsWith('=')) {
147
- const computed = evaluateFormula(raw, currentSheet.cells);
148
- return typeof computed === 'number'
149
- ? computed.toLocaleString(undefined, { maximumFractionDigits: 2 })
150
- : String(computed);
151
- }
152
- return raw;
42
+ const computed = evaluateFormula(currentSheet.cells[key] ?? '', currentSheet.cells);
43
+ return typeof computed === 'number' ? computed.toLocaleString(undefined, { maximumFractionDigits: 2 }) : computed;
153
44
  }
154
-
155
- function selectCell(key: string) {
156
- selectedCell = key;
157
- if (currentSheet) {
158
- formulaInput = currentSheet.cells[key] ?? '';
159
- }
160
- }
161
-
162
- function updateCellValue(key: string, val: string) {
45
+ function selectCell(key: string): void { selectedCell = key; }
46
+ function updateCellValue(key: string, next: string): void {
163
47
  if (readonly || !currentSheet) return;
164
- const nextSheets = sheets.map((s) => {
165
- if (s.id === currentSheet.id) {
166
- return {
167
- ...s,
168
- cells: {
169
- ...s.cells,
170
- [key]: val,
171
- },
172
- };
173
- }
174
- return s;
175
- });
176
- sheets = nextSheets;
48
+ const id = currentSheet.id;
49
+ sheets = sheets.map((sheet) => sheet.id === id ? { ...sheet, cells: { ...sheet.cells, [key]: next } } : sheet);
177
50
  onchange?.(sheets);
178
51
  }
179
-
180
- function handleFormulaCommit() {
181
- if (!selectedCell) return;
182
- updateCellValue(selectedCell, formulaInput);
183
- }
184
-
185
- function addRow() {
186
- if (!currentSheet) return;
187
- const next = sheets.map((s) => (s.id === currentSheet.id ? { ...s, rows: s.rows + 1 } : s));
188
- sheets = next;
52
+ function addRow(): void {
53
+ if (readonly || !currentSheet) return;
54
+ const id = currentSheet.id;
55
+ sheets = sheets.map((sheet) => sheet.id === id ? { ...sheet, rows: sheet.rows + 1 } : sheet);
189
56
  onchange?.(sheets);
190
57
  }
191
-
192
- function addCol() {
193
- if (!currentSheet) return;
194
- const next = sheets.map((s) => (s.id === currentSheet.id ? { ...s, cols: s.cols + 1 } : s));
195
- sheets = next;
58
+ function addCol(): void {
59
+ if (readonly || !currentSheet) return;
60
+ const id = currentSheet.id;
61
+ sheets = sheets.map((sheet) => sheet.id === id ? { ...sheet, cols: sheet.cols + 1 } : sheet);
196
62
  onchange?.(sheets);
197
63
  }
198
-
199
- function exportCsv() {
64
+ function exportCsv(): void {
200
65
  if (!currentSheet) return;
66
+ const sheet = currentSheet;
201
67
  const lines: string[] = [];
202
- for (let r = 1; r <= currentSheet.rows; r++) {
203
- const rowVals: string[] = [];
204
- for (let c = 0; c < currentSheet.cols; c++) {
205
- const k = `${getColName(c)}${r}`;
206
- const val = getRenderedValue(k).replace(/"/g, '""');
207
- rowVals.push(`"${val}"`);
68
+ for (let row = 1; row <= sheet.rows; row++) {
69
+ const values: string[] = [];
70
+ for (let column = 0; column < sheet.cols; column++) {
71
+ const key = `${getColName(column)}${row}`;
72
+ const computed = evaluateFormula(sheet.cells[key] ?? '', sheet.cells);
73
+ // 数值导出保持机器可读精度;文本危险前缀与 CSV 引号分别处理。
74
+ const numericText = typeof computed === 'string' && /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(computed.trim()) && Number.isFinite(Number(computed));
75
+ const text = typeof computed === 'number' || numericText ? String(computed) : safeSpreadsheetCsvText(computed);
76
+ values.push(`"${text.replaceAll('"', '""')}"`);
208
77
  }
209
- lines.push(rowVals.join(','));
210
- }
211
- const csvContent = lines.join('\n');
212
- if (onexport) {
213
- onexport(csvContent);
214
- } else {
215
- const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
216
- const a = document.createElement('a');
217
- a.href = URL.createObjectURL(blob);
218
- a.download = `${currentSheet.name}_${Date.now()}.csv`;
219
- a.click();
78
+ lines.push(values.join(','));
220
79
  }
80
+ const csv = lines.join('\n');
81
+ if (onexport) { onexport(csv); return; }
82
+ if (typeof document === 'undefined') return;
83
+ const url = URL.createObjectURL(new Blob([csv], { type: 'text/csv;charset=utf-8;' }));
84
+ try {
85
+ const anchor = document.createElement('a');
86
+ anchor.href = url;
87
+ anchor.download = `${sheet.name}_${Date.now()}.csv`;
88
+ anchor.click();
89
+ } finally { setTimeout(() => URL.revokeObjectURL(url), 0); }
221
90
  }
222
-
223
- function addSheet() {
224
- const id = `sheet_${Date.now()}`;
225
- const newSheet: SheetData = {
226
- id,
227
- name: `Sheet ${sheets.length + 1}`,
228
- rows: 6,
229
- cols: 5,
230
- cells: {},
231
- };
232
- sheets = [...sheets, newSheet];
91
+ function addSheet(): void {
92
+ if (readonly) return;
93
+ const id = `sheet_${Date.now()}_${++nextSheetId}`;
94
+ sheets = [...sheets, { id, name: `Sheet ${sheets.length + 1}`, rows: 6, cols: 5, cells: {} }];
233
95
  activeSheetId = id;
96
+ selectedCell = 'A1';
234
97
  onchange?.(sheets);
235
98
  }
236
99
  </script>
237
100
 
238
- <div class={cn('svadmin-u-a217b4eaa918 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-cd0ad9a56558 svadmin-u-cef5b893cf23 svadmin-u-359090c2d529 svadmin-u-6f7e013d6499 svadmin-u-eb6e8b881acd svadmin-u-2cd02d11d1af', className)}>
239
- <!-- Header Toolbar -->
101
+ <div data-testid="spreadsheet-view" class={cn('svadmin-u-a217b4eaa918 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-cd0ad9a56558 svadmin-u-cef5b893cf23 svadmin-u-359090c2d529 svadmin-u-6f7e013d6499 svadmin-u-eb6e8b881acd svadmin-u-2cd02d11d1af', className)}>
240
102
  <div class="svadmin-u-60fbb7713999 svadmin-u-1eb5c6df38c1 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-77a2a20e90d4 svadmin-u-f4cc511ff0c1 svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff">
241
103
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-77a2a20e90d4">
242
- <FileSpreadsheet class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3 svadmin-u-20aaf08a7ed1 svadmin-u-012fbd121f37" />
104
+ <FileSpreadsheet class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3 svadmin-u-20aaf08a7ed1 svadmin-u-012fbd121f37" aria-hidden="true" />
243
105
  <span class="svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{currentSheet?.name ?? 'Spreadsheet'}</span>
244
106
  </div>
245
-
246
107
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-58284b4ea568">
247
108
  {#if !readonly}
248
- <Button variant="outline" size="sm" class="svadmin-u-d0a52b312f7d svadmin-u-359090c2d529 svadmin-u-44ee8ba0a421" onclick={addRow}>
249
- <Plus class="svadmin-u-6a60c09e6aaa svadmin-u-9cea05671a29" />
250
- Row
251
- </Button>
252
- <Button variant="outline" size="sm" class="svadmin-u-d0a52b312f7d svadmin-u-359090c2d529 svadmin-u-44ee8ba0a421" onclick={addCol}>
253
- <Plus class="svadmin-u-6a60c09e6aaa svadmin-u-9cea05671a29" />
254
- Column
255
- </Button>
109
+ <Button type="button" variant="outline" size="sm" class="svadmin-u-d0a52b312f7d svadmin-u-359090c2d529 svadmin-u-44ee8ba0a421" onclick={addRow}><Plus size={14} aria-hidden="true" />Row</Button>
110
+ <Button type="button" variant="outline" size="sm" class="svadmin-u-d0a52b312f7d svadmin-u-359090c2d529 svadmin-u-44ee8ba0a421" onclick={addCol}><Plus size={14} aria-hidden="true" />Column</Button>
256
111
  {/if}
257
-
258
- <Button size="sm" class="svadmin-u-d0a52b312f7d svadmin-u-359090c2d529 svadmin-u-44ee8ba0a421" onclick={exportCsv}>
259
- <Download class="svadmin-u-6a60c09e6aaa svadmin-u-9cea05671a29" />
260
- Export CSV
261
- </Button>
112
+ <Button type="button" size="sm" class="svadmin-u-d0a52b312f7d svadmin-u-359090c2d529 svadmin-u-44ee8ba0a421" onclick={exportCsv}><Download size={14} aria-hidden="true" />Export CSV</Button>
262
113
  </div>
263
114
  </div>
264
-
265
- <!-- Formula Bar -->
266
115
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-77a2a20e90d4 svadmin-u-d5eab218aa34 svadmin-u-ec0091ee009b svadmin-u-5f22e64f2282 svadmin-u-b00f43c30c2b svadmin-u-ca6bcd4b6f3f svadmin-u-05faf5c801ff svadmin-u-0e65706bcccd">
267
- <div class="svadmin-u-d5eab218aa34 svadmin-u-465609a240a8 svadmin-u-07389a777c1f svadmin-u-e6f9e383a762 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-d4108abe6359 svadmin-u-e83a7042bc91 svadmin-u-d058ca6de60f svadmin-u-28ae52cc20ae svadmin-u-ca6bf63030aa">
268
- {selectedCell}
269
- </div>
116
+ <div class="svadmin-u-d5eab218aa34 svadmin-u-465609a240a8 svadmin-u-07389a777c1f svadmin-u-e6f9e383a762 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-d4108abe6359 svadmin-u-e83a7042bc91 svadmin-u-d058ca6de60f svadmin-u-28ae52cc20ae svadmin-u-ca6bf63030aa">{selectedCell}</div>
270
117
  <span class="svadmin-u-bfa603190748 svadmin-u-359090c2d529">fx</span>
271
- <input
272
- type="text"
273
- bind:value={formulaInput}
274
- {readonly}
275
- placeholder="Value or formula, e.g. =SUM(B2:E2)"
118
+ <input type="text" value={formulaInput} {readonly} aria-label={`Formula ${selectedCell}`} placeholder="Value or formula, e.g. =SUM(B2:E2)"
276
119
  class="svadmin-u-36e579c0b41c svadmin-u-f6fe902450dc svadmin-u-7f19cdf4c5bb svadmin-u-119b2aa0b8f6 svadmin-u-d8e0e382c67b svadmin-u-359090c2d529 svadmin-u-d4108abe6359 svadmin-u-f10f771f87e9 svadmin-u-35ca6b75d707 svadmin-u-0e65706bcccd"
277
- oninput={handleFormulaCommit}
278
- onkeydown={(e) => { if (e.key === 'Enter') handleFormulaCommit(); }}
279
- />
120
+ oninput={(event) => updateCellValue(selectedCell, event.currentTarget.value)}
121
+ onkeydown={(event) => { if (event.key === 'Enter') { event.preventDefault(); updateCellValue(selectedCell, event.currentTarget.value); } }} />
280
122
  </div>
281
-
282
- <!-- Spreadsheet Grid -->
283
123
  {#if currentSheet}
284
124
  <div class="svadmin-u-73fc3fb18ceb svadmin-u-b63b7d8eef5d svadmin-u-ca6bcd4b6f3f svadmin-u-05faf5c801ff svadmin-u-5f22e64f2282">
285
- <table class="svadmin-u-6da6a3c3f741 svadmin-u-4583f90cd9bd svadmin-u-2eba0d65d059 svadmin-u-0e65706bcccd">
286
- <thead class="svadmin-u-706701550477 svadmin-u-3e0fd166d494 svadmin-u-2167406b24d7 svadmin-u-236812d64c82 svadmin-u-bfa603190748">
287
- <tr>
288
- <th class="svadmin-u-d854e5698b57 svadmin-u-cd009d7d208c svadmin-u-ca6bf63030aa svadmin-u-5ceb636bd9f3 svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff svadmin-u-85d919893645 svadmin-u-1dc571a3609f">#</th>
289
- {#each Array.from({ length: currentSheet.cols }) as _, c (c)}
290
- <th class="svadmin-u-25effcb585ab svadmin-u-cd009d7d208c svadmin-u-ca6bf63030aa svadmin-u-5ceb636bd9f3 svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359 svadmin-u-359090c2d529">
291
- {getColName(c)}
292
- </th>
293
- {/each}
294
- </tr>
295
- </thead>
125
+ <table aria-label={currentSheet.name} class="svadmin-u-6da6a3c3f741 svadmin-u-4583f90cd9bd svadmin-u-2eba0d65d059 svadmin-u-0e65706bcccd">
126
+ <thead class="svadmin-u-706701550477 svadmin-u-3e0fd166d494 svadmin-u-2167406b24d7 svadmin-u-236812d64c82 svadmin-u-bfa603190748"><tr>
127
+ <th class="svadmin-u-d854e5698b57 svadmin-u-cd009d7d208c svadmin-u-ca6bf63030aa svadmin-u-5ceb636bd9f3 svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff svadmin-u-85d919893645 svadmin-u-1dc571a3609f">#</th>
128
+ {#each Array.from({ length: currentSheet.cols }) as _, column (column)}<th scope="col" class="svadmin-u-25effcb585ab svadmin-u-cd009d7d208c svadmin-u-ca6bf63030aa svadmin-u-5ceb636bd9f3 svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359 svadmin-u-359090c2d529">{getColName(column)}</th>{/each}
129
+ </tr></thead>
296
130
  <tbody class="svadmin-u-fa6acbf81d74 svadmin-u-08b5607c7258">
297
- {#each Array.from({ length: currentSheet.rows }) as _, r (r)}
298
- {@const rowNum = r + 1}
131
+ {#each Array.from({ length: currentSheet.rows }) as _, row (row)}
299
132
  <tr class="svadmin-u-9fc5d875f5ca">
300
- <td class="svadmin-u-d854e5698b57 svadmin-u-eb6a3cef9686 svadmin-u-ca6bf63030aa svadmin-u-5ceb636bd9f3 svadmin-u-05faf5c801ff svadmin-u-2859c861d7de svadmin-u-1dc571a3609f svadmin-u-e83a7042bc91 svadmin-u-bfa603190748 svadmin-u-7f6912283f11">
301
- {rowNum}
302
- </td>
303
- {#each Array.from({ length: currentSheet.cols }) as _, c (c)}
304
- {@const cellKey = `${getColName(c)}${rowNum}`}
305
- {@const isSelected = selectedCell === cellKey}
306
- <td
307
- class={cn(
308
- 'svadmin-u-8a539c7fe216 svadmin-u-5ceb636bd9f3 svadmin-u-6ee2d41e2d2d svadmin-u-d89972fe17d6 svadmin-u-34516836730d',
309
- isSelected ? 'svadmin-u-16b1efa5875e svadmin-u-fd1dda07320a svadmin-u-236812d64c82 svadmin-u-989c466fdbe7' : ''
310
- )}
311
- onclick={() => selectCell(cellKey)}
312
- >
313
- <input
314
- type="text"
315
- {readonly}
316
- value={isSelected ? (currentSheet.cells[cellKey] ?? '') : getRenderedValue(cellKey)}
317
- class={cn(
318
- 'svadmin-u-6da6a3c3f741 svadmin-u-d0a52b312f7d svadmin-u-d5eab218aa34 svadmin-u-7f19cdf4c5bb svadmin-u-119b2aa0b8f6 svadmin-u-359090c2d529 svadmin-u-0e65706bcccd svadmin-u-f10f771f87e9',
319
- typeof evaluateFormula(currentSheet.cells[cellKey] ?? '', currentSheet.cells) === 'number' ? 'svadmin-u-308fc069e46e' : 'svadmin-u-2eba0d65d059'
320
- )}
321
- onfocus={() => selectCell(cellKey)}
322
- oninput={(e) => updateCellValue(cellKey, e.currentTarget.value)}
323
- />
133
+ <td class="svadmin-u-d854e5698b57 svadmin-u-eb6a3cef9686 svadmin-u-ca6bf63030aa svadmin-u-5ceb636bd9f3 svadmin-u-05faf5c801ff svadmin-u-2859c861d7de svadmin-u-1dc571a3609f svadmin-u-e83a7042bc91 svadmin-u-bfa603190748 svadmin-u-7f6912283f11">{row + 1}</td>
134
+ {#each Array.from({ length: currentSheet.cols }) as _, column (column)}
135
+ {@const cellKey = `${getColName(column)}${row + 1}`}
136
+ {@const selected = selectedCell === cellKey}
137
+ <td class={cn('svadmin-u-8a539c7fe216 svadmin-u-5ceb636bd9f3 svadmin-u-6ee2d41e2d2d svadmin-u-d89972fe17d6 svadmin-u-34516836730d', selected ? 'svadmin-u-16b1efa5875e svadmin-u-fd1dda07320a svadmin-u-236812d64c82 svadmin-u-989c466fdbe7' : '')} onclick={() => selectCell(cellKey)}>
138
+ <input type="text" {readonly} aria-label={`Cell ${cellKey}`} value={selected ? currentSheet.cells[cellKey] ?? '' : getRenderedValue(cellKey)}
139
+ class={cn('svadmin-u-6da6a3c3f741 svadmin-u-d0a52b312f7d svadmin-u-d5eab218aa34 svadmin-u-7f19cdf4c5bb svadmin-u-119b2aa0b8f6 svadmin-u-359090c2d529 svadmin-u-0e65706bcccd svadmin-u-f10f771f87e9', typeof evaluateFormula(currentSheet.cells[cellKey] ?? '', currentSheet.cells) === 'number' ? 'svadmin-u-308fc069e46e' : 'svadmin-u-2eba0d65d059')}
140
+ onfocus={() => selectCell(cellKey)} oninput={(event) => updateCellValue(cellKey, event.currentTarget.value)} />
324
141
  </td>
325
142
  {/each}
326
143
  </tr>
@@ -329,35 +146,13 @@
329
146
  </table>
330
147
  </div>
331
148
  {/if}
332
-
333
- <!-- Sheet Tabs Footer -->
334
149
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-77a2a20e90d4 svadmin-u-6b7d6e21ccbd svadmin-u-b950dda299d3 svadmin-u-05faf5c801ff">
335
150
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-44ee8ba0a421 svadmin-u-1384f66f41d0">
336
151
  {#each sheets as sheet (sheet.id)}
337
- {@const isActive = sheet.id === activeSheetId}
338
- <button
339
- type="button"
340
- class={cn(
341
- 'svadmin-u-0e17f2bd9074 svadmin-u-660d2effb880 svadmin-u-421ac2be5045 svadmin-u-359090c2d529 svadmin-u-2689f3958069 svadmin-u-ceb69a6b0e5f svadmin-u-34516836730d svadmin-u-ca6bcd4b6f3f',
342
- isActive
343
- ? 'svadmin-u-75b1bec3ea0e svadmin-u-30ca335ae9c2 svadmin-u-6cbc84dd9e1a svadmin-u-cef5b893cf23'
344
- : 'svadmin-u-cd0ad9a56558 svadmin-u-bfa603190748 svadmin-u-05faf5c801ff svadmin-u-ea7b2e9e070e svadmin-u-68646cdcc246'
345
- )}
346
- onclick={() => {
347
- activeSheetId = sheet.id;
348
- selectedCell = 'A1';
349
- formulaInput = sheet.cells['A1'] ?? '';
350
- }}
351
- >
352
- {sheet.name}
353
- </button>
152
+ <button type="button" class={cn('svadmin-u-0e17f2bd9074 svadmin-u-660d2effb880 svadmin-u-421ac2be5045 svadmin-u-359090c2d529 svadmin-u-2689f3958069 svadmin-u-ceb69a6b0e5f svadmin-u-34516836730d svadmin-u-ca6bcd4b6f3f', sheet.id === activeSheetId ? 'svadmin-u-75b1bec3ea0e svadmin-u-30ca335ae9c2 svadmin-u-6cbc84dd9e1a svadmin-u-cef5b893cf23' : 'svadmin-u-cd0ad9a56558 svadmin-u-bfa603190748 svadmin-u-05faf5c801ff svadmin-u-ea7b2e9e070e svadmin-u-68646cdcc246')}
153
+ onclick={() => { activeSheetId = sheet.id; selectedCell = 'A1'; }}>{sheet.name}</button>
354
154
  {/each}
355
-
356
- {#if !readonly}
357
- <Button variant="ghost" size="sm" class="svadmin-u-f6fe902450dc svadmin-u-7ec10f86d9b1 svadmin-u-8a539c7fe216 svadmin-u-bfa603190748" onclick={addSheet} title="New Sheet">
358
- <Plus class="svadmin-u-7fc7f732bf7e svadmin-u-bf600f8e029c" />
359
- </Button>
360
- {/if}
155
+ {#if !readonly}<Button type="button" variant="ghost" size="sm" class="svadmin-u-f6fe902450dc svadmin-u-7ec10f86d9b1 svadmin-u-8a539c7fe216 svadmin-u-bfa603190748" onclick={addSheet} title="New Sheet" aria-label="New Sheet"><Plus size={14} aria-hidden="true" /></Button>{/if}
361
156
  </div>
362
157
  </div>
363
158
  </div>