@svadmin/ui 0.73.0 → 0.74.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 (295) hide show
  1. package/README.md +53 -28
  2. package/dist/app.css +3733 -4119
  3. package/dist/app.theme.css +3733 -4119
  4. package/dist/component-registry.d.ts +14977 -0
  5. package/dist/component-registry.js +216 -0
  6. package/dist/components/AboutSettings.svelte +7 -1
  7. package/dist/components/AboutSettings.svelte.d.ts +4 -1
  8. package/dist/components/ActivityFeed.svelte +9 -3
  9. package/dist/components/ActivityFeed.svelte.d.ts +3 -0
  10. package/dist/components/AdminApp.svelte +19 -10
  11. package/dist/components/AdminApp.svelte.d.ts +6 -0
  12. package/dist/components/ApiSettings.svelte +41 -5
  13. package/dist/components/ApprovalCenter.svelte +283 -0
  14. package/dist/components/ApprovalCenter.svelte.d.ts +10 -0
  15. package/dist/components/AuditLogViewer.svelte +3 -1
  16. package/dist/components/AutoForm.svelte +33 -3
  17. package/dist/components/AutoForm.svelte.d.ts +1 -0
  18. package/dist/components/AutoTable.svelte +610 -47
  19. package/dist/components/AutoTable.svelte.d.ts +17 -1
  20. package/dist/components/BoundRecordDetailDrawer.svelte +9 -0
  21. package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +2 -0
  22. package/dist/components/Breadcrumbs.svelte +11 -1
  23. package/dist/components/CancelTaskButton.svelte +12 -42
  24. package/dist/components/ColorPicker.svelte +73 -0
  25. package/dist/components/ColorPicker.svelte.d.ts +15 -0
  26. package/dist/components/ComboboxField.svelte +114 -27
  27. package/dist/components/ComboboxField.svelte.d.ts +1 -0
  28. package/dist/components/DashboardView.svelte +99 -0
  29. package/dist/components/DashboardView.svelte.d.ts +14 -0
  30. package/dist/components/DatePicker.svelte +10 -0
  31. package/dist/components/DatePicker.svelte.d.ts +6 -0
  32. package/dist/components/DateRangeInput.svelte +85 -5
  33. package/dist/components/DateRangeInput.svelte.d.ts +10 -0
  34. package/dist/components/DateRangePicker.svelte +10 -0
  35. package/dist/components/DateRangePicker.svelte.d.ts +6 -0
  36. package/dist/components/DateTimeInput.svelte +74 -5
  37. package/dist/components/DateTimeInput.svelte.d.ts +8 -0
  38. package/dist/components/DateTimePicker.svelte +10 -0
  39. package/dist/components/DateTimePicker.svelte.d.ts +6 -0
  40. package/dist/components/DevTools.svelte +34 -26
  41. package/dist/components/DevframePanel.svelte +123 -0
  42. package/dist/components/DevframePanel.svelte.d.ts +3 -0
  43. package/dist/components/ErrorSummary.svelte +52 -0
  44. package/dist/components/ErrorSummary.svelte.d.ts +14 -0
  45. package/dist/components/FieldRenderer.svelte +82 -81
  46. package/dist/components/FileUpload.svelte +214 -52
  47. package/dist/components/FileUpload.svelte.d.ts +11 -0
  48. package/dist/components/FilterBuilder.svelte +88 -66
  49. package/dist/components/FilterCollectionInput.svelte +80 -0
  50. package/dist/components/FilterCollectionInput.svelte.d.ts +10 -0
  51. package/dist/components/GanttChart.svelte +66 -14
  52. package/dist/components/GanttChart.svelte.d.ts +6 -0
  53. package/dist/components/Header.svelte +18 -2
  54. package/dist/components/ImportWizard.svelte +339 -17
  55. package/dist/components/ImportWizard.svelte.d.ts +11 -0
  56. package/dist/components/JsonSchemaForm.svelte +120 -52
  57. package/dist/components/JsonSchemaForm.svelte.d.ts +7 -1
  58. package/dist/components/KanbanBoard.svelte +195 -40
  59. package/dist/components/KanbanBoard.svelte.d.ts +9 -2
  60. package/dist/components/Layout.svelte +4 -2
  61. package/dist/components/LazyAutoForm.svelte +28 -0
  62. package/dist/components/LazyAutoForm.svelte.d.ts +8 -0
  63. package/dist/components/LazyAutoTable.svelte +28 -0
  64. package/dist/components/LazyAutoTable.svelte.d.ts +8 -0
  65. package/dist/components/LazySettingsPage.svelte +28 -0
  66. package/dist/components/LazySettingsPage.svelte.d.ts +8 -0
  67. package/dist/components/LazyShowPage.svelte +28 -0
  68. package/dist/components/LazyShowPage.svelte.d.ts +8 -0
  69. package/dist/components/ListPage.svelte +5 -1
  70. package/dist/components/ListPage.svelte.d.ts +3 -0
  71. package/dist/components/LoginPage.svelte +1 -1
  72. package/dist/components/MultiTabKeepAlive.svelte +11 -6
  73. package/dist/components/NotificationsSettings.svelte +69 -2
  74. package/dist/components/NotificationsSettings.svelte.d.ts +25 -1
  75. package/dist/components/PermissionMatrix.svelte +20 -1
  76. package/dist/components/PivotExportButton.svelte +157 -0
  77. package/dist/components/PivotExportButton.svelte.d.ts +16 -0
  78. package/dist/components/PivotTable.svelte +229 -74
  79. package/dist/components/PivotTable.svelte.d.ts +19 -2
  80. package/dist/components/RadioGroup.svelte +121 -0
  81. package/dist/components/RadioGroup.svelte.d.ts +43 -0
  82. package/dist/components/RangeSlider.svelte +127 -0
  83. package/dist/components/RangeSlider.svelte.d.ts +22 -0
  84. package/dist/components/Rate.svelte +121 -0
  85. package/dist/components/Rate.svelte.d.ts +16 -0
  86. package/dist/components/RecordDetailDrawer.svelte +4 -2
  87. package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
  88. package/dist/components/RelationPicker.svelte +341 -0
  89. package/dist/components/RelationPicker.svelte.d.ts +26 -0
  90. package/dist/components/ResourceOperationsPage.svelte +18 -18
  91. package/dist/components/ResourceOperationsPage.svelte.d.ts +2 -2
  92. package/dist/components/RetryTaskButton.svelte +12 -42
  93. package/dist/components/SecuritySettings.svelte +29 -5
  94. package/dist/components/SegmentedControl.svelte +145 -0
  95. package/dist/components/SegmentedControl.svelte.d.ts +38 -0
  96. package/dist/components/SettingsPage.svelte +3 -1
  97. package/dist/components/SettingsPage.svelte.d.ts +1 -0
  98. package/dist/components/ShowPage.svelte +18 -3
  99. package/dist/components/ShowPage.svelte.d.ts +3 -0
  100. package/dist/components/Sidebar.svelte +2 -2
  101. package/dist/components/Slider.svelte +100 -0
  102. package/dist/components/Slider.svelte.d.ts +19 -0
  103. package/dist/components/SpreadsheetView.svelte +1213 -95
  104. package/dist/components/SpreadsheetView.svelte.d.ts +19 -0
  105. package/dist/components/TagsInput.svelte +178 -0
  106. package/dist/components/TagsInput.svelte.d.ts +17 -0
  107. package/dist/components/TimePicker.svelte +10 -0
  108. package/dist/components/TimePicker.svelte.d.ts +6 -0
  109. package/dist/components/TreeSelect.svelte +267 -53
  110. package/dist/components/TreeSelect.svelte.d.ts +3 -0
  111. package/dist/components/TreeTable.svelte +484 -82
  112. package/dist/components/TreeTable.svelte.d.ts +24 -1
  113. package/dist/components/TwoFactorAuthPage.svelte +85 -48
  114. package/dist/components/TwoFactorAuthPage.svelte.d.ts +12 -1
  115. package/dist/components/VirtualTable.svelte +116 -20
  116. package/dist/components/VirtualTable.svelte.d.ts +5 -0
  117. package/dist/components/account/CompanyProfilePage.svelte +74 -38
  118. package/dist/components/account/GetStartedPage.svelte +2 -1
  119. package/dist/components/account/ImportMembersPage.svelte +22 -167
  120. package/dist/components/account/ImportMembersPage.svelte.d.ts +4 -1
  121. package/dist/components/account/MemberDirectory.svelte +156 -0
  122. package/dist/components/account/MemberDirectory.svelte.d.ts +19 -0
  123. package/dist/components/account/MembersStarterPage.svelte +9 -55
  124. package/dist/components/account/MembersStarterPage.svelte.d.ts +5 -1
  125. package/dist/components/account/SecurityLogPage.svelte +4 -1
  126. package/dist/components/account/SettingsPlainPage.svelte +7 -38
  127. package/dist/components/account/SettingsPlainPage.svelte.d.ts +4 -1
  128. package/dist/components/account/SettingsSidebarPage.svelte +7 -20
  129. package/dist/components/account/TeamMembersPage.svelte +4 -20
  130. package/dist/components/account/TeamMembersPage.svelte.d.ts +5 -1
  131. package/dist/components/account/UserProfilePage.svelte +3 -25
  132. package/dist/components/account/UserProfilePage.svelte.d.ts +17 -2
  133. package/dist/components/buttons/ExportButton.svelte +56 -12
  134. package/dist/components/buttons/ExportButton.svelte.d.ts +11 -0
  135. package/dist/components/content/ContentPageHeader.svelte +1 -1
  136. package/dist/components/content/ContentPageShell.svelte +1 -1
  137. package/dist/components/content/MetricBlock.svelte +1 -1
  138. package/dist/components/content/PageToolbar.svelte +1 -1
  139. package/dist/components/content/ReferenceNotice.svelte +5 -0
  140. package/dist/components/content/ReferenceNotice.svelte.d.ts +18 -0
  141. package/dist/components/content/SectionHeader.svelte +1 -1
  142. package/dist/components/content/SettingsFieldRow.svelte +1 -1
  143. package/dist/components/content/SettingsGroup.svelte +1 -1
  144. package/dist/components/content/StatusBadge.svelte +1 -1
  145. package/dist/components/content/WorkspaceLayout.svelte +1 -1
  146. package/dist/components/export-reference.d.ts +2 -0
  147. package/dist/components/export-reference.js +9 -0
  148. package/dist/components/fieldComponentMap.js +2 -5
  149. package/dist/components/fields/DateField.svelte +12 -13
  150. package/dist/components/fields/date-display.d.ts +6 -0
  151. package/dist/components/fields/date-display.js +24 -0
  152. package/dist/components/network/TeamCrewTablePage.svelte +6 -1
  153. package/dist/components/network/UserCardsNFTPage.svelte +2 -0
  154. package/dist/components/profile/PublicProfilePage.svelte +2 -0
  155. package/dist/components/saved-list-views.d.ts +74 -1
  156. package/dist/components/saved-list-views.js +191 -3
  157. package/dist/components/table-contract.d.ts +12 -1
  158. package/dist/components/task-action.svelte.d.ts +13 -0
  159. package/dist/components/task-action.svelte.js +73 -0
  160. package/dist/components/ui/DesignSystemShowcase.svelte +164 -0
  161. package/dist/components/ui/DesignSystemShowcase.svelte.d.ts +3 -0
  162. package/dist/components/ui/badge/badge-variants.d.ts +3 -2
  163. package/dist/components/ui/badge/badge-variants.js +2 -3
  164. package/dist/components/ui/badge/badge.svelte +3 -0
  165. package/dist/components/ui/badge/badge.svelte.d.ts +1 -0
  166. package/dist/components/ui/button/button-variants.d.ts +5 -4
  167. package/dist/components/ui/button/button-variants.js +7 -5
  168. package/dist/components/ui/checkbox/checkbox.svelte +5 -1
  169. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +5 -1
  170. package/dist/components/ui/input/input.svelte +7 -2
  171. package/dist/components/ui/input/input.svelte.d.ts +4 -1
  172. package/dist/components/ui/select/select.svelte +4 -1
  173. package/dist/components/ui/select/select.svelte.d.ts +2 -1
  174. package/dist/components/ui/textarea/textarea.svelte +2 -2
  175. package/dist/components.css +33 -2
  176. package/dist/date-input-policy.d.ts +4 -0
  177. package/dist/date-input-policy.js +35 -0
  178. package/dist/design-system-components.d.ts +100 -0
  179. package/dist/design-system-components.js +101 -0
  180. package/dist/design-system.js +1 -1
  181. package/dist/devtools-bridge.d.ts +80 -0
  182. package/dist/devtools-bridge.js +92 -0
  183. package/dist/index.d.ts +37 -2
  184. package/dist/index.js +23 -2
  185. package/dist/recipes.d.ts +960 -4
  186. package/dist/recipes.js +264 -4
  187. package/dist/tree-table-model.d.ts +24 -0
  188. package/dist/tree-table-model.js +111 -0
  189. package/package.json +22 -10
  190. package/dist/styled-system/css/conditions.js +0 -36
  191. package/dist/styled-system/css/css.d.ts +0 -22
  192. package/dist/styled-system/css/css.js +0 -45
  193. package/dist/styled-system/css/cva.d.ts +0 -6
  194. package/dist/styled-system/css/cva.js +0 -87
  195. package/dist/styled-system/css/cx.d.ts +0 -5
  196. package/dist/styled-system/css/cx.js +0 -15
  197. package/dist/styled-system/css/index.d.ts +0 -5
  198. package/dist/styled-system/css/index.js +0 -4
  199. package/dist/styled-system/css/sva.d.ts +0 -4
  200. package/dist/styled-system/css/sva.js +0 -46
  201. package/dist/styled-system/helpers.js +0 -316
  202. package/dist/styled-system/patterns/aspect-ratio.d.ts +0 -20
  203. package/dist/styled-system/patterns/aspect-ratio.js +0 -38
  204. package/dist/styled-system/patterns/bleed.d.ts +0 -21
  205. package/dist/styled-system/patterns/bleed.js +0 -24
  206. package/dist/styled-system/patterns/box.d.ts +0 -20
  207. package/dist/styled-system/patterns/box.js +0 -15
  208. package/dist/styled-system/patterns/center.d.ts +0 -20
  209. package/dist/styled-system/patterns/center.js +0 -21
  210. package/dist/styled-system/patterns/circle.d.ts +0 -20
  211. package/dist/styled-system/patterns/circle.js +0 -25
  212. package/dist/styled-system/patterns/container.d.ts +0 -20
  213. package/dist/styled-system/patterns/container.js +0 -21
  214. package/dist/styled-system/patterns/cq.d.ts +0 -21
  215. package/dist/styled-system/patterns/cq.js +0 -21
  216. package/dist/styled-system/patterns/divider.d.ts +0 -22
  217. package/dist/styled-system/patterns/divider.js +0 -25
  218. package/dist/styled-system/patterns/flex.d.ts +0 -26
  219. package/dist/styled-system/patterns/flex.js +0 -26
  220. package/dist/styled-system/patterns/float.d.ts +0 -23
  221. package/dist/styled-system/patterns/float.js +0 -52
  222. package/dist/styled-system/patterns/grid-item.d.ts +0 -25
  223. package/dist/styled-system/patterns/grid-item.js +0 -25
  224. package/dist/styled-system/patterns/grid.d.ts +0 -24
  225. package/dist/styled-system/patterns/grid.js +0 -27
  226. package/dist/styled-system/patterns/hstack.d.ts +0 -21
  227. package/dist/styled-system/patterns/hstack.js +0 -24
  228. package/dist/styled-system/patterns/index.d.ts +0 -21
  229. package/dist/styled-system/patterns/index.js +0 -20
  230. package/dist/styled-system/patterns/link-overlay.d.ts +0 -20
  231. package/dist/styled-system/patterns/link-overlay.js +0 -24
  232. package/dist/styled-system/patterns/spacer.d.ts +0 -20
  233. package/dist/styled-system/patterns/spacer.js +0 -25
  234. package/dist/styled-system/patterns/square.d.ts +0 -20
  235. package/dist/styled-system/patterns/square.js +0 -24
  236. package/dist/styled-system/patterns/stack.d.ts +0 -23
  237. package/dist/styled-system/patterns/stack.js +0 -24
  238. package/dist/styled-system/patterns/visually-hidden.d.ts +0 -20
  239. package/dist/styled-system/patterns/visually-hidden.js +0 -18
  240. package/dist/styled-system/patterns/vstack.d.ts +0 -21
  241. package/dist/styled-system/patterns/vstack.js +0 -24
  242. package/dist/styled-system/patterns/wrap.d.ts +0 -24
  243. package/dist/styled-system/patterns/wrap.js +0 -25
  244. package/dist/styled-system/recipes/content-header.d.ts +0 -31
  245. package/dist/styled-system/recipes/content-header.js +0 -65
  246. package/dist/styled-system/recipes/content-page.d.ts +0 -34
  247. package/dist/styled-system/recipes/content-page.js +0 -43
  248. package/dist/styled-system/recipes/create-recipe.js +0 -82
  249. package/dist/styled-system/recipes/index.d.ts +0 -17
  250. package/dist/styled-system/recipes/index.js +0 -16
  251. package/dist/styled-system/recipes/metric-block.d.ts +0 -34
  252. package/dist/styled-system/recipes/metric-block.js +0 -76
  253. package/dist/styled-system/recipes/product-list.d.ts +0 -31
  254. package/dist/styled-system/recipes/product-list.js +0 -73
  255. package/dist/styled-system/recipes/product-section.d.ts +0 -31
  256. package/dist/styled-system/recipes/product-section.js +0 -49
  257. package/dist/styled-system/recipes/product-settings-row.d.ts +0 -34
  258. package/dist/styled-system/recipes/product-settings-row.js +0 -58
  259. package/dist/styled-system/recipes/product-settings.d.ts +0 -31
  260. package/dist/styled-system/recipes/product-settings.js +0 -57
  261. package/dist/styled-system/recipes/product-status.d.ts +0 -34
  262. package/dist/styled-system/recipes/product-status.js +0 -45
  263. package/dist/styled-system/recipes/product-toolbar.d.ts +0 -31
  264. package/dist/styled-system/recipes/product-toolbar.js +0 -41
  265. package/dist/styled-system/recipes/product-workspace.d.ts +0 -34
  266. package/dist/styled-system/recipes/product-workspace.js +0 -58
  267. package/dist/styled-system/recipes/surface-metric.d.ts +0 -38
  268. package/dist/styled-system/recipes/surface-metric.js +0 -63
  269. package/dist/styled-system/recipes/surface-table.d.ts +0 -34
  270. package/dist/styled-system/recipes/surface-table.js +0 -62
  271. package/dist/styled-system/recipes/ui-badge.d.ts +0 -31
  272. package/dist/styled-system/recipes/ui-badge.js +0 -38
  273. package/dist/styled-system/recipes/ui-button.d.ts +0 -32
  274. package/dist/styled-system/recipes/ui-button.js +0 -43
  275. package/dist/styled-system/recipes/ui-input.d.ts +0 -31
  276. package/dist/styled-system/recipes/ui-input.js +0 -49
  277. package/dist/styled-system/recipes/ui-textarea.d.ts +0 -31
  278. package/dist/styled-system/recipes/ui-textarea.js +0 -24
  279. package/dist/styled-system/styles.css +0 -1257
  280. package/dist/styled-system/tokens/index.d.ts +0 -9
  281. package/dist/styled-system/tokens/index.js +0 -268
  282. package/dist/styled-system/tokens/tokens.d.ts +0 -36
  283. package/dist/styled-system/types/composition.d.ts +0 -227
  284. package/dist/styled-system/types/conditions.d.ts +0 -236
  285. package/dist/styled-system/types/csstype.d.ts +0 -22570
  286. package/dist/styled-system/types/index.d.ts +0 -6
  287. package/dist/styled-system/types/parts.d.ts +0 -8
  288. package/dist/styled-system/types/pattern.d.ts +0 -78
  289. package/dist/styled-system/types/prop-type.d.ts +0 -223
  290. package/dist/styled-system/types/recipe.d.ts +0 -181
  291. package/dist/styled-system/types/selectors.d.ts +0 -59
  292. package/dist/styled-system/types/static-css.d.ts +0 -56
  293. package/dist/styled-system/types/style-props.d.ts +0 -8088
  294. package/dist/styled-system/types/system-types.d.ts +0 -151
  295. package/dist/styles/recipes.css +0 -1262
