@svadmin/ui 0.69.1 → 0.72.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 (158) hide show
  1. package/dist/actions.js +1 -1
  2. package/dist/app.css +102 -63
  3. package/dist/app.theme.css +102 -63
  4. package/dist/component-registry.svelte.d.ts +33 -19
  5. package/dist/component-registry.svelte.js +6 -4
  6. package/dist/components/AdminApp.svelte +55 -53
  7. package/dist/components/AdminApp.svelte.d.ts +2 -2
  8. package/dist/components/ApiSettings.svelte +19 -1
  9. package/dist/components/AuditLogDrawer.svelte +14 -3
  10. package/dist/components/AutoForm.svelte +146 -48
  11. package/dist/components/AutoForm.svelte.d.ts +2 -0
  12. package/dist/components/AutoTable.svelte +358 -258
  13. package/dist/components/AutoTable.svelte.d.ts +1 -0
  14. package/dist/components/BoundRecordDetailDrawer.svelte +166 -0
  15. package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +9 -0
  16. package/dist/components/Breadcrumbs.svelte +7 -4
  17. package/dist/components/CancelTaskButton.svelte +9 -5
  18. package/dist/components/ColumnHeaderFilter.svelte +4 -3
  19. package/dist/components/ColumnSettings.svelte +1 -0
  20. package/dist/components/ComboboxField.svelte +90 -30
  21. package/dist/components/ComboboxField.svelte.d.ts +2 -2
  22. package/dist/components/CreatePage.svelte +3 -1
  23. package/dist/components/DetailDrawer.svelte +4 -0
  24. package/dist/components/DetailDrawer.svelte.d.ts +1 -0
  25. package/dist/components/DevTools.svelte +1 -1
  26. package/dist/components/DraggableGrid.svelte +1 -0
  27. package/dist/components/DraggableHeader.svelte +5 -9
  28. package/dist/components/DraggableHeader.svelte.d.ts +43 -18
  29. package/dist/components/DraggableRowTable.svelte +2 -2
  30. package/dist/components/DynamicFormList.svelte +17 -17
  31. package/dist/components/DynamicFormList.svelte.d.ts +2 -1
  32. package/dist/components/EditPage.svelte +3 -1
  33. package/dist/components/EditableTable.svelte +4 -0
  34. package/dist/components/ErrorPage.svelte +3 -1
  35. package/dist/components/FieldDisplay.svelte +14 -0
  36. package/dist/components/FieldDisplay.svelte.d.ts +7 -0
  37. package/dist/components/FieldRenderer.svelte +9 -5
  38. package/dist/components/FilterBuilder.svelte +19 -8
  39. package/dist/components/FilterDropdown.svelte.d.ts +1 -1
  40. package/dist/components/Header.svelte +5 -6
  41. package/dist/components/ImportWizard.svelte +3 -2
  42. package/dist/components/InfiniteList.svelte +22 -8
  43. package/dist/components/InfiniteList.svelte.d.ts +5 -3
  44. package/dist/components/InlineEdit.svelte +114 -44
  45. package/dist/components/JsonSchemaForm.svelte +19 -14
  46. package/dist/components/Layout.svelte +19 -15
  47. package/dist/components/LazyTaskQueueDrawer.svelte +26 -0
  48. package/dist/components/LazyTaskQueueDrawer.svelte.d.ts +8 -0
  49. package/dist/components/ListPage.svelte +7 -6
  50. package/dist/components/MasterDetailView.svelte +3 -3
  51. package/dist/components/MediaLibraryModal.svelte +5 -2
  52. package/dist/components/MentionsInput.svelte +4 -3
  53. package/dist/components/NavigateToResource.svelte +3 -2
  54. package/dist/components/PermissionMatrix.svelte +4 -3
  55. package/dist/components/ProfilePage.svelte +2 -2
  56. package/dist/components/QuickEditDrawer.svelte +39 -0
  57. package/dist/components/QuickEditDrawer.svelte.d.ts +8 -0
  58. package/dist/components/RecordDetailDrawer.svelte +14 -108
  59. package/dist/components/RecordRowActions.svelte +41 -0
  60. package/dist/components/RecordRowActions.svelte.d.ts +14 -0
  61. package/dist/components/ResourceAccessGuard.svelte +7 -5
  62. package/dist/components/RetryTaskButton.svelte +9 -5
  63. package/dist/components/RowActions.svelte +5 -3
  64. package/dist/components/SensitiveDataMask.svelte +3 -3
  65. package/dist/components/SettingsPage.svelte +1 -1
  66. package/dist/components/ShowPage.svelte +44 -38
  67. package/dist/components/Sidebar.svelte +10 -8
  68. package/dist/components/SplitPaneLayout.svelte +4 -2
  69. package/dist/components/StepsForm.svelte +161 -44
  70. package/dist/components/StepsForm.svelte.d.ts +1 -0
  71. package/dist/components/TaskDetails.svelte +20 -7
  72. package/dist/components/TaskList.svelte +19 -7
  73. package/dist/components/TaskQueueDrawer.svelte +21 -22
  74. package/dist/components/Toast.svelte +4 -2
  75. package/dist/components/TooltipButton.svelte +1 -1
  76. package/dist/components/TreeSelect.svelte +4 -2
  77. package/dist/components/ValidatedField.svelte +27 -0
  78. package/dist/components/ValidatedField.svelte.d.ts +35 -0
  79. package/dist/components/account/ImportMembersPage.svelte +2 -2
  80. package/dist/components/account/SecurityLogPage.svelte +3 -1
  81. package/dist/components/account/SettingsEnterprisePage.svelte +7 -5
  82. package/dist/components/account/TeamMembersPage.svelte +1 -1
  83. package/dist/components/buttons/CloneButton.svelte +6 -4
  84. package/dist/components/buttons/DeleteButton.svelte +95 -29
  85. package/dist/components/buttons/DeleteButton.svelte.d.ts +2 -0
  86. package/dist/components/buttons/EditButton.svelte +6 -4
  87. package/dist/components/buttons/ExportButton.svelte +22 -4
  88. package/dist/components/buttons/ImportButton.svelte +83 -38
  89. package/dist/components/buttons/ImportButton.svelte.d.ts +6 -10
  90. package/dist/components/buttons/RefreshButton.svelte +48 -8
  91. package/dist/components/buttons/ShowButton.svelte +6 -4
  92. package/dist/components/content/ApiKeyList.svelte +3 -1
  93. package/dist/components/content/ContentPageShell.svelte +3 -1
  94. package/dist/components/content/FileList.svelte +3 -1
  95. package/dist/components/content/MemberList.svelte +3 -1
  96. package/dist/components/content/NetworkTable.svelte +3 -1
  97. package/dist/components/content/SecurityEventTable.svelte +3 -1
  98. package/dist/components/content/StatusTabs.svelte +2 -2
  99. package/dist/components/fieldComponentMap.d.ts +18 -13
  100. package/dist/components/fieldComponentMap.js +95 -47
  101. package/dist/components/fields/AvatarField.svelte +1 -1
  102. package/dist/components/fields/ChoiceField.svelte +16 -0
  103. package/dist/components/fields/ChoiceField.svelte.d.ts +10 -0
  104. package/dist/components/fields/CodeField.svelte +11 -12
  105. package/dist/components/fields/CodeField.svelte.d.ts +1 -1
  106. package/dist/components/fields/DateRangeField.svelte +2 -4
  107. package/dist/components/fields/ImageField.svelte +3 -1
  108. package/dist/components/fields/ImagesField.svelte +23 -0
  109. package/dist/components/fields/ImagesField.svelte.d.ts +6 -0
  110. package/dist/components/fields/JsonField.svelte +19 -13
  111. package/dist/components/fields/PasswordField.svelte +5 -0
  112. package/dist/components/fields/PasswordField.svelte.d.ts +6 -0
  113. package/dist/components/fields/json-value.d.ts +11 -0
  114. package/dist/components/fields/json-value.js +28 -0
  115. package/dist/components/profile/ActivityTimeline.svelte +2 -2
  116. package/dist/components/record-detail.svelte.d.ts +16 -0
  117. package/dist/components/record-detail.svelte.js +28 -0
  118. package/dist/components/saved-list-views.js +29 -29
  119. package/dist/components/table-contract.d.ts +13 -0
  120. package/dist/components/table-contract.js +42 -0
  121. package/dist/components/task-utils.js +4 -2
  122. package/dist/components/ui/alert/alert-variants.d.ts +2 -3
  123. package/dist/components/ui/alert/alert-variants.js +1 -2
  124. package/dist/components/ui/alert/alert.svelte +4 -5
  125. package/dist/components/ui/alert/alert.svelte.d.ts +3 -8
  126. package/dist/components/ui/alert/index.js +0 -2
  127. package/dist/components/ui/avatar/avatar-variants.d.ts +2 -3
  128. package/dist/components/ui/avatar/avatar-variants.js +1 -2
  129. package/dist/components/ui/avatar/avatar.svelte +5 -6
  130. package/dist/components/ui/avatar/avatar.svelte.d.ts +3 -8
  131. package/dist/components/ui/badge/badge-variants.d.ts +2 -3
  132. package/dist/components/ui/badge/badge-variants.js +1 -2
  133. package/dist/components/ui/badge/badge.svelte +4 -5
  134. package/dist/components/ui/badge/badge.svelte.d.ts +3 -8
  135. package/dist/components/ui/badge/index.js +0 -2
  136. package/dist/components/ui/button/button-variants.d.ts +2 -3
  137. package/dist/components/ui/button/button-variants.js +1 -2
  138. package/dist/components/ui/button/button.svelte +100 -44
  139. package/dist/components/ui/button/button.svelte.d.ts +8 -12
  140. package/dist/components/ui/button/index.js +0 -2
  141. package/dist/components/ui/command/command-dialog.svelte +3 -1
  142. package/dist/components/ui/command/command-dialog.svelte.d.ts +1 -1
  143. package/dist/components/ui/command/command-group.svelte +4 -2
  144. package/dist/components/ui/command/command-item.svelte +4 -2
  145. package/dist/components/ui/command/command-separator.svelte +3 -1
  146. package/dist/components/ui/command/index.d.ts +5 -5
  147. package/dist/components/ui/input/input.svelte +40 -20
  148. package/dist/components/ui/input/input.svelte.d.ts +5 -4
  149. package/dist/components/ui/sheet/sheet.svelte +9 -3
  150. package/dist/components/ui/sheet/sheet.svelte.d.ts +1 -0
  151. package/dist/components/ui/tooltip/tooltip.svelte +4 -2
  152. package/dist/index.d.ts +1 -1
  153. package/dist/inline-value.d.ts +5 -0
  154. package/dist/inline-value.js +24 -0
  155. package/dist/numeric-input.d.ts +2 -0
  156. package/dist/numeric-input.js +9 -0
  157. package/dist/types.d.ts +3 -3
  158. package/package.json +11 -5
