@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
@@ -0,0 +1,14 @@
1
+ import type { DashboardProvider, EnterpriseProviderRequestContext } from '@svadmin/core';
2
+ interface Props {
3
+ provider: DashboardProvider;
4
+ dashboardId: string;
5
+ requestContext?: EnterpriseProviderRequestContext;
6
+ filters?: readonly {
7
+ field: string;
8
+ value: string | number | boolean | null;
9
+ }[];
10
+ title?: string;
11
+ }
12
+ declare const DashboardView: import("svelte").Component<Props, {}, "">;
13
+ type DashboardView = ReturnType<typeof DashboardView>;
14
+ export default DashboardView;
@@ -0,0 +1,10 @@
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import DateTimeInput from './DateTimeInput.svelte';
4
+
5
+ export type DatePickerProps = Omit<ComponentProps<typeof DateTimeInput>, 'mode'>;
6
+
7
+ let props: DatePickerProps = $props();
8
+ </script>
9
+
10
+ <DateTimeInput {...props} mode="date" />
@@ -0,0 +1,6 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import DateTimeInput from './DateTimeInput.svelte';
3
+ export type DatePickerProps = Omit<ComponentProps<typeof DateTimeInput>, 'mode'>;
4
+ declare const DatePicker: import("svelte").Component<DatePickerProps, {}, "">;
5
+ type DatePicker = ReturnType<typeof DatePicker>;
6
+ export default DatePicker;
@@ -1,19 +1,30 @@
1
1
  <script lang="ts">
2
+ import { definedOptions } from '@svadmin/core/options';
2
3
  import DateTimeInput, { type DateTimeInputMode } from './DateTimeInput.svelte';
3
4
  import { cn } from '../utils.js';
4
- import { definedOptions } from '@svadmin/core/options';
5
+ import { useTranslation } from '@svadmin/core/i18n';
6
+ import { dateInputAllowed, dateInputNumber } from '../date-input-policy.js';
7
+ import { Select } from './ui/select/index.js';
8
+ import type { DateInputOptions } from '@svadmin/core';
9
+ import { formatCivilDateTime, parseDateTimeInstant, type DateTimeValueMode, type DateTimeDisambiguation } from '@svadmin/core/date-time';
5
10
 
6
11
  export interface DateRangeInputValue {
7
12
  start: string | null;
8
13
  end: string | null;
9
14
  }
15
+ export type DateRangePreset = NonNullable<DateInputOptions['presets']>[number];
10
16
 
11
17
  interface Props {
12
18
  value?: DateRangeInputValue | null;
13
19
  mode?: DateTimeInputMode;
20
+ valueMode?: DateTimeValueMode;
21
+ timeZone?: string;
22
+ disambiguation?: DateTimeDisambiguation;
14
23
  min?: string;
15
24
  max?: string;
16
25
  step?: number;
26
+ disabledDate?: (date: string) => boolean;
27
+ presets?: DateRangePreset[];
17
28
  startId?: string;
18
29
  endId?: string;
19
30
  startName?: string;
@@ -22,6 +33,8 @@
22
33
  required?: boolean;
23
34
  invalid?: boolean;
24
35
  describedby?: string;
36
+ startAriaLabel?: string;
37
+ endAriaLabel?: string;
25
38
  class?: string;
26
39
  onchange?: (value: DateRangeInputValue) => void;
27
40
  }
@@ -29,9 +42,14 @@
29
42
  let {
30
43
  value = $bindable({ start: null, end: null }),
31
44
  mode = 'date',
45
+ valueMode = 'civil',
46
+ timeZone,
47
+ disambiguation = 'reject',
32
48
  min,
33
49
  max,
34
50
  step,
51
+ disabledDate,
52
+ presets = [],
35
53
  startId,
36
54
  endId,
37
55
  startName,
@@ -40,12 +58,52 @@
40
58
  required = false,
41
59
  invalid = false,
42
60
  describedby,
61
+ startAriaLabel,
62
+ endAriaLabel,
43
63
  class: className = '',
44
64
  onchange,
45
65
  }: Props = $props();
46
66
 