@@ -1,3 +1,4 @@
1
+ import { snapshotPlainData } from '@svadmin/core/schema';
1
2
  const STORAGE_VERSION = 1;
2
3
  const MAX_SAVED_VIEWS = 25;
3
4
  const MAX_FILTER_NODES = 200;
@@ -91,7 +92,63 @@ function parseState(value, allowedColumnIds) {
91
92
  columnOrder,
92
93
  };
93
94
  }
94
- export function readSavedListViews(raw, allowedColumnIds) {
95
+ function parseAccess(value) {
96
+ if (!isRecord(value) || Object.keys(value).some(key => key !== 'mode' && key !== 'subjectIds'))
97
+ return;
98
+ const mode = value['mode'];
99
+ const ids = value['subjectIds'];
100
+ if ((mode !== 'team' && mode !== 'organization' && mode !== 'restricted')
101
+ || !Array.isArray(ids) || ids.length > 200)
102
+ return;
103
+ const subjectIds = [];
104
+ for (const id of ids) {
105
+ if (typeof id !== 'string' || !id.trim() || id !== id.trim() || id.length > 200
106
+ || subjectIds.includes(id))
107
+ return;
108
+ subjectIds.push(id);
109
+ }
110
+ if ((mode === 'restricted') !== (subjectIds.length > 0))
111
+ return;
112
+ return { mode, subjectIds };
113
+ }
114
+ export function decodeSavedListViewAccess(value) {
115
+ try {
116
+ return parseAccess(snapshotPlainData(value));
117
+ }
118
+ catch {
119
+ return;
120
+ }
121
+ }
122
+ export function decodeSavedListViewSubjects(value) {
123
+ try {
124
+ const snapshot = snapshotPlainData(value);
125
+ if (!Array.isArray(snapshot) || snapshot.length > 200)
126
+ return;
127
+ const seen = new Set();
128
+ const subjects = [];
129
+ for (const entry of snapshot) {
130
+ if (!isRecord(entry)
131
+ || Object.keys(entry).some(key => !['id', 'label', 'description'].includes(key))
132
+ || typeof entry['id'] !== 'string' || !entry['id'].trim() || entry['id'] !== entry['id'].trim()
133
+ || entry['id'].length > 200 || seen.has(entry['id'])
134
+ || typeof entry['label'] !== 'string' || !entry['label'].trim() || entry['label'].length > 200
135
+ || (entry['description'] !== undefined
136
+ && (typeof entry['description'] !== 'string' || entry['description'].length > 500)))
137
+ return;
138
+ seen.add(entry['id']);
139
+ subjects.push({
140
+ id: entry['id'],
141
+ label: entry['label'].trim(),
142
+ ...(entry['description'] === undefined ? {} : { description: entry['description'] }),
143
+ });
144
+ }
145
+ return subjects;
146
+ }
147
+ catch {
148
+ return;
149
+ }
150
+ }
151
+ export function readSavedListViews(raw, allowedColumnIds, source = 'local') {
95
152
  if (!raw)
96
153
  return [];
97
154
  try {
@@ -110,8 +167,20 @@ export function readSavedListViews(raw, allowedColumnIds) {
110
167
  const state = parseState(entry['state'], allowedColumnIds);
111
168
  if (!state)
112
169
  continue;
170
+ const access = entry['access'] === undefined ? undefined : parseAccess(entry['access']);
171
+ if (entry['access'] !== undefined && !access)
172
+ continue;
113
173
  seenIds.add(entry['id']);
114
- views.push({ id: entry['id'], name: entry['name'].trim(), state });
174
+ views.push({
175
+ id: entry['id'], name: entry['name'].trim(), state,
176
+ ...(isPositiveInteger(entry['version'], Number.MAX_SAFE_INTEGER) ? { version: entry['version'] } : {}),
177
+ ...(source !== 'local' ? {
178
+ source: entry['source'] === 'system' ? 'system' : 'team',
179
+ readOnly: true,
180
+ ...(entry['default'] === true ? { default: true } : {}),
181
+ ...(access === undefined ? {} : { access }),
182
+ } : {}),
183
+ });
115
184
  }
116
185
  return views;
117
186
  }
@@ -121,6 +190,124 @@ export function readSavedListViews(raw, allowedColumnIds) {
121
190
  throw error;
122
191
  }
123
192
  }
193
+ export function decodeSavedListViewMutationResult(value, allowedColumnIds, expected) {
194
+ try {
195
+ if (expected && (!expected.id.trim()
196
+ || !['team', 'system'].includes(expected.source)
197
+ || (expected.expectedVersion !== null
198
+ && !isPositiveInteger(expected.expectedVersion, Number.MAX_SAFE_INTEGER))))
199
+ return;
200
+ const snapshot = snapshotPlainData(value);
201
+ if (!isRecord(snapshot) || typeof snapshot['ok'] !== 'boolean')
202
+ return;
203
+ const keys = snapshot['ok'] ? ['ok', 'version', 'view'] : ['ok', 'code', 'version', 'current'];
204
+ if (Object.keys(snapshot).some(key => !keys.includes(key)))
205
+ return;
206
+ const parseReceiptView = (candidate, version) => {
207
+ if (!isRecord(candidate)
208
+ || Object.keys(candidate).some(key => !['id', 'name', 'state', 'version', 'source', 'readOnly', 'default', 'access'].includes(key))
209
+ || candidate['version'] !== version
210
+ || (candidate['readOnly'] !== undefined && typeof candidate['readOnly'] !== 'boolean')
211
+ || (candidate['default'] !== undefined && typeof candidate['default'] !== 'boolean')
212
+ || (candidate['source'] !== undefined && candidate['source'] !== 'team' && candidate['source'] !== 'system'))
213
+ return;
214
+ const access = candidate['access'] === undefined ? undefined : parseAccess(candidate['access']);
215
+ if (candidate['access'] !== undefined && !access)
216
+ return;
217
+ const state = candidate['state'];
218
+ if (!isRecord(state) || Object.keys(state).some(key => !['search', 'filters', 'sorters', 'pagination', 'columnVisibility', 'columnOrder'].includes(key)))
219
+ return;
220
+ if (!isRecord(state['pagination']) || Object.keys(state['pagination']).some(key => !['current', 'pageSize'].includes(key)))
221
+ return;
222
+ if (!isRecord(state['columnVisibility']) || Object.entries(state['columnVisibility'])
223
+ .some(([key, visible]) => !allowedColumnIds.has(key) || typeof visible !== 'boolean'))
224
+ return;
225
+ if (!Array.isArray(state['columnOrder']) || state['columnOrder'].some(key => typeof key !== 'string' || !allowedColumnIds.has(key))
226
+ || new Set(state['columnOrder']).size !== state['columnOrder'].length)
227
+ return;
228
+ if (!Array.isArray(state['sorters']) || state['sorters'].some(sorter => !isRecord(sorter) || Object.keys(sorter).some(key => !['field', 'order'].includes(key))))
229
+ return;
230
+ const exactFilter = (filter, depth = 0) => {
231
+ if (!isRecord(filter) || depth > 20)
232
+ return false;
233
+ if ('field' in filter)
234
+ return Object.keys(filter).every(key => ['field', 'operator', 'value'].includes(key));
235
+ return Object.keys(filter).every(key => ['operator', 'value'].includes(key))
236
+ && Array.isArray(filter['value']) && filter['value'].every(child => exactFilter(child, depth + 1));
237
+ };
238
+ if (!Array.isArray(state['filters']) || !state['filters'].every(filter => exactFilter(filter)))
239
+ return;
240
+ const views = readSavedListViews(JSON.stringify({ version: STORAGE_VERSION, views: [candidate] }), allowedColumnIds);
241
+ const view = views[0];
242
+ if (!view || view.name !== candidate['name'])
243
+ return;
244
+ if (expected && (view.id !== expected.id || candidate['source'] !== expected.source))
245
+ return;
246
+ return {
247
+ ...view,
248
+ ...(candidate['source'] === undefined ? {} : { source: candidate['source'] }),
249
+ ...(candidate['readOnly'] === undefined ? {} : { readOnly: candidate['readOnly'] }),
250
+ ...(candidate['default'] === undefined ? {} : { default: candidate['default'] }),
251
+ ...(access === undefined ? {} : { access }),
252
+ };
253
+ };
254
+ if (snapshot['ok'] === true) {
255
+ if (!isPositiveInteger(snapshot['version'], Number.MAX_SAFE_INTEGER))
256
+ return;
257
+ if (expected?.expectedVersion !== undefined && expected.expectedVersion !== null
258
+ && snapshot['version'] <= expected.expectedVersion)
259
+ return;
260
+ const view = parseReceiptView(snapshot['view'], snapshot['version']);
261
+ if (!view)
262
+ return;
263
+ return { ok: true, view, version: snapshot['version'] };
264
+ }
265
+ if (snapshot['code'] !== 'VERSION_CONFLICT' || !isPositiveInteger(snapshot['version'], Number.MAX_SAFE_INTEGER))
266
+ return;
267
+ const current = parseReceiptView(snapshot['current'], snapshot['version']);
268
+ if (!current)
269
+ return;
270
+ return { ok: false, code: 'VERSION_CONFLICT', current, version: snapshot['version'] };
271
+ }
272
+ catch {
273
+ return;
274
+ }
275
+ }
276
+ export function decodeSavedListViewRemoveResult(value, expected) {
277
+ try {
278
+ const snapshot = snapshotPlainData(value);
279
+ if (!isRecord(snapshot) || snapshot['ok'] !== true
280
+ || Object.keys(snapshot).some(key => !['ok', 'id', 'version'].includes(key))
281
+ || snapshot['id'] !== expected.id
282
+ || !isPositiveInteger(expected.expectedVersion, Number.MAX_SAFE_INTEGER)
283
+ || !isPositiveInteger(snapshot['version'], Number.MAX_SAFE_INTEGER)
284
+ || snapshot['version'] <= expected.expectedVersion)
285
+ return;
286
+ return { ok: true, id: expected.id, version: snapshot['version'] };
287
+ }
288
+ catch {
289
+ return;
290
+ }
291
+ }
292
+ export function decodeRemoteSavedListViews(value, allowedColumnIds, writable = false) {
293
+ try {
294
+ const snapshot = snapshotPlainData(value);
295
+ if (!Array.isArray(snapshot))
296
+ return [];
297
+ return readSavedListViews(JSON.stringify({ version: STORAGE_VERSION, views: snapshot }), allowedColumnIds, 'team')
298
+ .map(view => {
299
+ const entry = snapshot.find(entry => isRecord(entry) && entry['id'] === view.id);
300
+ return {
301
+ ...view,
302
+ readOnly: !writable || !view.version || !isRecord(entry) || entry['readOnly'] !== false,
303
+ ...(isRecord(entry) && entry['default'] === true ? { default: true } : {}),
304
+ };
305
+ });
306
+ }
307
+ catch {
308
+ return [];
309
+ }
310
+ }
124
311
  export function serializeSavedListViews(views) {
125
312
  return JSON.stringify({ version: STORAGE_VERSION, views: views.slice(0, MAX_SAVED_VIEWS) });
126
313
  }
@@ -137,10 +324,11 @@ export function listPreferenceScopeId(scope) {
137
324
  `r:${encodeURIComponent(scope.resourceName)}`,
138
325
  `p:${encodeURIComponent(scope.providerName)}`,
139
326
  `t:${encodeScopeValue(scope.tenantIdentity)}`,
327
+ ...(scope.identityKey === undefined ? [] : [`u:${encodeScopeValue(scope.identityKey)}`]),
140
328
  ].join('|');
141
329
  }