package/dist/actions.js CHANGED
@@ -50,7 +50,7 @@ export function shortcut(_node, params) {
50
50
  */
51
51
  export function intersect(node, callback) {
52
52
  const observer = new IntersectionObserver(([entry]) => {
53
- if (entry.isIntersecting)
53
+ if (entry?.isIntersecting)
54
54
  callback();
55
55
  }, { rootMargin: '200px' });
56
56
  observer.observe(node);
package/dist/app.css CHANGED
@@ -2,7 +2,7 @@
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
5
- :where(:root, :host) {
5
+ :root, :host {
6
6
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
7
7
  "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
8
8
  "Segoe UI Symbol", "Noto Color Emoji";
@@ -2926,6 +2926,10 @@
2926
2926
  outline-style: var(--tw-outline-style);
2927
2927
  outline-width: 1px;
2928
2928
  }
2929
+ .blur {
2930
+ --tw-blur: blur(8px);
2931
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
2932
+ }
2929
2933
  .drop-shadow-sm {
2930
2934
  --tw-drop-shadow-size: drop-shadow(0 1px 2px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.15)));
2931
2935
  --tw-drop-shadow: drop-shadow(var(--drop-shadow-sm));
@@ -3014,6 +3018,9 @@
3014
3018
  .fade-in {
3015
3019
  --tw-enter-opacity: 0;
3016
3020
  }
3021
+ .running {
3022
+ animation-play-state: running;
3023
+ }
3017
3024
  .slide-in-from-right {
3018
3025
  --tw-enter-translate-x: 100%;
3019
3026
  }
@@ -4541,36 +4548,36 @@ body {
4541
4548
  h1, h2, h3, h4, h5, h6, [data-slot="card-title"] {
4542
4549
  letter-spacing: 0;
4543
4550
  }
4544
- @layer components {
4545
- :is([data-slot="button"], .svadmin-button), :is([data-svadmin-button], .svadmin-button), [data-slot="input"], [data-slot="select-trigger"], [data-slot="select"], [data-slot="textarea"] {
4546
- box-shadow: var(--shadow-control);
4547
- transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, box-shadow 140ms ease;
4548
- }
4549
- [data-slot="input"], [data-slot="textarea"], [data-slot="select"], [data-slot="select-trigger"] {
4550
- background-color: var(--card);
4551
- }
4552
- [data-slot="card"] {
4553
- box-shadow: var(--shadow-surface);
4554
- transition: border-color 160ms ease, box-shadow 160ms ease;
4555
- }
4556
- [data-slot="card"][data-interactive="true"]:hover {
4557
- border-color: var(--primary);
4558
- @supports (color: color-mix(in lab, red, red)) {
4559
- border-color: color-mix(in oklch, var(--primary) 24%, var(--border));
4560
- }
4561
- box-shadow: var(--shadow-surface-hover);
4562
- }
4563
- [data-slot="dialog-content"], [data-slot="sheet-content"], [data-slot="popover-content"], [data-slot="dropdown-menu-content"], [data-slot="context-menu-content"] {
4564
- box-shadow: var(--shadow-overlay);
4551
+ :is([data-slot="button"], .svadmin-button), :is([data-svadmin-button], .svadmin-button), [data-slot="input"], [data-slot="select-trigger"], [data-slot="select"], [data-slot="textarea"] {
4552
+ box-shadow: var(--shadow-control);
4553
+ transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, box-shadow 140ms ease;
4554
+ }
4555
+ [data-slot="input"], [data-slot="textarea"], [data-slot="select"], [data-slot="select-trigger"] {
4556
+ background-color: var(--card);
4557
+ }
4558
+ [data-slot="card"] {
4559
+ box-shadow: var(--shadow-surface);
4560
+ transition: border-color 160ms ease, box-shadow 160ms ease;
4561
+ }
4562
+ [data-slot="card"][data-interactive="true"]:hover {
4563
+ border-color: var(--primary);
4564
+ @supports (color: color-mix(in lab, red, red)) {
4565
+ border-color: color-mix(in oklch, var(--primary) 24%, var(--border));
4565
4566
  }
4566
- :is([data-slot="button"], .svadmin-button):focus-visible, :is([data-svadmin-button], .svadmin-button):focus-visible, [data-slot="input"]:focus-visible, [data-slot="textarea"]:focus-visible, [data-slot="select-trigger"]:focus-visible, .sidebar-menu-item:focus-visible {
4567
- border-color: var(--ring);
4568
- outline: 2px solid var(--ring);
4569
- @supports (color: color-mix(in lab, red, red)) {
4570
- outline: 2px solid color-mix(in oklch, var(--ring) 48%, transparent);
4571
- }
4572
- outline-offset: 2px;
4567
+ box-shadow: var(--shadow-surface-hover);
4568
+ }
4569
+ [data-slot="dialog-content"], [data-slot="sheet-content"], [data-slot="popover-content"], [data-slot="dropdown-menu-content"], [data-slot="context-menu-content"] {
4570
+ box-shadow: var(--shadow-overlay);
4571
+ }
4572
+ :is([data-slot="button"], .svadmin-button):focus-visible, :is([data-svadmin-button], .svadmin-button):focus-visible, [data-slot="input"]:focus-visible, [data-slot="textarea"]:focus-visible, [data-slot="select-trigger"]:focus-visible, .sidebar-menu-item:focus-visible {
4573
+ border-color: var(--ring);
4574
+ outline: 2px solid var(--ring);
4575
+ @supports (color: color-mix(in lab, red, red)) {
4576
+ outline: 2px solid color-mix(in oklch, var(--ring) 48%, transparent);
4573
4577
  }
4578
+ outline-offset: 2px;
4579
+ }
4580
+ @layer components {
4574
4581
  :is([data-slot="button"], .svadmin-button), :is([data-svadmin-button], .svadmin-button) {
4575
4582
  display: inline-flex;
4576
4583
  flex-shrink: 0;
@@ -4699,10 +4706,6 @@ h1, h2, h3, h4, h5, h6, [data-slot="card-title"] {
4699
4706
  color: currentColor;
4700
4707
  transform: translateY(0.125rem);
4701
4708
  }
4702
- :is([data-slot="alert"], .svadmin-alert).svadmin-alert:has(> svg) {
4703
- grid-template-columns: 1rem minmax(0, 1fr);
4704
- column-gap: 0.75rem;
4705
- }
4706
4709
  :is([data-slot="alert"], .svadmin-alert).svadmin-alert:is([data-variant="destructive"], .svadmin-alert--destructive) {
4707
4710
  color: var(--destructive);
4708
4711
  }
@@ -5023,6 +5026,53 @@ main {
5023
5026
  .svadmin-rich-text {
5024
5027
  color: var(--foreground);
5025
5028
  }
5029
+ .svadmin-file-input {
5030
+ position: relative;
5031
+ width: 100%;
5032
+ min-width: 0;
5033
+ height: 2.25rem;
5034
+ }
5035
+ .svadmin-file-input__visual {
5036
+ display: flex;
5037
+ align-items: center;
5038
+ gap: 0.75rem;
5039
+ width: 100%;
5040
+ height: 100%;
5041
+ overflow: hidden;
5042
+ border: 1px solid var(--border);
5043
+ border-radius: 0.5rem;
5044
+ background: var(--card);
5045
+ box-shadow: var(--shadow-control);
5046
+ padding: 0.25rem 0.75rem 0.25rem 0.25rem;
5047
+ color: var(--muted-foreground);
5048
+ pointer-events: none;
5049
+ transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, box-shadow 140ms ease;
5050
+ }
5051
+ .svadmin-file-input__button {
5052
+ flex: 0 0 auto;
5053
+ display: inline-flex;
5054
+ align-items: center;
5055
+ height: 1.75rem;
5056
+ border: 1px solid var(--border);
5057
+ @supports (color: color-mix(in lab, red, red)) {
5058
+ border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
5059
+ }
5060
+ border-radius: 0.375rem;
5061
+ padding: 0 0.625rem;
5062
+ background: var(--muted);
5063
+ color: var(--foreground);
5064
+ font: inherit;
5065
+ font-size: 0.75rem;
5066
+ white-space: nowrap;
5067
+ }
5068
+ .svadmin-file-input__name {
5069
+ overflow: hidden;
5070
+ text-overflow: ellipsis;
5071
+ white-space: nowrap;
5072
+ }
5073
+ .svadmin-file-input[data-disabled="true"] .svadmin-file-input__visual {
5074
+ opacity: 0.5;
5075
+ }
5026
5076
  .svadmin-input {
5027
5077
  width: 100%;
5028
5078
  min-width: 0;
@@ -5039,10 +5089,23 @@ main {
5039
5089
  font-size: 0.875rem;
5040
5090
  }
5041
5091
  .svadmin-input[data-input-type="file"] {
5042
- padding: 0.25rem 0.75rem 0.25rem 0.25rem;
5043
- color: var(--muted-foreground);
5092
+ position: absolute;
5093
+ z-index: 1;
5094
+ inset: 0;
5095
+ height: 100%;
5096
+ border: 0;
5097
+ padding: 0;
5098
+ opacity: 0;
5099
+ appearance: none;
5044
5100
  cursor: pointer;
5045
5101
  }
5102
+ .svadmin-input[data-input-type="file"]:focus-visible + .svadmin-file-input__visual {
5103
+ border-color: var(--ring);
5104
+ box-shadow: 0 0 0 3px var(--ring);
5105
+ @supports (color: color-mix(in lab, red, red)) {
5106
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 20%, transparent);
5107
+ }
5108
+ }
5046
5109
  .svadmin-input:focus-visible {
5047
5110
  border-color: var(--ring);
5048
5111
  box-shadow: 0 0 0 3px var(--ring);
@@ -5064,21 +5127,6 @@ main {
5064
5127
  .svadmin-input::placeholder {
5065
5128
  color: var(--muted-foreground);
5066
5129
  }
5067
- .svadmin-input::file-selector-button {
5068
- margin-right: 0.75rem;
5069
- height: 1.75rem;
5070
- border: 1px solid var(--border);
5071
- @supports (color: color-mix(in lab, red, red)) {
5072
- border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
5073
- }
5074
- border-radius: 0.375rem;
5075
- padding: 0 0.625rem;
5076
- background: var(--muted);
5077
- color: var(--foreground);
5078
- font: inherit;
5079
- font-size: 0.75rem;
5080
- cursor: pointer;
5081
- }
5082
5130
  .svadmin-card {
5083
5131
  display: flex;
5084
5132
  flex-direction: column;
@@ -5957,11 +6005,6 @@ main {
5957
6005
  backdrop-filter: blur(12px);
5958
6006
  transition: width 300ms ease, height 300ms ease;
5959
6007
  }
5960
- @media (min-width: 768px) {
5961
- .svadmin-navigation-viewport {
5962
- width: var(--bits-navigation-menu-viewport-width);
5963
- }
5964
- }
5965
6008
  .svadmin-popover-content {
5966
6009
  z-index: 50;
5967
6010
  width: 18rem;
@@ -6214,7 +6257,7 @@ main {
6214
6257
  color: var(--muted-foreground);
6215
6258
  }
6216
6259
  .svadmin-alert-description {
6217
- grid-column: 1;
6260
+ grid-column: 2;
6218
6261
  color: var(--muted-foreground);
6219
6262
  font-size: 0.875rem;
6220
6263
  }
@@ -6222,7 +6265,7 @@ main {
6222
6265
  line-height: 1.625;
6223
6266
  }
6224
6267
  .svadmin-alert-title {
6225
- grid-column: 1;
6268
+ grid-column: 2;
6226
6269
  min-height: 1rem;
6227
6270
  overflow: hidden;
6228
6271
  color: var(--foreground);
@@ -6231,9 +6274,6 @@ main {
6231
6274
  text-overflow: ellipsis;
6232
6275
  white-space: nowrap;
6233
6276
  }
6234
- .svadmin-alert:has(> svg) > :is(.svadmin-alert-title, .svadmin-alert-description) {
6235
- grid-column: 2;
6236
- }
6237
6277
  .svadmin-scroll-area {
6238
6278
  position: relative;
6239
6279
  overflow: hidden;
@@ -7710,8 +7750,8 @@ details[data-svadmin-filter]:not([open]) > :not(summary), details.svadmin-collap
7710
7750
  }
7711
7751
  }
7712
7752
  }
7713
- @layer theme{
7714
- :where(:root, .svadmin-theme){
7753
+ :root,
7754
+ .svadmin-theme{
7715
7755
  --color-background: var(--background);
7716
7756
  --color-foreground: var(--foreground);
7717
7757
  --color-card: var(--card);
@@ -7758,5 +7798,4 @@ details[data-svadmin-filter]:not([open]) > :not(summary), details.svadmin-collap
7758
7798
  --shadow-surface: var(--svadmin-shadow-surface);
7759
7799
  --shadow-surface-hover: var(--svadmin-shadow-surface-hover);
7760
7800
  --shadow-overlay: var(--svadmin-shadow-overlay);
7761
- }
7762
7801
  }
@@ -2,7 +2,7 @@
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
5
- :where(:root, :host) {
5
+ :root, :host {
6
6
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
7
7
  "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
8
8
  "Segoe UI Symbol", "Noto Color Emoji";
@@ -2926,6 +2926,10 @@
2926
2926
  outline-style: var(--tw-outline-style);
2927
2927
  outline-width: 1px;
2928
2928
  }
2929
+ .blur {
2930
+ --tw-blur: blur(8px);
2931
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
2932
+ }
2929
2933
  .drop-shadow-sm {
2930
2934
  --tw-drop-shadow-size: drop-shadow(0 1px 2px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.15)));
2931
2935
  --tw-drop-shadow: drop-shadow(var(--drop-shadow-sm));
@@ -3014,6 +3018,9 @@
3014
3018
  .fade-in {
3015
3019
  --tw-enter-opacity: 0;
3016
3020
  }
3021
+ .running {
3022
+ animation-play-state: running;
3023
+ }
3017
3024
  .slide-in-from-right {
3018
3025
  --tw-enter-translate-x: 100%;
3019
3026
  }
@@ -4541,36 +4548,36 @@ body {
4541
4548
  h1, h2, h3, h4, h5, h6, [data-slot="card-title"] {
4542
4549
  letter-spacing: 0;
4543
4550
  }
4544
- @layer components {
4545
- :is([data-slot="button"], .svadmin-button), :is([data-svadmin-button], .svadmin-button), [data-slot="input"], [data-slot="select-trigger"], [data-slot="select"], [data-slot="textarea"] {
4546
- box-shadow: var(--shadow-control);
4547
- transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, box-shadow 140ms ease;
4548
- }
4549
- [data-slot="input"], [data-slot="textarea"], [data-slot="select"], [data-slot="select-trigger"] {
4550
- background-color: var(--card);
4551
- }
4552
- [data-slot="card"] {
4553
- box-shadow: var(--shadow-surface);
4554
- transition: border-color 160ms ease, box-shadow 160ms ease;
4555
- }
4556
- [data-slot="card"][data-interactive="true"]:hover {
4557
- border-color: var(--primary);
4558
- @supports (color: color-mix(in lab, red, red)) {
4559
- border-color: color-mix(in oklch, var(--primary) 24%, var(--border));
4560
- }
4561
- box-shadow: var(--shadow-surface-hover);
4562
- }
4563
- [data-slot="dialog-content"], [data-slot="sheet-content"], [data-slot="popover-content"], [data-slot="dropdown-menu-content"], [data-slot="context-menu-content"] {
4564
- box-shadow: var(--shadow-overlay);
4551
+ :is([data-slot="button"], .svadmin-button), :is([data-svadmin-button], .svadmin-button), [data-slot="input"], [data-slot="select-trigger"], [data-slot="select"], [data-slot="textarea"] {
4552
+ box-shadow: var(--shadow-control);
4553
+ transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, box-shadow 140ms ease;
4554
+ }
4555
+ [data-slot="input"], [data-slot="textarea"], [data-slot="select"], [data-slot="select-trigger"] {
4556
+ background-color: var(--card);
4557
+ }
4558
+ [data-slot="card"] {
4559
+ box-shadow: var(--shadow-surface);
4560
+ transition: border-color 160ms ease, box-shadow 160ms ease;
4561
+ }
4562
+ [data-slot="card"][data-interactive="true"]:hover {
4563
+ border-color: var(--primary);
4564
+ @supports (color: color-mix(in lab, red, red)) {
4565
+ border-color: color-mix(in oklch, var(--primary) 24%, var(--border));
4565
4566
  }
4566
- :is([data-slot="button"], .svadmin-button):focus-visible, :is([data-svadmin-button], .svadmin-button):focus-visible, [data-slot="input"]:focus-visible, [data-slot="textarea"]:focus-visible, [data-slot="select-trigger"]:focus-visible, .sidebar-menu-item:focus-visible {
4567
- border-color: var(--ring);
4568
- outline: 2px solid var(--ring);
4569
- @supports (color: color-mix(in lab, red, red)) {
4570
- outline: 2px solid color-mix(in oklch, var(--ring) 48%, transparent);
4571
- }
4572
- outline-offset: 2px;
4567
+ box-shadow: var(--shadow-surface-hover);
4568
+ }
4569
+ [data-slot="dialog-content"], [data-slot="sheet-content"], [data-slot="popover-content"], [data-slot="dropdown-menu-content"], [data-slot="context-menu-content"] {
4570
+ box-shadow: var(--shadow-overlay);
4571
+ }
4572
+ :is([data-slot="button"], .svadmin-button):focus-visible, :is([data-svadmin-button], .svadmin-button):focus-visible, [data-slot="input"]:focus-visible, [data-slot="textarea"]:focus-visible, [data-slot="select-trigger"]:focus-visible, .sidebar-menu-item:focus-visible {
4573
+ border-color: var(--ring);
4574
+ outline: 2px solid var(--ring);
4575
+ @supports (color: color-mix(in lab, red, red)) {
4576
+ outline: 2px solid color-mix(in oklch, var(--ring) 48%, transparent);
4573
4577
  }
4578
+ outline-offset: 2px;
4579
+ }
4580
+ @layer components {
4574
4581
  :is([data-slot="button"], .svadmin-button), :is([data-svadmin-button], .svadmin-button) {
4575
4582
  display: inline-flex;
4576
4583
  flex-shrink: 0;
@@ -4699,10 +4706,6 @@ h1, h2, h3, h4, h5, h6, [data-slot="card-title"] {
4699
4706
  color: currentColor;
4700
4707
  transform: translateY(0.125rem);
4701
4708
  }
4702
- :is([data-slot="alert"], .svadmin-alert).svadmin-alert:has(> svg) {
4703
- grid-template-columns: 1rem minmax(0, 1fr);
4704
- column-gap: 0.75rem;
4705
- }
4706
4709
  :is([data-slot="alert"], .svadmin-alert).svadmin-alert:is([data-variant="destructive"], .svadmin-alert--destructive) {
4707
4710
  color: var(--destructive);
4708
4711
  }
@@ -5023,6 +5026,53 @@ main {
5023
5026
  .svadmin-rich-text {
5024
5027
  color: var(--foreground);
5025
5028
  }
5029
+ .svadmin-file-input {
5030
+ position: relative;
5031
+ width: 100%;
5032
+ min-width: 0;
5033
+ height: 2.25rem;
5034
+ }
5035
+ .svadmin-file-input__visual {
5036
+ display: flex;
5037
+ align-items: center;
5038
+ gap: 0.75rem;
5039
+ width: 100%;
5040
+ height: 100%;
5041
+ overflow: hidden;
5042
+ border: 1px solid var(--border);
5043
+ border-radius: 0.5rem;
5044
+ background: var(--card);
5045
+ box-shadow: var(--shadow-control);
5046
+ padding: 0.25rem 0.75rem 0.25rem 0.25rem;
5047
+ color: var(--muted-foreground);
5048
+ pointer-events: none;
5049
+ transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, box-shadow 140ms ease;
5050
+ }
5051
+ .svadmin-file-input__button {
5052
+ flex: 0 0 auto;
5053
+ display: inline-flex;
5054
+ align-items: center;
5055
+ height: 1.75rem;
5056
+ border: 1px solid var(--border);
5057
+ @supports (color: color-mix(in lab, red, red)) {
5058
+ border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
5059
+ }
5060
+ border-radius: 0.375rem;
5061
+ padding: 0 0.625rem;
5062
+ background: var(--muted);
5063
+ color: var(--foreground);
5064
+ font: inherit;
5065
+ font-size: 0.75rem;
5066
+ white-space: nowrap;
5067
+ }
5068
+ .svadmin-file-input__name {
5069
+ overflow: hidden;
5070
+ text-overflow: ellipsis;
5071
+ white-space: nowrap;
5072
+ }
5073
+ .svadmin-file-input[data-disabled="true"] .svadmin-file-input__visual {
5074
+ opacity: 0.5;
5075
+ }
5026
5076
  .svadmin-input {
5027
5077
  width: 100%;
5028
5078
  min-width: 0;
@@ -5039,10 +5089,23 @@ main {
5039
5089
  font-size: 0.875rem;
5040
5090
  }
5041
5091
  .svadmin-input[data-input-type="file"] {
5042
- padding: 0.25rem 0.75rem 0.25rem 0.25rem;
5043
- color: var(--muted-foreground);
5092
+ position: absolute;
5093
+ z-index: 1;
5094
+ inset: 0;
5095
+ height: 100%;
5096
+ border: 0;
5097
+ padding: 0;
5098
+ opacity: 0;
5099
+ appearance: none;
5044
5100
  cursor: pointer;
5045
5101
  }
5102
+ .svadmin-input[data-input-type="file"]:focus-visible + .svadmin-file-input__visual {
5103
+ border-color: var(--ring);
5104
+ box-shadow: 0 0 0 3px var(--ring);
5105
+ @supports (color: color-mix(in lab, red, red)) {
5106
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 20%, transparent);
5107
+ }
5108
+ }
5046
5109
  .svadmin-input:focus-visible {
5047
5110
  border-color: var(--ring);
5048
5111
  box-shadow: 0 0 0 3px var(--ring);
@@ -5064,21 +5127,6 @@ main {
5064
5127
  .svadmin-input::placeholder {
5065
5128
  color: var(--muted-foreground);
5066
5129
  }
5067
- .svadmin-input::file-selector-button {
5068
- margin-right: 0.75rem;
5069
- height: 1.75rem;
5070
- border: 1px solid var(--border);
5071
- @supports (color: color-mix(in lab, red, red)) {
5072
- border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
5073
- }
5074
- border-radius: 0.375rem;
5075
- padding: 0 0.625rem;
5076
- background: var(--muted);
5077
- color: var(--foreground);
5078
- font: inherit;
5079
- font-size: 0.75rem;
5080
- cursor: pointer;
5081
- }
5082
5130
  .svadmin-card {
5083
5131
  display: flex;
5084
5132
  flex-direction: column;
@@ -5957,11 +6005,6 @@ main {
5957
6005
  backdrop-filter: blur(12px);
5958
6006
  transition: width 300ms ease, height 300ms ease;
5959
6007
  }
5960
- @media (min-width: 768px) {
5961
- .svadmin-navigation-viewport {
5962
- width: var(--bits-navigation-menu-viewport-width);
5963
- }
5964
- }
5965
6008
  .svadmin-popover-content {
5966
6009
  z-index: 50;
5967
6010
  width: 18rem;
@@ -6214,7 +6257,7 @@ main {
6214
6257
  color: var(--muted-foreground);
6215
6258
  }
6216
6259
  .svadmin-alert-description {
6217
- grid-column: 1;
6260
+ grid-column: 2;
6218
6261
  color: var(--muted-foreground);
6219
6262
  font-size: 0.875rem;
6220
6263
  }
@@ -6222,7 +6265,7 @@ main {
6222
6265
  line-height: 1.625;
6223
6266
  }
6224
6267
  .svadmin-alert-title {
6225
- grid-column: 1;
6268
+ grid-column: 2;
6226
6269
  min-height: 1rem;
6227
6270
  overflow: hidden;
6228
6271
  color: var(--foreground);
@@ -6231,9 +6274,6 @@ main {
6231
6274
  text-overflow: ellipsis;
6232
6275
  white-space: nowrap;
6233
6276
  }
6234
- .svadmin-alert:has(> svg) > :is(.svadmin-alert-title, .svadmin-alert-description) {
6235
- grid-column: 2;
6236
- }
6237
6277
  .svadmin-scroll-area {
6238
6278
  position: relative;
6239
6279
  overflow: hidden;
@@ -7761,8 +7801,8 @@ details[data-svadmin-filter]:not([open]) > :not(summary), details.svadmin-collap
7761
7801
  --shadow-surface-hover: var(--svadmin-shadow-surface-hover);
7762
7802
  --shadow-overlay: var(--svadmin-shadow-overlay);
7763
7803
  }
7764
- @layer theme{
7765
- :where(:root, .svadmin-theme){
7804
+ :root,
7805
+ .svadmin-theme{
7766
7806
  --color-background: var(--background);
7767
7807
  --color-foreground: var(--foreground);
7768
7808
  --color-card: var(--card);
@@ -7809,5 +7849,4 @@ details[data-svadmin-filter]:not([open]) > :not(summary), details.svadmin-collap
7809
7849
  --shadow-surface: var(--svadmin-shadow-surface);
7810
7850
  --shadow-surface-hover: var(--svadmin-shadow-surface-hover);
7811
7851
  --shadow-overlay: var(--svadmin-shadow-overlay);
7812
- }
7813
7852
  }
@@ -5,35 +5,49 @@
5
5
  * prop on `AdminApp`, while providing sensible defaults.
6
6
  */
7
7
  import { type Component } from 'svelte';
8
+ import type Layout from './components/Layout.svelte';
9
+ import type Sidebar from './components/Sidebar.svelte';
10
+ import type Header from './components/Header.svelte';
11
+ import type LoginPage from './components/LoginPage.svelte';
12
+ import type AutoTable from './components/AutoTable.svelte';
13
+ import type AutoForm from './components/AutoForm.svelte';
14
+ import type ShowPage from './components/ShowPage.svelte';
15
+ import type ErrorPage from './components/ErrorPage.svelte';
16
+ import type Button from './components/ui/button/button.svelte';
17
+ import type Input from './components/ui/input/input.svelte';
18
+ import type Badge from './components/ui/badge/badge.svelte';
19
+ import type Skeleton from './components/ui/skeleton/skeleton.svelte';
20
+ import type Breadcrumbs from './components/Breadcrumbs.svelte';
21
+ import type TaskQueueDrawer from './components/TaskQueueDrawer.svelte';
8
22
  export interface ComponentRegistry {
9
- Layout: Component<any>;
10
- Sidebar: Component<any>;
11
- Header: Component<any>;
12
- LoginPage: Component<any>;
13
- AutoTable: Component<any>;
14
- AutoForm: Component<any>;
15
- ShowPage: Component<any>;
16
- ErrorPage?: Component<any>;
17
- Button: Component<any>;
18
- Input: Component<any>;
19
- Badge: Component<any>;
20
- Skeleton: Component<any>;
23
+ Layout: typeof Layout;
24
+ Sidebar: typeof Sidebar;
25
+ Header: typeof Header;
26
+ LoginPage: typeof LoginPage;
27
+ AutoTable: typeof AutoTable;
28
+ AutoForm: typeof AutoForm;
29
+ ShowPage: typeof ShowPage;
30
+ ErrorPage?: typeof ErrorPage;
31
+ Button: typeof Button;
32
+ Input: typeof Input;
33
+ Badge: typeof Badge;
34
+ Skeleton: typeof Skeleton;
21
35
  /** Custom dashboard page component (replaces default welcome message) */
22
- DashboardPage?: Component<any>;
36
+ DashboardPage?: Component;
23
37
  /** Custom breadcrumbs component (replaces built-in Breadcrumbs) */
24
- Breadcrumbs?: Component<any>;
38
+ Breadcrumbs?: typeof Breadcrumbs;
25
39
  /** Custom theme toggle button (replaces built-in Sun/Moon toggle) */
26
- ThemeToggle?: Component<any>;
40
+ ThemeToggle?: Component;
27
41
  /** Custom user menu / avatar dropdown in the header */
28
- UserMenu?: Component<any>;
42
+ UserMenu?: Component;
29
43
  /** Custom notification panel / bell icon in the header */
30
- NotificationPanel?: Component<any>;
44
+ NotificationPanel?: Component;
31
45
  /** Custom task queue drawer / task center trigger in the header */
32
- TaskQueueDrawer?: Component<any>;
46
+ TaskQueueDrawer?: typeof TaskQueueDrawer;
33
47
  }
34
48
  /** Set the component registry in context (called by AdminApp). */
35
49
  export declare function setComponentRegistry(registry: ComponentRegistry): void;
36
50
  /** Retrieve the full component registry from context. */
37
- export declare function getComponentRegistry(): ComponentRegistry;
51
+ export declare function getComponentRegistry(): ComponentRegistry | undefined;
38
52
  /** Retrieve a single component by name from the registry. */
39
53
  export declare function useComponent<K extends keyof ComponentRegistry>(name: K): ComponentRegistry[K];
@@ -1,11 +1,10 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  /**
3
2
  * Component Registry — Svelte Context-based DI for component injection.
4
3
  *
5
4
  * Allows users to override any registered component via the `components`
6
5
  * prop on `AdminApp`, while providing sensible defaults.
7
6
  */
8
- import { getContext, setContext } from 'svelte';
7
+ import { getContext, hasContext, setContext } from 'svelte';
9
8
  const REGISTRY_KEY = 'svadmin:components';
10
9
  /** Set the component registry in context (called by AdminApp). */
11
10
  export function setComponentRegistry(registry) {
@@ -13,9 +12,12 @@ export function setComponentRegistry(registry) {
13
12
  }
14
13
  /** Retrieve the full component registry from context. */
15
14
  export function getComponentRegistry() {
16
- return getContext(REGISTRY_KEY);
15
+ return hasContext(REGISTRY_KEY) ? getContext(REGISTRY_KEY) : undefined;
17
16
  }
18
17
  /** Retrieve a single component by name from the registry. */
19
18
  export function useComponent(name) {
20
- return getComponentRegistry()[name];
19
+ const registry = getComponentRegistry();
20
+ if (!registry)
21
+ throw new Error('Component registry requires an AdminApp context');
22
+ return registry[name];
21
23
  }