67
+ const i18n = useTranslation();
68
+ const instantMode = $derived(valueMode === 'instant');
69
+ const startMax = $derived(!instantMode && value?.end && (!max || value.end < max) ? value.end : max);
70
+ const endMin = $derived(!instantMode && value?.start && (!min || value.start > min) ? value.start : min);
71
+ function validInstant(value: string | null | undefined): string | undefined {
72
+ return value && parseDateTimeInstant(value) !== undefined ? value : undefined;
73
+ }
74
+
75
+ function presetAllowed(preset: DateRangePreset): boolean {
76
+ const { start, end } = preset.value;
77
+ if (instantMode) {
78
+ if (mode !== 'datetime' || !timeZone) return false;
79
+ const first = parseDateTimeInstant(start);
80
+ const last = parseDateTimeInstant(end);
81
+ if (first === undefined || last === undefined || first > last) return false;
82
+ const firstDraft = formatCivilDateTime(first, timeZone);
83
+ const lastDraft = formatCivilDateTime(last, timeZone);
84
+ return firstDraft !== undefined && lastDraft !== undefined
85
+ && dateInputAllowed(firstDraft, mode, min, max, disabledDate)
86
+ && dateInputAllowed(lastDraft, mode, min, max, disabledDate);
87
+ }
88
+ const first = dateInputNumber(start, mode);
89
+ const last = dateInputNumber(end, mode);
90
+ return first !== undefined && last !== undefined && first <= last
91
+ && dateInputAllowed(start, mode, min, max, disabledDate)
92
+ && dateInputAllowed(end, mode, min, max, disabledDate);
93
+ }
94
+
95
+ function choosePreset(event: Event): void {
96
+ const select = event.currentTarget;
97
+ if (!(select instanceof HTMLSelectElement)) return;
98
+ const preset = select.value === '' ? undefined : presets[Number(select.value)];
99
+ select.value = '';
100
+ if (disabled || !preset || !presetAllowed(preset)) return;
101
+ const result = { ...preset.value };
102
+ value = result;
103
+ onchange?.(result);
104
+ }
105
+
47
106
  function update(part: 'start' | 'end', next: string | null): void {
48
- // null 范围首次编辑也必须返回两个明确的端点。
49
107
  const result: DateRangeInputValue = { start: value?.start ?? null, end: value?.end ?? null, [part]: next };
50
108
  value = result;
51
109
  onchange?.(result);
@@ -53,23 +111,45 @@
53
111
  </script>
54
112
 
55
113
  <div class={cn('svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-421ac2be5045', className)} data-date-range-input>
114
+ {#if presets.length > 0}
115
+ <Select value="" {disabled} aria-label={i18n.t('dateInput.presets')} onchange={choosePreset}>
116
+ <option value="">{i18n.t('dateInput.presets')}</option>
117
+ {#each presets as preset, index (index)}
118
+ <option value={String(index)} disabled={!presetAllowed(preset)}>{preset.label}</option>
119
+ {/each}
120
+ </Select>
121
+ {/if}
56
122
  <DateTimeInput
57
123
  value={value?.start ?? null}
58
124
  {mode}
59
- {...definedOptions({ min, max, step, id: startId, name: startName, describedby })}
125
+ {valueMode}
126
+ {disambiguation}
127
+ {...definedOptions({
128
+ timeZone, min, max: startMax, step, disabledDate,
129
+ id: startId, name: startName, describedby,
130
+ maxInstant: instantMode ? validInstant(value?.end) : undefined,
131
+ })}
60
132
  {disabled}
61
133
  {required}
62
134
  {invalid}
135
+ ariaLabel={startAriaLabel ?? i18n.t('common.startDate')}
63
136
  onchange={(next) => update('start', next)}
64
137
  />
65
- <span aria-hidden="true">至</span>
138
+ <span aria-hidden="true">{i18n.t('dateInput.to')}</span>
66
139
  <DateTimeInput
67
140
  value={value?.end ?? null}
68
141
  {mode}
69
- {...definedOptions({ min, max, step, id: endId, name: endName, describedby })}
142
+ {valueMode}
143
+ {disambiguation}
144
+ {...definedOptions({
145
+ timeZone, min: endMin, max, step, disabledDate,
146
+ id: endId, name: endName, describedby,
147
+ minInstant: instantMode ? validInstant(value?.start) : undefined,
148
+ })}
70
149
  {disabled}
71
150
  {required}
72
151
  {invalid}
152
+ ariaLabel={endAriaLabel ?? i18n.t('common.endDate')}
73
153
  onchange={(next) => update('end', next)}
74
154
  />
75
155
  </div>
@@ -1,14 +1,22 @@
1
1
  import { type DateTimeInputMode } from './DateTimeInput.svelte';
2
+ import type { DateInputOptions } from '@svadmin/core';
3
+ import { type DateTimeValueMode, type DateTimeDisambiguation } from '@svadmin/core/date-time';
2
4
  export interface DateRangeInputValue {
3
5
  start: string | null;
4
6
  end: string | null;
5
7
  }
8
+ export type DateRangePreset = NonNullable<DateInputOptions['presets']>[number];
6
9
  interface Props {
7
10
  value?: DateRangeInputValue | null;
8
11
  mode?: DateTimeInputMode;
12
+ valueMode?: DateTimeValueMode;
13
+ timeZone?: string;
14
+ disambiguation?: DateTimeDisambiguation;
9
15
  min?: string;
10
16
  max?: string;
11
17
  step?: number;
18
+ disabledDate?: (date: string) => boolean;
19
+ presets?: DateRangePreset[];
12
20
  startId?: string;
13
21
  endId?: string;
14
22
  startName?: string;
@@ -17,6 +25,8 @@ interface Props {
17
25
  required?: boolean;
18
26
  invalid?: boolean;
19
27
  describedby?: string;
28
+ startAriaLabel?: string;
29
+ endAriaLabel?: string;
20
30
  class?: string;
21
31
  onchange?: (value: DateRangeInputValue) => void;
22
32
  }
@@ -0,0 +1,10 @@
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import DateRangeInput from './DateRangeInput.svelte';
4
+
5
+ export type DateRangePickerProps = Omit<ComponentProps<typeof DateRangeInput>, 'mode'>;
6
+
7
+ let props: DateRangePickerProps = $props();
8
+ </script>
9
+
10
+ <DateRangeInput {...props} mode="date" />
@@ -0,0 +1,6 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import DateRangeInput from './DateRangeInput.svelte';
3
+ export type DateRangePickerProps = Omit<ComponentProps<typeof DateRangeInput>, 'mode'>;
4
+ declare const DateRangePicker: import("svelte").Component<DateRangePickerProps, {}, "">;
5
+ type DateRangePicker = ReturnType<typeof DateRangePicker>;
6
+ export default DateRangePicker;
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">
2
2
  import { Input } from './ui/input/index.js';
3
3
  import { cn } from '../utils.js';
4
+ import { useTranslation } from '@svadmin/core/i18n';
5
+ import { civilDateTimeToInstant, parseDateTimeInstant, formatCivilDateTime, type DateTimeValueMode, type DateTimeDisambiguation } from '@svadmin/core/date-time';
6
+ import { untrack } from 'svelte';
7
+ import { dateInputAllowed } from '../date-input-policy.js';
4
8
 
5
9
  export type DateTimeInputMode = 'date' | 'time' | 'datetime';
6
10
 
@@ -9,15 +13,22 @@
9
13
  mode?: DateTimeInputMode;
10
14
  min?: string;
11
15
  max?: string;
16
+ minInstant?: string;
17
+ maxInstant?: string;
12
18
  step?: number;
19
+ disabledDate?: (date: string) => boolean;
13
20
  id?: string;
14
21
  name?: string;
15
22
  disabled?: boolean;
16
23
  required?: boolean;
17
24
  invalid?: boolean;
18
25
  describedby?: string;
26
+ ariaLabel?: string;
19
27
  class?: string;
20
28
  onchange?: (value: string | null) => void;
29
+ timeZone?: string;
30
+ valueMode?: DateTimeValueMode;
31
+ disambiguation?: DateTimeDisambiguation;
21
32
  }
22
33
 
23
34
  let {
@@ -25,41 +36,99 @@
25
36
  mode = 'date',
26
37
  min,
27
38
  max,
39
+ minInstant,
40
+ maxInstant,
28
41
  step,
42
+ disabledDate,
29
43
  id,
30
44
  name,
31
45
  disabled = false,
32
46
  required = false,
33
47
  invalid = false,
34
48
  describedby,
49
+ ariaLabel,
35
50
  class: className = '',
36
51
  onchange,
52
+ timeZone,
53
+ valueMode = 'civil',
54
+ disambiguation = 'reject',
37
55
  }: Props = $props();
38
56
 
39
57
  const inputType = $derived(mode === 'datetime' ? 'datetime-local' : mode);
58
+ const i18n = useTranslation();
59
+ function toDraft(next: string | null | undefined): string {
60
+ if (!next) return '';
61
+ if (mode !== 'datetime' || valueMode === 'civil') return next;
62
+ const instant = parseDateTimeInstant(next);
63
+ return instant !== undefined && timeZone ? formatCivilDateTime(instant, timeZone) ?? '' : '';
64
+ }
65
+ function toValue(next: string): string | null {
66
+ if (next === '') return null;
67
+ if (mode !== 'datetime' || valueMode === 'civil') return next;
68
+ if (!timeZone) return null;
69
+ // 已带偏移的绑定值已确定重复小时中的具体时间点,不重新猜测。
70
+ if (value && next === toDraft(value) && parseDateTimeInstant(value) !== undefined) return value;
71
+ const instant = civilDateTimeToInstant(next, timeZone, disambiguation);
72
+ return instant === undefined ? null : new Date(instant).toISOString();
73
+ }
74
+ let draft = $state(untrack(() => toDraft(value)));
75
+ let inputRef = $state<HTMLInputElement | null>(null);
76
+ const instantMode = $derived(valueMode === 'instant');
77
+ function instantAllowed(next: string | null): boolean {
78
+ if (!instantMode || next === null) return true;
79
+ const instant = parseDateTimeInstant(next);
80
+ const lower = minInstant === undefined ? undefined : parseDateTimeInstant(minInstant);
81
+ const upper = maxInstant === undefined ? undefined : parseDateTimeInstant(maxInstant);
82
+ return instant !== undefined && (lower === undefined || instant >= lower) && (upper === undefined || instant <= upper);
83
+ }
84
+ const configurationInvalid = $derived(instantMode && (mode !== 'datetime'
85
+ || !timeZone || formatCivilDateTime(0, timeZone) === undefined
86
+ || minInstant !== undefined && parseDateTimeInstant(minInstant) === undefined
87
+ || maxInstant !== undefined && parseDateTimeInstant(maxInstant) === undefined));
88
+ const boundValueInvalid = $derived(instantMode && !!value && toDraft(value) === '');
89
+ const policyInvalid = $derived(configurationInvalid || boundValueInvalid || draft !== '' && (
90
+ !dateInputAllowed(draft, mode, min, max, disabledDate)
91
+ || instantMode && (toValue(draft) === null || !instantAllowed(toValue(draft)))
92
+ ));
93
+ $effect.pre(() => {
94
+ void mode;
95
+ draft = toDraft(value);
96
+ });
97
+ $effect(() => {
98
+ inputRef?.setCustomValidity(policyInvalid ? i18n.t('dateInput.unavailable') : '');
99
+ });
40
100
 
41
101
  function handleInput(event: Event): void {
42
102
  const input = event.currentTarget;
43
- if (!(input instanceof HTMLInputElement)) return;
44
- const next = input.value === '' ? null : input.value;
103
+ if (!(input instanceof HTMLInputElement) || disabled || configurationInvalid) return;
104
+ draft = input.value;
105
+ if (draft && !dateInputAllowed(draft, mode, min, max, disabledDate)) return;
106
+ const next = toValue(input.value);
107
+ if (input.value !== '' && next === null) return;
108
+ if (!instantAllowed(next)) return;
45
109
  value = next;
46
110
  onchange?.(next);
47
111
  }
48
112
  </script>
49
113
 
50
114
  <div class={cn('svadmin-u-6da6a3c3f741', className)} data-date-time-input={mode}>
115
+ {#if instantMode && name}
116
+ <input type="hidden" {name} value={value ?? ''} {disabled} />
117
+ {/if}
51
118
  <Input
52
119
  {id}
53
- {name}
120
+ name={instantMode ? undefined : name}
54
121
  type={inputType}
55
- value={value ?? ''}
122
+ bind:ref={inputRef}
123
+ value={draft}
56
124
  {min}
57
125
  {max}
58
126
  {step}
59
127
  {disabled}
60
128
  {required}
61
- aria-invalid={invalid || undefined}
129
+ aria-invalid={invalid || policyInvalid || undefined}
62
130
  aria-describedby={describedby}
131
+ aria-label={ariaLabel}
63
132
  oninput={handleInput}
64
133
  />
65
134
  </div>
@@ -1,18 +1,26 @@
1
+ import { type DateTimeValueMode, type DateTimeDisambiguation } from '@svadmin/core/date-time';
1
2
  export type DateTimeInputMode = 'date' | 'time' | 'datetime';
2
3
  interface Props {
3
4
  value?: string | null;
4
5
  mode?: DateTimeInputMode;
5
6
  min?: string;
6
7
  max?: string;
8
+ minInstant?: string;
9
+ maxInstant?: string;
7
10
  step?: number;
11
+ disabledDate?: (date: string) => boolean;
8
12
  id?: string;
9
13
  name?: string;
10
14
  disabled?: boolean;
11
15
  required?: boolean;
12
16
  invalid?: boolean;
13
17
  describedby?: string;
18
+ ariaLabel?: string;
14
19
  class?: string;
15
20
  onchange?: (value: string | null) => void;
21
+ timeZone?: string;
22
+ valueMode?: DateTimeValueMode;
23
+ disambiguation?: DateTimeDisambiguation;
16
24
  }
17
25
  declare const DateTimeInput: import("svelte").Component<Props, {}, "value">;
18
26
  type DateTimeInput = ReturnType<typeof DateTimeInput>;
@@ -0,0 +1,10 @@
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import DateTimeInput from './DateTimeInput.svelte';
4
+
5
+ export type DateTimePickerProps = Omit<ComponentProps<typeof DateTimeInput>, 'mode'>;
6
+
7
+ let props: DateTimePickerProps = $props();
8
+ </script>
9
+
10
+ <DateTimeInput {...props} mode="datetime" />
@@ -0,0 +1,6 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import DateTimeInput from './DateTimeInput.svelte';
3
+ export type DateTimePickerProps = Omit<ComponentProps<typeof DateTimeInput>, 'mode'>;
4
+ declare const DateTimePicker: import("svelte").Component<DateTimePickerProps, {}, "">;
5
+ type DateTimePicker = ReturnType<typeof DateTimePicker>;
6
+ export default DateTimePicker;
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte';
3
+ import { DEV } from 'esm-env';
3
4
  import { SvelteMap } from 'svelte/reactivity';
4
5
  import { fly } from 'svelte/transition';
5
6
  import { useQueryClient } from '@tanstack/svelte-query';
@@ -10,6 +11,11 @@
10
11
  parseQueryKey,
11
12
  } from '@svadmin/core';
12
13
  import { useTranslation } from '@svadmin/core/i18n';
14
+ import {
15
+ attachSvadminDevtoolsQueryClient,
16
+ installSvadminDevtoolsBridge,
17
+ publishSvadminDevtoolsSnapshot,
18
+ } from '../devtools-bridge.js';
13
19
 
14
20
  import TooltipButton from './TooltipButton.svelte';
15
21
  import * as Tabs from './ui/tabs/index.js';
@@ -19,34 +25,18 @@
19
25
  import { X, Bug, ChevronDown, ChevronUp, Wand2 } from '@lucide/svelte';
20
26
  import InferencerPanel from './InferencerPanel.svelte';
21
27
 
22
- type CacheDiagnostics = {
23
- queries: { total: number; fetching: number; stale: number; errors: number };
24
- mutations: { total: number; pending: number; paused: number; errors: number };
25
- };
26
-
27
- type ProviderDiagnostic = {
28
- name: string;
29
- configured: boolean;
30
- capabilities: string;
31
- };
32
-
33
- type SafeQueryDiagnostic = {
34
- provider: string;
35
- resource: string;
36
- operation: string;
37
- status: string;
38
- retries: number;
39
- duration: string;
40
- cacheAge: string;
41
- invalidation: string;
42
- };
28
+ import type {
29
+ DevtoolsCacheDiagnostics,
30
+ DevtoolsProviderDiagnostic,
31
+ DevtoolsQueryDiagnostic,
32
+ } from '../devtools-bridge.js';
43
33
 
44
- const EMPTY_CACHE_DIAGNOSTICS: CacheDiagnostics = {
34
+ const EMPTY_CACHE_DIAGNOSTICS: DevtoolsCacheDiagnostics = {
45
35
  queries: { total: 0, fetching: 0, stale: 0, errors: 0 },
46
36
  mutations: { total: 0, pending: 0, paused: 0, errors: 0 },
47
37
  };
48
38
 
49
- const isDev = import.meta.env.DEV;
39
+ const isDev = DEV;
50
40
  const i18n = useTranslation();
51
41
  const queryClient = useQueryClient();
52
42
  const adminContext = captureAdminContext();
@@ -54,8 +44,8 @@
54
44
  let { docked = false }: { docked?: boolean } = $props();
55
45
  let visible = $state(false);
56
46
  let collapsed = $state(false);
57
- let cacheDiagnostics = $state.raw<CacheDiagnostics>(EMPTY_CACHE_DIAGNOSTICS);
58
- let safeQueryDiagnostics = $state.raw<SafeQueryDiagnostic[]>([]);
47
+ let cacheDiagnostics = $state.raw<DevtoolsCacheDiagnostics>(EMPTY_CACHE_DIAGNOSTICS);
48
+ let safeQueryDiagnostics = $state.raw<DevtoolsQueryDiagnostic[]>([]);
59
49
  const queryTimings = new SvelteMap<string, { startedAt?: number; duration?: number }>();
60
50
 
61
51
  function toggle() {
@@ -109,6 +99,8 @@
109
99
 
110
100
  onMount(() => {
111
101
  if (!isDev) return;
102
+ attachSvadminDevtoolsQueryClient(queryClient);
103
+ installSvadminDevtoolsBridge();
112
104
  refreshCacheDiagnostics();
113
105
  const unsubscribeQueries = queryClient.getQueryCache().subscribe((event) => {
114
106
  // Observer events arrive in pairs during component rerenders. Refreshing diagnostics triggers another render,
@@ -163,7 +155,7 @@
163
155
  }
164
156
  });
165
157
 
166
- const frameworkProviders = $derived.by((): ProviderDiagnostic[] => {
158
+ const frameworkProviders = $derived.by((): DevtoolsProviderDiagnostic[] => {
167
159
  const access = adminContext.accessControlProvider;
168
160
  const audit = adminContext.auditLogProvider;
169
161
  const notification = adminContext.notificationProvider;
@@ -233,6 +225,22 @@
233
225
  },
234
226
  ];
235
227
  });
228
+
229
+ $effect(() => {
230
+ if (!isDev) return;
231
+ publishSvadminDevtoolsSnapshot({
232
+ version: 1,
233
+ environment: 'development',
234
+ route: path,
235
+ locale,
236
+ theme,
237
+ colorTheme,
238
+ resourceCount: resources.length,
239
+ providers: frameworkProviders,
240
+ cache: cacheDiagnostics,
241
+ queries: safeQueryDiagnostics,
242
+ });
243
+ });
236
244
  </script>
237
245
 
238
246
  <svelte:window onkeydown={isDev ? handleKeydown : undefined} />
@@ -0,0 +1,123 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import { connectPanelChannel, type PanelChannel } from 'devframe/in-page-channel';
4
+ import {
5
+ SVADMIN_DEVFRAME_CHANNEL,
6
+ type DevtoolsQuerySelector,
7
+ type SvadminDevframeProtocol,
8
+ type SvadminDevtoolsSnapshot,
9
+ } from '../devtools-bridge.js';
10
+
11
+ let channel = $state<PanelChannel<SvadminDevframeProtocol> | null>(null);
12
+ let snapshot = $state<SvadminDevtoolsSnapshot | null>(null);
13
+ let status = $state('connecting');
14
+ let busy = $state(false);
15
+ let selectedProvider = $state('');
16
+ let selectedResource = $state('');
17
+ let selectedOperation = $state('');
18
+
19
+ const selector = $derived<DevtoolsQuerySelector>({
20
+ ...(selectedProvider ? { provider: selectedProvider } : {}),
21
+ ...(selectedResource ? { resource: selectedResource } : {}),
22
+ ...(selectedOperation ? { operation: selectedOperation } : {}),
23
+ });
24
+
25
+ async function run(action: (selector?: DevtoolsQuerySelector) => Promise<void> | void): Promise<void> {
26
+ if (!channel || !snapshot) return;
27
+ busy = true;
28
+ try {
29
+ await action(Object.keys(selector).length > 0 ? selector : undefined);
30
+ snapshot = await channel.call('getSnapshot');
31
+ } finally {
32
+ busy = false;
33
+ }
34
+ }
35
+
36
+ onMount(() => {
37
+ const nextChannel = connectPanelChannel<SvadminDevframeProtocol>({
38
+ name: SVADMIN_DEVFRAME_CHANNEL,
39
+ functions: {},
40
+ });
41
+ channel = nextChannel;
42
+ status = nextChannel.status;
43
+ const onStatus = () => {
44
+ status = nextChannel.status;
45
+ if (nextChannel.status === 'connected') {
46
+ void nextChannel.call('getSnapshot').then((next) => { snapshot = next; });
47
+ }
48
+ };
49
+ nextChannel.events.on('status:updated', onStatus);
50
+ onStatus();
51
+ return () => nextChannel.close();
52
+ });
53
+
54
+ function unique(values: string[]): string[] {
55
+ return [...new Set(values)].sort();
56
+ }
57
+ </script>
58
+
59
+ <section aria-label="svadmin Devframe panel">
60
+ <header>
61
+ <strong>svadmin DevTools</strong>
62
+ <span>{status}</span>
63
+ </header>
64
+
65
+ {#if snapshot}
66
+ <dl>
67
+ <div><dt>Route</dt><dd>{snapshot.route}</dd></div>
68
+ <div><dt>Resources</dt><dd>{snapshot.resourceCount}</dd></div>
69
+ <div><dt>Queries</dt><dd>{snapshot.cache.queries.total}</dd></div>
70
+ <div><dt>Mutations</dt><dd>{snapshot.cache.mutations.total}</dd></div>
71
+ </dl>
72
+ <div>
73
+ <label>
74
+ Provider
75
+ <select bind:value={selectedProvider}>
76
+ <option value="">All</option>
77
+ {#each unique(snapshot.queries.map((query) => query.provider)) as provider (provider)}
78
+ <option value={provider}>{provider}</option>
79
+ {/each}
80
+ </select>
81
+ </label>
82
+ <label>
83
+ Resource
84
+ <select bind:value={selectedResource}>
85
+ <option value="">All</option>
86
+ {#each unique(snapshot.queries.map((query) => query.resource)) as resource (resource)}
87
+ <option value={resource}>{resource}</option>
88
+ {/each}
89
+ </select>
90
+ </label>
91
+ <label>
92
+ Operation
93
+ <select bind:value={selectedOperation}>
94
+ <option value="">All</option>
95
+ {#each unique(snapshot.queries.map((query) => query.operation)) as operation (operation)}
96
+ <option value={operation}>{operation}</option>
97
+ {/each}
98
+ </select>
99
+ </label>
100
+ </div>
101
+ {#if snapshot.queries.length > 0}
102
+ <ul>
103
+ {#each snapshot.queries as query (`${query.provider}:${query.resource}:${query.operation}`)}
104
+ <li>
105
+ <strong>{query.provider} / {query.resource}</strong>
106
+ <span>{query.operation} · {query.status} · {query.duration}</span>
107
+ </li>
108
+ {/each}
109
+ </ul>
110
+ {/if}
111
+ <div>
112
+ <button type="button" disabled={busy} onclick={() => run((selector) => channel?.call('cacheInvalidate', selector))}>Invalidate</button>
113
+ <button type="button" disabled={busy} onclick={() => run((selector) => channel?.call('cacheRefetch', selector))}>Refetch</button>
114
+ <button type="button" disabled={busy} onclick={() => run((selector) => channel?.call('cacheCancel', selector))}>Cancel</button>
115
+ <button type="button" disabled={busy} onclick={() => run((selector) => channel?.call('cacheReset', selector))}>Reset</button>
116
+ <button type="button" disabled={busy} onclick={() => run((selector) => channel?.call('cacheRemove', selector))}>Remove</button>
117
+ <button type="button" disabled={busy} onclick={() => run(() => channel?.call('cacheClear'))}>Clear cache</button>
118
+ <button type="button" disabled={busy} onclick={() => run(() => channel?.call('clearMutations'))}>Clear mutations</button>
119
+ </div>
120
+ {:else}
121
+ <p>Waiting for an svadmin page.</p>
122
+ {/if}
123
+ </section>
@@ -0,0 +1,3 @@
1
+ declare const DevframePanel: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type DevframePanel = ReturnType<typeof DevframePanel>;
3
+ export default DevframePanel;