142
330
  export function canMigrateLegacyListPreferences(scope) {
143
- return scope.providerName === 'default' && scope.tenantIdentity === undefined;
331
+ return scope.providerName === 'default' && scope.tenantIdentity === undefined && scope.identityKey === undefined;
144
332
  }
145
333
  export function savedListViewsStorageKey(scope) {
146
334
  return `svadmin-list-views-v2-${listPreferenceScopeId(scope)}`;
@@ -1,7 +1,18 @@
1
- import type { BaseRecord } from '@svadmin/core';
1
+ import type { BaseRecord, Filter, Sort } from '@svadmin/core';
2
2
  export type TableRecord = BaseRecord & {
3
3
  id: string | number;
4
4
  };
5
+ export type BatchSelection = {
6
+ scope: 'selected';
7
+ ids: (string | number)[];
8
+ currentPageIds: (string | number)[];
9
+ } | {
10
+ scope: 'all';
11
+ filters: Filter[];
12
+ sorters: Sort[];
13
+ total: number;
14
+ excludedIds: (string | number)[];
15
+ };
5
16
  /** The list hook validates business fields; this adapter proves table identity and detaches UI reads. */
6
17
  export declare function copyTableRecord(value: unknown): TableRecord;
7
18
  export declare function tableRowKey(id: string | number): string;
@@ -0,0 +1,13 @@
1
+ import type { TaskProvider } from '@svadmin/core';
2
+ export declare function createTaskAction(options: {
3
+ action: 'cancel' | 'retry';
4
+ taskId: string;
5
+ provider?: TaskProvider | undefined;
6
+ disabled: boolean;
7
+ onSuccess?: (() => void) | undefined;
8
+ onError?: ((error: unknown) => void) | undefined;
9
+ }): {
10
+ run: () => Promise<void>;
11
+ readonly pending: boolean;
12
+ readonly available: boolean;
13
+ };
@@ -0,0 +1,73 @@
1
+ import { onDestroy } from 'svelte';
2
+ import { captureAdminContext, captureAuthSession, queryKeyMatches, TaskError, withValidatedTaskProvider } from '@svadmin/core';
3
+ import { useQueryClient } from '@tanstack/svelte-query';
4
+ export function createTaskAction(options) {
5
+ const context = captureAdminContext();
6
+ const client = useQueryClient();
7
+ const provider = $derived(options.provider ?? context.taskProvider);
8
+ const scope = $derived({
9
+ provider, id: options.taskId, tenant: context.tenantCacheKey?.__svadminTenant,
10
+ auth: context.authProvider, session: captureAuthSession(context.authProvider),
11
+ router: context.routerProvider, access: context.accessControlProvider,
12
+ });
13
+ let mounted = true;
14
+ let attempt = $state.raw();
15
+ function current(origin) {
16
+ return mounted && origin.provider === scope.provider && origin.id === scope.id
17
+ && origin.tenant === scope.tenant && origin.auth === scope.auth
18
+ && origin.router === scope.router && origin.access === scope.access
19
+ && origin.session.isCurrent();
20
+ }
21
+ onDestroy(() => { mounted = false; attempt = undefined; });
22
+ $effect.pre(() => {
23
+ if (attempt && !current(attempt.scope))
24
+ attempt = undefined;
25
+ });
26
+ const pending = $derived(!!attempt && current(attempt.scope));
27
+ const available = $derived(!options.disabled && scope.session.available && !!provider?.[options.action]);
28
+ async function run() {
29
+ if (!available || pending || !mounted || !provider)
30
+ return;
31
+ const origin = scope;
32
+ const token = { scope: origin };
33
+ const matcher = context.queryKeyMatcher();
34
+ const success = options.onSuccess;
35
+ const failure = options.onError;
36
+ attempt = token;
37
+ let error;
38
+ let failed = false;
39
+ let deliver;
40
+ try {
41
+ const operation = withValidatedTaskProvider(provider)[options.action];
42
+ if (!operation)
43
+ return;
44
+ await operation(origin.id);
45
+ if (!current(origin) || attempt !== token)
46
+ return;
47
+ await Promise.allSettled([client.invalidateQueries({
48
+ predicate: query => queryKeyMatches(query.queryKey, { ...matcher, kind: 'task', action: 'list' })
49
+ || queryKeyMatches(query.queryKey, { ...matcher, kind: 'task', action: 'one', id: origin.id }),
50
+ })]);
51
+ }
52
+ catch (cause) {
53
+ failed = true;
54
+ error = cause instanceof TaskError ? cause : new TaskError('TASK_PROVIDER_FAILED');
55
+ }
56
+ finally {
57
+ deliver = current(origin) && attempt === token;
58
+ if (attempt === token)
59
+ attempt = undefined;
60
+ }
61
+ if (!deliver || !current(origin))
62
+ return;
63
+ // 观察者异常不能被误报为服务端操作失败,也不能形成未处理的 Promise。
64
+ try {
65
+ if (failed)
66
+ await failure?.(error);
67
+ else
68
+ await success?.();
69
+ }
70
+ catch { /* 回调由宿主管理,不重试已发出的写入。 */ }
71
+ }
72
+ return { run, get pending() { return pending; }, get available() { return available; } };
73
+ }
@@ -0,0 +1,164 @@
1
+ <script lang="ts">
2
+ import { Button } from "./button/index.js";
3
+ import Badge from "./badge/badge.svelte";
4
+ import Checkbox from "./checkbox/checkbox.svelte";
5
+ import Input from "./input/input.svelte";
6
+ import Select from "./select/select.svelte";
7
+ import * as Tabs from "./tabs/index.js";
8
+ import * as DropdownMenu from "./dropdown-menu/index.js";
9
+ import * as Dialog from "./dialog/index.js";
10
+ import * as Tooltip from "./tooltip/index.js";
11
+ import * as Table from "./table/index.js";
12
+ import StatusBadge from "../content/StatusBadge.svelte";
13
+
14
+ let dialogOpen = $state(false);
15
+ </script>
16
+
17
+ <div class="svadmin-design-system-showcase">
18
+ <section aria-labelledby="buttons-heading">
19
+ <h2 id="buttons-heading">Button states / 按钮状态</h2>
20
+ <div class="svadmin-design-system-showcase__row">
21
+ <Button>Default</Button>
22
+ <Button variant="outline">Outline</Button>
23
+ <Button variant="secondary" size="sm">Compact</Button>
24
+ <Button disabled>Disabled</Button>
25
+ </div>
26
+ </section>
27
+
28
+ <section aria-labelledby="fields-heading">
29
+ <h2 id="fields-heading">Fields and selection / 字段与选择</h2>
30
+ <div class="svadmin-design-system-showcase__grid">
31
+ <Input aria-label="Default input" placeholder="Default" />
32
+ <Input aria-label="Compact input" size="compact" placeholder="Compact" />
33
+ <Select aria-label="Status" size="compact" placeholder="Choose a status" />
34
+ <label class="svadmin-design-system-showcase__checkbox">
35
+ <Checkbox aria-label="Enabled" size="compact" />
36
+ Enabled
37
+ </label>
38
+ </div>
39
+ </section>
40
+
41
+ <section aria-labelledby="status-heading">
42
+ <h2 id="status-heading">Semantic status / 语义状态</h2>
43
+ <div class="svadmin-design-system-showcase__row">
44
+ <Badge variant="subtle-success">Success</Badge>
45
+ <Badge variant="subtle-warning">Warning</Badge>
46
+ <Badge variant="subtle-destructive">Danger</Badge>
47
+ <Badge variant="outline" size="compact">Compact</Badge>
48
+ </div>
49
+ </section>
50
+
51
+ <section aria-labelledby="tabs-heading">
52
+ <h2 id="tabs-heading">Tabs interaction / 标签页交互</h2>
53
+ <Tabs.Root value="overview">
54
+ <Tabs.List aria-label="Design system sections">
55
+ <Tabs.Trigger value="overview">Overview</Tabs.Trigger>
56
+ <Tabs.Trigger value="states">States</Tabs.Trigger>
57
+ <Tabs.Trigger value="disabled" disabled>Disabled</Tabs.Trigger>
58
+ </Tabs.List>
59
+ <Tabs.Content value="overview">Overview content</Tabs.Content>
60
+ <Tabs.Content value="states">State content</Tabs.Content>
61
+ </Tabs.Root>
62
+ </section>
63
+
64
+ <section aria-labelledby="overlay-heading">
65
+ <h2 id="overlay-heading">Menus and overlays / 菜单与浮层</h2>
66
+ <div class="svadmin-design-system-showcase__row">
67
+ <DropdownMenu.Root>
68
+ <DropdownMenu.Trigger class="svadmin-design-system-showcase__trigger">Menu</DropdownMenu.Trigger>
69
+ <DropdownMenu.Content>
70
+ <DropdownMenu.Item>View details</DropdownMenu.Item>
71
+ <DropdownMenu.Item disabled>Disabled action</DropdownMenu.Item>
72
+ </DropdownMenu.Content>
73
+ </DropdownMenu.Root>
74
+ <Dialog.Root bind:open={dialogOpen}>
75
+ <Dialog.Trigger class="svadmin-design-system-showcase__trigger">Open dialog</Dialog.Trigger>
76
+ <Dialog.Content>
77
+ <Dialog.Header>
78
+ <Dialog.Title>Component dialog</Dialog.Title>
79
+ <Dialog.Description>Dialog focus and close behavior.</Dialog.Description>
80
+ </Dialog.Header>
81
+ <Dialog.Footer>
82
+ <Dialog.Close class="svadmin-design-system-showcase__trigger">Close</Dialog.Close>
83
+ </Dialog.Footer>
84
+ </Dialog.Content>
85
+ </Dialog.Root>
86
+ <Tooltip.Root>
87
+ <Tooltip.Trigger class="svadmin-design-system-showcase__trigger">Hover hint</Tooltip.Trigger>
88
+ <Tooltip.Content>Tooltip content</Tooltip.Content>
89
+ </Tooltip.Root>
90
+ </div>
91
+ </section>
92
+
93
+ <section aria-labelledby="table-heading">
94
+ <h2 id="table-heading">Table and status / 表格与状态</h2>
95
+ <div class="svadmin-design-system-showcase__row">
96
+ <StatusBadge status="success" label="Ready" />
97
+ <StatusBadge status="warning" label="Review" />
98
+ <StatusBadge status="danger" label="Blocked" />
99
+ </div>
100
+ <Table.Root>
101
+ <Table.Header>
102
+ <Table.Row>
103
+ <Table.Head>Component</Table.Head>
104
+ <Table.Head>State</Table.Head>
105
+ </Table.Row>
106
+ </Table.Header>
107
+ <Table.Body>
108
+ <Table.Row>
109
+ <Table.Cell>Table</Table.Cell>
110
+ <Table.Cell>Ready</Table.Cell>
111
+ </Table.Row>
112
+ </Table.Body>
113
+ </Table.Root>
114
+ </section>
115
+ </div>
116
+
117
+ <style>
118
+ .svadmin-design-system-showcase {
119
+ display: grid;
120
+ gap: 1.5rem;
121
+ max-width: 64rem;
122
+ padding: 1.5rem;
123
+ color: var(--foreground);
124
+ background: var(--background);
125
+ }
126
+
127
+ .svadmin-design-system-showcase section {
128
+ display: grid;
129
+ gap: 0.75rem;
130
+ }
131
+
132
+ .svadmin-design-system-showcase h2 {
133
+ margin: 0;
134
+ font-size: 0.875rem;
135
+ font-weight: 600;
136
+ }
137
+
138
+ .svadmin-design-system-showcase__row,
139
+ .svadmin-design-system-showcase__grid {
140
+ display: flex;
141
+ flex-wrap: wrap;
142
+ align-items: center;
143
+ gap: 0.75rem;
144
+ }
145
+
146
+ .svadmin-design-system-showcase__grid > :global(*) {
147
+ min-width: 12rem;
148
+ flex: 1 1 12rem;
149
+ }
150
+
151
+ .svadmin-design-system-showcase__checkbox {
152
+ display: flex;
153
+ align-items: center;
154
+ gap: 0.5rem;
155
+ }
156
+
157
+ :global(.svadmin-design-system-showcase__trigger) {
158
+ border: 1px solid var(--border);
159
+ border-radius: 0.375rem;
160
+ background: var(--background);
161
+ padding: 0.375rem 0.625rem;
162
+ color: var(--foreground);
163
+ }
164
+ </style>
@@ -0,0 +1,3 @@
1
+ declare const DesignSystemShowcase: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type DesignSystemShowcase = ReturnType<typeof DesignSystemShowcase>;
3
+ export default DesignSystemShowcase;
@@ -1,6 +1,7 @@
1
- export type BadgeVariant = "default" | "secondary" | "destructive" | "subtle" | "subtle-success" | "subtle-warning" | "subtle-destructive" | "subtle-pill" | "outline" | "ghost" | "link";
1
+ import { type BadgeRecipeProps } from '../../../recipes.js';
2
+ export type BadgeVariant = NonNullable<BadgeRecipeProps["variant"]>;
2
3
  export declare const badgeVariants: ({ variant, class: className, className: extraClassName, }?: {
3
- variant?: BadgeVariant | null;
4
+ variant?: BadgeVariant | null | undefined;
4
5
  class?: string;
5
6
  className?: string;
6
7
  }) => string;
@@ -1,3 +1,2 @@
1
- import { uiBadge } from '../../../styled-system/recipes/index.js';
2
- export const badgeVariants = ({ variant = "default", class: className = "", className: extraClassName = "", } = {}) => ["svadmin-badge", variant && `svadmin-badge--${variant}`,
3
- uiBadge(variant ? { variant } : {}), className, extraClassName].filter(Boolean).join(" ");
1
+ import { badgeRecipe as uiBadge } from '../../../recipes.js';
2
+ export const badgeVariants = ({ variant, class: className = "", className: extraClassName = "", } = {}) => uiBadge({ variant, class: [className, extraClassName].filter(Boolean).join(" ") }).root;
@@ -13,10 +13,12 @@
13
13
  href,
14
14
  class: className,
15
15
  variant = "default",
16
+ size = "default",
16
17
  children,
17
18
  ...restProps
18
19
  }: WithElementRef<HTMLAnchorAttributes> & {
19
20
  variant?: BadgeVariantValue;
21
+ size?: "default" | "compact";
20
22
  } = $props();
21
23
  </script>
22
24
 
@@ -25,6 +27,7 @@
25
27
  bind:this={ref}
26
28
  data-slot="badge"
27
29
  data-variant={variant}
30
+ data-size={size}
28
31
  {href}
29
32
  class={cn(resolveBadgeVariants({ variant }), className)}
30
33
  {...restProps}
@@ -4,6 +4,7 @@ import type { HTMLAnchorAttributes } from "svelte/elements";
4
4
  import { type WithElementRef } from "../../../utils.js";
5
5
  type $$ComponentProps = WithElementRef<HTMLAnchorAttributes> & {
6
6
  variant?: BadgeVariantValue;
7
+ size?: "default" | "compact";
7
8
  };
8
9
  declare const Badge: import("svelte").Component<$$ComponentProps, {}, "ref">;
9
10
  type Badge = ReturnType<typeof Badge>;
@@ -1,8 +1,9 @@
1
- export type ButtonVariant = "default" | "outline" | "secondary" | "ghost" | "destructive" | "link";
2
- export type ButtonSize = "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg";
1
+ import { type ButtonRecipeProps } from '../../../recipes.js';
2
+ export type ButtonVariant = NonNullable<ButtonRecipeProps["variant"]>;
3
+ export type ButtonSize = NonNullable<ButtonRecipeProps["size"]>;
3
4
  export declare const buttonVariants: ({ variant, size, class: className, className: extraClassName, }?: {
4
- variant?: ButtonVariant | null;
5
- size?: ButtonSize | null;
5
+ variant?: ButtonVariant | null | undefined;
6
+ size?: ButtonSize | null | undefined;
6
7
  class?: string;
7
8
  className?: string;
8
9
  }) => string;
@@ -1,5 +1,7 @@
1
- import { uiButton } from '../../../styled-system/recipes/index.js';
2
- // 保留公开 helper、语义标记和 null 行为;样式由预生成 Panda recipe 提供。
3
- export const buttonVariants = ({ variant = "default", size = "default", class: className = "", className: extraClassName = "", } = {}) => ["svadmin-button", variant && `svadmin-button--${variant}`, size && `svadmin-button-size--${size}`,
4
- uiButton({ ...(variant ? { variant } : {}), ...(size ? { size } : {}) }),
5
- className, extraClassName].filter(Boolean).join(" ");
1
+ import { buttonRecipe } from '../../../recipes.js';
2
+ // 只组合语义类,不要求消费者安装 Tailwind 编译器或 class merger。
3
+ export const buttonVariants = ({ variant, size, class: className = "", className: extraClassName = "", } = {}) => buttonRecipe({
4
+ variant,
5
+ size,
6
+ class: [className, extraClassName].filter(Boolean).join(" "),
7
+ }).root;
@@ -8,14 +8,18 @@
8
8
  ref = $bindable(null),
9
9
  checked = $bindable(false),
10
10
  indeterminate = $bindable(false),
11
+ size = "default",
11
12
  class: className,
12
13
  ...restProps
13
- }: WithoutChildrenOrChild<CheckboxPrimitive.RootProps> = $props();
14
+ }: Omit<WithoutChildrenOrChild<CheckboxPrimitive.RootProps>, "size"> & {
15
+ size?: "default" | "compact";
16
+ } = $props();
14
17
  </script>
15
18
 
16
19
  <CheckboxPrimitive.Root
17
20
  bind:ref
18
21
  data-slot="checkbox"
22
+ data-size={size}
19
23
  class={cn("svadmin-checkbox", className)}
20
24
  bind:checked
21
25
  bind:indeterminate
@@ -1,4 +1,8 @@
1
1
  import { Checkbox as CheckboxPrimitive } from "bits-ui";
2
- declare const Checkbox: import("svelte").Component<Omit<CheckboxPrimitive.RootProps, "children" | "child">, {}, "ref" | "checked" | "indeterminate">;
2
+ import { type WithoutChildrenOrChild } from "../../../utils.js";
3
+ type $$ComponentProps = Omit<WithoutChildrenOrChild<CheckboxPrimitive.RootProps>, "size"> & {
4
+ size?: "default" | "compact";
5
+ };
6
+ declare const Checkbox: import("svelte").Component<$$ComponentProps, {}, "ref" | "checked" | "indeterminate">;
3
7
  type Checkbox = ReturnType<typeof Checkbox>;
4
8
  export default Checkbox;
@@ -11,7 +11,8 @@
11
11
  ? number | null | undefined
12
12
  : string | null | undefined;
13
13
 
14
- type Props = WithElementRef<Omit<HTMLInputAttributes, "type" | "value">> &
14
+ type Props = WithElementRef<Omit<HTMLInputAttributes, "type" | "value" | "size">> &
15
+ { size?: "default" | "compact"; nativeSize?: number } &
15
16
  (Type extends "file"
16
17
  ? { type: "file"; files?: FileList; value?: never }
17
18
  : { type?: Type; files?: undefined; value?: InputValue });
@@ -22,6 +23,8 @@
22
23
  type,
23
24
  files = $bindable(),
24
25
  disabled,
26
+ size = "default",
27
+ nativeSize,
25
28
  class: className,
26
29
  "data-slot": dataSlot = "input",
27
30
  ...restProps
@@ -30,7 +33,7 @@
30
33
  const i18n = useTranslation();
31
34
  const isFileInput = $derived(type?.toLowerCase() === "file");
32
35
  const isDateInput = $derived(["date", "datetime-local", "month", "week", "time"].includes(type?.toLowerCase() ?? ""));
33
- const attributes = $derived(definedOptions({ ...restProps, disabled }));
36
+ const attributes = $derived(definedOptions({ ...restProps, disabled, size: nativeSize }));
34
37
  const selectedFiles = $derived(files ? Array.from(files) : []);
35
38
  const selectedFileLabel = $derived.by(() => {
36
39
  const firstFile = selectedFiles[0];
@@ -48,6 +51,7 @@
48
51
  <input
49
52
  bind:this={ref}
50
53
  data-slot={dataSlot}
54
+ data-size={size}
51
55
  data-input-type="file"
52
56
  class={cn("svadmin-input", className)}
53
57
  type="file"
@@ -63,6 +67,7 @@
63
67
  <input
64
68
  bind:this={ref}
65
69
  data-slot={dataSlot}
70
+ data-size={size}
66
71
  class={cn("svadmin-input", className)}
67
72
  {type}
68
73
  lang={isDateInput ? i18n.locale : undefined}