@svadmin/ui 0.85.0 → 0.88.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 (89) hide show
  1. package/README.md +31 -0
  2. package/dist/app-shell.css +216 -0
  3. package/dist/app.css +659 -165
  4. package/dist/app.theme.css +659 -165
  5. package/dist/component-registry.d.ts +7292 -529
  6. package/dist/component-registry.js +32 -3
  7. package/dist/components/AppShellPage.svelte +172 -0
  8. package/dist/components/AppShellPage.svelte.d.ts +30 -0
  9. package/dist/components/ApprovalActionCard.svelte +54 -31
  10. package/dist/components/ApprovalCenter.svelte +73 -31
  11. package/dist/components/AuthPageShell.svelte +13 -2
  12. package/dist/components/AutoForm.svelte +7 -12
  13. package/dist/components/AutoForm.svelte.d.ts +0 -1
  14. package/dist/components/AutoTable.svelte +15 -3
  15. package/dist/components/AutoTable.svelte.d.ts +2 -0
  16. package/dist/components/ConfigurationPage.svelte +0 -3
  17. package/dist/components/ConfigurationPage.svelte.d.ts +0 -1
  18. package/dist/components/CreatePage.svelte +22 -19
  19. package/dist/components/CreatePage.svelte.d.ts +4 -1
  20. package/dist/components/EditPage.svelte +23 -20
  21. package/dist/components/EditPage.svelte.d.ts +4 -1
  22. package/dist/components/FieldRenderer.svelte +2 -10
  23. package/dist/components/FieldRenderer.svelte.d.ts +0 -1
  24. package/dist/components/ListPage.svelte +21 -18
  25. package/dist/components/ListPage.svelte.d.ts +2 -1
  26. package/dist/components/LoginPage.svelte +27 -11
  27. package/dist/components/LoginPage.svelte.d.ts +4 -0
  28. package/dist/components/NotificationsSettings.svelte +16 -8
  29. package/dist/components/PageHeader.svelte +1 -3
  30. package/dist/components/PageHeader.svelte.d.ts +0 -1
  31. package/dist/components/PagePattern.svelte +36 -13
  32. package/dist/components/PagePattern.svelte.d.ts +7 -0
  33. package/dist/components/PasswordInput.svelte +36 -17
  34. package/dist/components/PasswordInput.svelte.d.ts +3 -0
  35. package/dist/components/QuickEditDrawer.svelte +0 -1
  36. package/dist/components/ShowPage.svelte +24 -29
  37. package/dist/components/ShowPage.svelte.d.ts +0 -1
  38. package/dist/components/SvarAutoTable.svelte +2 -1
  39. package/dist/components/SvarDataGrid.svelte +8 -4
  40. package/dist/components/SvarDataGrid.svelte.d.ts +3 -0
  41. package/dist/components/SvarResourceTable.svelte +0 -1
  42. package/dist/components/SvarResourceTable.svelte.d.ts +0 -1
  43. package/dist/components/SvarResourceTableView.svelte +2 -2
  44. package/dist/components/account/MemberDirectory.svelte +17 -4
  45. package/dist/components/account/SecurityLogPage.svelte +8 -1
  46. package/dist/components/auto-table-grid.d.ts +1 -0
  47. package/dist/components/content/AuditTimeline.svelte +32 -4
  48. package/dist/components/content/AuditTimeline.svelte.d.ts +9 -0
  49. package/dist/components/content/ContentPageHeader.svelte +2 -1
  50. package/dist/components/content/ContentPageHeader.svelte.d.ts +1 -0
  51. package/dist/components/content/ContentPageShell.svelte +1 -1
  52. package/dist/components/content/ContentPageShell.svelte.d.ts +1 -0
  53. package/dist/components/content/DataPanel.svelte +58 -0
  54. package/dist/components/content/DataPanel.svelte.d.ts +16 -0
  55. package/dist/components/content/DataState.svelte +5 -4
  56. package/dist/components/content/DataState.svelte.d.ts +1 -1
  57. package/dist/components/content/DescriptionList.svelte +5 -8
  58. package/dist/components/content/DescriptionList.svelte.d.ts +0 -1
  59. package/dist/components/content/FilterToolbar.svelte +9 -6
  60. package/dist/components/content/FilterToolbar.svelte.d.ts +0 -1
  61. package/dist/components/content/NetworkTable.svelte +3 -3
  62. package/dist/components/content/NetworkTable.svelte.d.ts +0 -1
  63. package/dist/components/content/PageSection.svelte +1 -1
  64. package/dist/components/content/StatusTabs.svelte +2 -7
  65. package/dist/components/content/StatusTabs.svelte.d.ts +0 -1
  66. package/dist/components/content/WorkspaceLayout.svelte +3 -1
  67. package/dist/components/content/WorkspaceLayout.svelte.d.ts +1 -0
  68. package/dist/components/content/index.d.ts +1 -0
  69. package/dist/components/content/index.js +1 -0
  70. package/dist/components/network/TeamCrewTablePage.svelte +8 -1
  71. package/dist/components/network/UserCardsNFTPage.svelte +3 -1
  72. package/dist/components/profile/ProjectsGrid.svelte +1 -1
  73. package/dist/components/profile/TeamsShowcase.svelte +1 -1
  74. package/dist/components/ui/table/index.d.ts +0 -1
  75. package/dist/components/ui/table/table.svelte +1 -0
  76. package/dist/components/ui/table/table.svelte.d.ts +1 -0
  77. package/dist/components.css +1 -11
  78. package/dist/data-panel.css +88 -0
  79. package/dist/design-contract.d.ts +11 -0
  80. package/dist/design-contract.js +8 -0
  81. package/dist/design-system.d.ts +3 -2
  82. package/dist/design-system.js +3 -2
  83. package/dist/index.d.ts +4 -2
  84. package/dist/index.js +2 -0
  85. package/dist/page-chrome.css +42 -64
  86. package/dist/recipes.d.ts +12 -66
  87. package/dist/recipes.js +52 -50
  88. package/dist/styles/recipes.css +15 -48
  89. package/package.json +4 -4
@@ -5522,24 +5522,16 @@
5522
5522
  --container-xs: 20rem;
5523
5523
  --container-sm: 24rem;
5524
5524
  --container-xl: 36rem;
5525
- --container-2xl: 42rem;
5526
5525
  --container-3xl: 48rem;
5527
5526
  --text-xs: 0.75rem;
5528
5527
  --text-xs--line-height: calc(1 / 0.75);
5529
5528
  --text-sm: 0.875rem;
5530
5529
  --text-sm--line-height: calc(1.25 / 0.875);
5531
- --text-base: 1rem;
5532
- --text-base--line-height: calc(1.5 / 1);
5533
- --text-lg: 1.125rem;
5534
- --text-lg--line-height: calc(1.75 / 1.125);
5535
- --text-xl: 1.25rem;
5536
- --text-xl--line-height: calc(1.75 / 1.25);
5537
5530
  --text-2xl: 1.5rem;
5538
5531
  --text-2xl--line-height: calc(2 / 1.5);
5539
5532
  --font-weight-medium: 500;
5540
5533
  --font-weight-semibold: 600;
5541
- --leading-tight: 1.25;
5542
- --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
5534
+ --radius-md: calc(var(--radius) - 2px);
5543
5535
  --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);
5544
5536
  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
5545
5537
  --default-transition-duration: 150ms;
@@ -5605,6 +5597,9 @@
5605
5597
  .mt-3 {
5606
5598
  margin-top: calc(var(--spacing) * 3);
5607
5599
  }
5600
+ .mt-\[var\(--svadmin-space-1\)\] {
5601
+ margin-top: var(--svadmin-space-1);
5602
+ }
5608
5603
  .block {
5609
5604
  display: block;
5610
5605
  }
@@ -5653,9 +5648,6 @@
5653
5648
  .w-full {
5654
5649
  width: 100%;
5655
5650
  }
5656
- .max-w-2xl {
5657
- max-width: var(--container-2xl);
5658
- }
5659
5651
  .max-w-3xl {
5660
5652
  max-width: var(--container-3xl);
5661
5653
  }
@@ -5665,9 +5657,6 @@
5665
5657
  .max-w-\[64rem\] {
5666
5658
  max-width: 64rem;
5667
5659
  }
5668
- .max-w-\[65ch\] {
5669
- max-width: 65ch;
5670
- }
5671
5660
  .max-w-\[74rem\] {
5672
5661
  max-width: 74rem;
5673
5662
  }
@@ -5677,6 +5666,9 @@
5677
5666
  .max-w-\[92rem\] {
5678
5667
  max-width: 92rem;
5679
5668
  }
5669
+ .max-w-\[var\(--svadmin-measure\)\] {
5670
+ max-width: var(--svadmin-measure);
5671
+ }
5680
5672
  .max-w-full {
5681
5673
  max-width: 100%;
5682
5674
  }
@@ -5695,8 +5687,8 @@
5695
5687
  .flex-1 {
5696
5688
  flex: 1;
5697
5689
  }
5698
- .flex-\[1_1_16rem\] {
5699
- flex: 1 1 16rem;
5690
+ .flex-\[1_1_var\(--svadmin-chrome-basis\)\] {
5691
+ flex: 1 1 var(--svadmin-chrome-basis);
5700
5692
  }
5701
5693
  .flex-shrink {
5702
5694
  flex-shrink: 1;
@@ -5770,15 +5762,17 @@
5770
5762
  .gap-8 {
5771
5763
  gap: calc(var(--spacing) * 8);
5772
5764
  }
5773
- :where(.space-y-0\.5 > :not(:last-child)) {
5774
- --tw-space-y-reverse: 0;
5775
- margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));
5776
- margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));
5765
+ .gap-\[var\(--svadmin-space-1\)\] {
5766
+ gap: var(--svadmin-space-1);
5777
5767
  }
5778
- :where(.space-y-1 > :not(:last-child)) {
5779
- --tw-space-y-reverse: 0;
5780
- margin-block-start: calc(var(--spacing) * var(--tw-space-y-reverse));
5781
- margin-block-end: calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)));
5768
+ .gap-\[var\(--svadmin-space-2\)\] {
5769
+ gap: var(--svadmin-space-2);
5770
+ }
5771
+ .gap-\[var\(--svadmin-space-3\)\] {
5772
+ gap: var(--svadmin-space-3);
5773
+ }
5774
+ .gap-\[var\(--svadmin-space-5\)\] {
5775
+ gap: var(--svadmin-space-5);
5782
5776
  }
5783
5777
  :where(.space-y-2 > :not(:last-child)) {
5784
5778
  --tw-space-y-reverse: 0;
@@ -5805,6 +5799,31 @@
5805
5799
  margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));
5806
5800
  margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
5807
5801
  }
5802
+ :where(.space-y-\[var\(--svadmin-space-1\)\] > :not(:last-child)) {
5803
+ --tw-space-y-reverse: 0;
5804
+ margin-block-start: calc(var(--svadmin-space-1) * var(--tw-space-y-reverse));
5805
+ margin-block-end: calc(var(--svadmin-space-1) * calc(1 - var(--tw-space-y-reverse)));
5806
+ }
5807
+ :where(.space-y-\[var\(--svadmin-space-2\)\] > :not(:last-child)) {
5808
+ --tw-space-y-reverse: 0;
5809
+ margin-block-start: calc(var(--svadmin-space-2) * var(--tw-space-y-reverse));
5810
+ margin-block-end: calc(var(--svadmin-space-2) * calc(1 - var(--tw-space-y-reverse)));
5811
+ }
5812
+ :where(.space-y-\[var\(--svadmin-space-3\)\] > :not(:last-child)) {
5813
+ --tw-space-y-reverse: 0;
5814
+ margin-block-start: calc(var(--svadmin-space-3) * var(--tw-space-y-reverse));
5815
+ margin-block-end: calc(var(--svadmin-space-3) * calc(1 - var(--tw-space-y-reverse)));
5816
+ }
5817
+ :where(.space-y-\[var\(--svadmin-space-4\)\] > :not(:last-child)) {
5818
+ --tw-space-y-reverse: 0;
5819
+ margin-block-start: calc(var(--svadmin-space-4) * var(--tw-space-y-reverse));
5820
+ margin-block-end: calc(var(--svadmin-space-4) * calc(1 - var(--tw-space-y-reverse)));
5821
+ }
5822
+ :where(.space-y-\[var\(--svadmin-space-5\)\] > :not(:last-child)) {
5823
+ --tw-space-y-reverse: 0;
5824
+ margin-block-start: calc(var(--svadmin-space-5) * var(--tw-space-y-reverse));
5825
+ margin-block-end: calc(var(--svadmin-space-5) * calc(1 - var(--tw-space-y-reverse)));
5826
+ }
5808
5827
  .overflow-hidden {
5809
5828
  overflow: hidden;
5810
5829
  }
@@ -5910,6 +5929,12 @@
5910
5929
  .px-4 {
5911
5930
  padding-inline: calc(var(--spacing) * 4);
5912
5931
  }
5932
+ .px-\[var\(--svadmin-space-3\)\] {
5933
+ padding-inline: var(--svadmin-space-3);
5934
+ }
5935
+ .px-\[var\(--svadmin-space-4\)\] {
5936
+ padding-inline: var(--svadmin-space-4);
5937
+ }
5913
5938
  .py-1 {
5914
5939
  padding-block: var(--spacing);
5915
5940
  }
@@ -5919,9 +5944,6 @@
5919
5944
  .py-3 {
5920
5945
  padding-block: calc(var(--spacing) * 3);
5921
5946
  }
5922
- .py-4 {
5923
- padding-block: calc(var(--spacing) * 4);
5924
- }
5925
5947
  .py-5 {
5926
5948
  padding-block: calc(var(--spacing) * 5);
5927
5949
  }
@@ -5931,6 +5953,15 @@
5931
5953
  .py-\[7px\] {
5932
5954
  padding-block: 7px;
5933
5955
  }
5956
+ .py-\[var\(--svadmin-space-1\)\] {
5957
+ padding-block: var(--svadmin-space-1);
5958
+ }
5959
+ .py-\[var\(--svadmin-space-3\)\] {
5960
+ padding-block: var(--svadmin-space-3);
5961
+ }
5962
+ .py-\[var\(--svadmin-space-4\)\] {
5963
+ padding-block: var(--svadmin-space-4);
5964
+ }
5934
5965
  .text-left {
5935
5966
  text-align: left;
5936
5967
  }
@@ -5938,22 +5969,10 @@
5938
5969
  font-size: var(--text-2xl);
5939
5970
  line-height: var(--tw-leading, var(--text-2xl--line-height));
5940
5971
  }
5941
- .text-base {
5942
- font-size: var(--text-base);
5943
- line-height: var(--tw-leading, var(--text-base--line-height));
5944
- }
5945
- .text-lg {
5946
- font-size: var(--text-lg);
5947
- line-height: var(--tw-leading, var(--text-lg--line-height));
5948
- }
5949
5972
  .text-sm {
5950
5973
  font-size: var(--text-sm);
5951
5974
  line-height: var(--tw-leading, var(--text-sm--line-height));
5952
5975
  }
5953
- .text-xl {
5954
- font-size: var(--text-xl);
5955
- line-height: var(--tw-leading, var(--text-xl--line-height));
5956
- }
5957
5976
  .text-xs {
5958
5977
  font-size: var(--text-xs);
5959
5978
  line-height: var(--tw-leading, var(--text-xs--line-height));
@@ -5961,17 +5980,32 @@
5961
5980
  .text-\[0\.8125rem\] {
5962
5981
  font-size: 0.8125rem;
5963
5982
  }
5964
- .leading-5 {
5965
- --tw-leading: calc(var(--spacing) * 5);
5966
- line-height: calc(var(--spacing) * 5);
5983
+ .text-\[length\:var\(--svadmin-text-body\)\] {
5984
+ font-size: var(--svadmin-text-body);
5985
+ }
5986
+ .text-\[length\:var\(--svadmin-text-caption\)\] {
5987
+ font-size: var(--svadmin-text-caption);
5988
+ }
5989
+ .text-\[length\:var\(--svadmin-text-label\)\] {
5990
+ font-size: var(--svadmin-text-label);
5991
+ }
5992
+ .text-\[length\:var\(--svadmin-text-section\)\] {
5993
+ font-size: var(--svadmin-text-section);
5994
+ }
5995
+ .text-\[length\:var\(--svadmin-text-title\)\] {
5996
+ font-size: var(--svadmin-text-title);
5967
5997
  }
5968
5998
  .leading-6 {
5969
5999
  --tw-leading: calc(var(--spacing) * 6);
5970
6000
  line-height: calc(var(--spacing) * 6);
5971
6001
  }
5972
- .leading-tight {
5973
- --tw-leading: var(--leading-tight);
5974
- line-height: var(--leading-tight);
6002
+ .leading-\[var\(--svadmin-leading-body\)\] {
6003
+ --tw-leading: var(--svadmin-leading-body);
6004
+ line-height: var(--svadmin-leading-body);
6005
+ }
6006
+ .leading-\[var\(--svadmin-leading-tight\)\] {
6007
+ --tw-leading: var(--svadmin-leading-tight);
6008
+ line-height: var(--svadmin-leading-tight);
5975
6009
  }
5976
6010
  .font-medium {
5977
6011
  --tw-font-weight: var(--font-weight-medium);
@@ -6101,12 +6135,12 @@
6101
6135
  .\[--svadmin-metric-state-height\:6rem\] {
6102
6136
  --svadmin-metric-state-height: 6rem;
6103
6137
  }
6104
- .\[--svadmin-metric-state-padding\:0\.75rem\] {
6105
- --svadmin-metric-state-padding: 0.75rem;
6106
- }
6107
6138
  .\[--svadmin-metric-state-padding\:1\.25rem\] {
6108
6139
  --svadmin-metric-state-padding: 1.25rem;
6109
6140
  }
6141
+ .\[--svadmin-metric-state-padding\:var\(--svadmin-space-3\)\] {
6142
+ --svadmin-metric-state-padding: var(--svadmin-space-3);
6143
+ }
6110
6144
  .\[--svadmin-status-color\:var\(--destructive\)\] {
6111
6145
  --svadmin-status-color: var(--destructive);
6112
6146
  }
@@ -6122,11 +6156,11 @@
6122
6156
  .\[--svadmin-status-color\:var\(--warning\)\] {
6123
6157
  --svadmin-status-color: var(--warning);
6124
6158
  }
6125
- .\[--svadmin-table-state-height\:6rem\] {
6126
- --svadmin-table-state-height: 6rem;
6159
+ .\[--svadmin-table-state-height\:var\(--svadmin-table-state-min-h\)\] {
6160
+ --svadmin-table-state-height: var(--svadmin-table-state-min-h);
6127
6161
  }
6128
- .\[--svadmin-table-state-height\:8rem\] {
6129
- --svadmin-table-state-height: 8rem;
6162
+ .\[--svadmin-table-state-height\:var\(--svadmin-table-state-min-h-compact\)\] {
6163
+ --svadmin-table-state-height: var(--svadmin-table-state-min-h-compact);
6130
6164
  }
6131
6165
  .\[writing-mode\:vertical-rl\] {
6132
6166
  writing-mode: vertical-rl;
@@ -6207,33 +6241,29 @@
6207
6241
  .\[\&_\[data-command-group-heading\]\]\:uppercase [data-command-group-heading] {
6208
6242
  text-transform: uppercase;
6209
6243
  }
6210
- .\[\&\[data-slot\=table-cell\]\]\:py-1[data-slot=table-cell] {
6211
- padding-block: var(--spacing);
6244
+ .\[\&\[data-slot\=table-cell\]\]\:py-\[var\(--svadmin-space-1\)\][data-slot=table-cell] {
6245
+ padding-block: var(--svadmin-space-1);
6212
6246
  }
6213
- .\[\&\[data-slot\=table-cell\]\]\:py-2[data-slot=table-cell] {
6214
- padding-block: calc(var(--spacing) * 2);
6247
+ .\[\&\[data-slot\=table-cell\]\]\:py-\[var\(--svadmin-space-2\)\][data-slot=table-cell] {
6248
+ padding-block: var(--svadmin-space-2);
6215
6249
  }
6216
- .\[\&\[data-slot\=table-cell\]\]\:text-sm[data-slot=table-cell] {
6217
- font-size: var(--text-sm);
6218
- line-height: var(--tw-leading, var(--text-sm--line-height));
6250
+ .\[\&\[data-slot\=table-cell\]\]\:text-\[length\:var\(--svadmin-text-body\)\][data-slot=table-cell] {
6251
+ font-size: var(--svadmin-text-body);
6219
6252
  }
6220
- .\[\&\[data-slot\=table-cell\]\]\:text-xs[data-slot=table-cell] {
6221
- font-size: var(--text-xs);
6222
- line-height: var(--tw-leading, var(--text-xs--line-height));
6253
+ .\[\&\[data-slot\=table-cell\]\]\:text-\[length\:var\(--svadmin-text-caption\)\][data-slot=table-cell] {
6254
+ font-size: var(--svadmin-text-caption);
6223
6255
  }
6224
- .\[\&\[data-slot\=table-head\]\]\:py-1[data-slot=table-head] {
6225
- padding-block: var(--spacing);
6256
+ .\[\&\[data-slot\=table-head\]\]\:py-\[var\(--svadmin-space-1\)\][data-slot=table-head] {
6257
+ padding-block: var(--svadmin-space-1);
6226
6258
  }
6227
- .\[\&\[data-slot\=table-head\]\]\:py-2[data-slot=table-head] {
6228
- padding-block: calc(var(--spacing) * 2);
6259
+ .\[\&\[data-slot\=table-head\]\]\:py-\[var\(--svadmin-space-2\)\][data-slot=table-head] {
6260
+ padding-block: var(--svadmin-space-2);
6229
6261
  }
6230
- .\[\&\[data-slot\=table-head\]\]\:text-sm[data-slot=table-head] {
6231
- font-size: var(--text-sm);
6232
- line-height: var(--tw-leading, var(--text-sm--line-height));
6262
+ .\[\&\[data-slot\=table-head\]\]\:text-\[length\:var\(--svadmin-text-body\)\][data-slot=table-head] {
6263
+ font-size: var(--svadmin-text-body);
6233
6264
  }
6234
- .\[\&\[data-slot\=table-head\]\]\:text-xs[data-slot=table-head] {
6235
- font-size: var(--text-xs);
6236
- line-height: var(--tw-leading, var(--text-xs--line-height));
6265
+ .\[\&\[data-slot\=table-head\]\]\:text-\[length\:var\(--svadmin-text-caption\)\][data-slot=table-head] {
6266
+ font-size: var(--svadmin-text-caption);
6237
6267
  }
6238
6268
  }
6239
6269
  @property --tw-rotate-x {
@@ -6478,7 +6508,7 @@
6478
6508
  * the host application's utility CSS implementation.
6479
6509
  */
6480
6510
  [data-svadmin-skip-link] {
6481
- transform: translateY(calc(-100% - 1rem));
6511
+ transform: translateY(calc(-100% - var(--svadmin-space-4)));
6482
6512
  }
6483
6513
  [data-svadmin-skip-link]:focus,
6484
6514
  [data-svadmin-skip-link]:focus-visible {
@@ -6486,24 +6516,17 @@
6486
6516
  }
6487
6517
 
6488
6518
  .svadmin-page-header {
6489
- --svadmin-page-header-gap: 0.5rem;
6519
+ --svadmin-page-header-gap: var(--svadmin-space-2);
6490
6520
  min-width: 0;
6491
6521
  }
6492
- .svadmin-page-header[data-density="compact"] {
6493
- --svadmin-page-header-gap: 0.375rem;
6494
- }
6495
6522
  .svadmin-page-header__breadcrumbs {
6496
- margin-bottom: 1rem;
6497
- }
6498
- .svadmin-page-header[data-density="compact"] .svadmin-page-header__breadcrumbs {
6499
- margin-bottom: 0.375rem;
6500
- font-size: 0.75rem;
6523
+ margin-bottom: var(--svadmin-space-4);
6501
6524
  }
6502
6525
  .svadmin-page-header__row, .svadmin-filter-toolbar__row {
6503
6526
  display: flex;
6504
6527
  flex-direction: column;
6505
6528
  min-width: 0;
6506
- gap: 0.5rem;
6529
+ gap: var(--svadmin-space-2);
6507
6530
  }
6508
6531
  .svadmin-page-header__row {
6509
6532
  gap: var(--svadmin-page-header-gap);
@@ -6512,7 +6535,7 @@
6512
6535
  display: flex;
6513
6536
  align-items: center;
6514
6537
  min-width: 0;
6515
- gap: 0.625rem;
6538
+ gap: var(--svadmin-space-3);
6516
6539
  }
6517
6540
  .svadmin-page-header__text {
6518
6541
  min-width: 0;
@@ -6522,7 +6545,7 @@
6522
6545
  flex-wrap: wrap;
6523
6546
  align-items: center;
6524
6547
  min-width: 0;
6525
- gap: 0.5rem;
6548
+ gap: var(--svadmin-space-2);
6526
6549
  }
6527
6550
  .svadmin-page-header__tags, .svadmin-page-header__actions {
6528
6551
  max-width: 100%;
@@ -6531,24 +6554,17 @@
6531
6554
  .svadmin-page-header__title {
6532
6555
  min-width: 0;
6533
6556
  color: var(--foreground);
6534
- font-size: 1.25rem;
6557
+ font-size: var(--svadmin-text-title);
6535
6558
  font-weight: 600;
6536
- line-height: 1.75rem;
6559
+ line-height: var(--svadmin-leading-tight);
6537
6560
  overflow-wrap: anywhere;
6538
6561
  }
6539
6562
  .svadmin-page-header__description {
6540
6563
  color: var(--muted-foreground);
6541
- font-size: 0.875rem;
6542
- line-height: 1.25rem;
6564
+ font-size: var(--svadmin-text-body);
6565
+ line-height: var(--svadmin-leading-body);
6543
6566
  overflow-wrap: anywhere;
6544
6567
  }
6545
- .svadmin-page-header[data-density="compact"] .svadmin-page-header__title {
6546
- font-size: 1.125rem;
6547
- }
6548
- .svadmin-page-header[data-density="compact"] .svadmin-page-header__description {
6549
- font-size: 0.75rem;
6550
- line-height: 1rem;
6551
- }
6552
6568
  .svadmin-page-header .svadmin-page-header__back {
6553
6569
  flex-shrink: 0;
6554
6570
  color: var(--muted-foreground);
@@ -6557,14 +6573,14 @@
6557
6573
  color: var(--foreground);
6558
6574
  }
6559
6575
  .svadmin-page-header .svadmin-page-header__back-icon {
6560
- width: 1rem;
6561
- height: 1rem;
6576
+ width: var(--svadmin-space-4);
6577
+ height: var(--svadmin-space-4);
6562
6578
  }
6563
6579
  .svadmin-breadcrumbs {
6564
6580
  min-width: 0;
6565
6581
  }
6566
6582
  .svadmin-breadcrumbs--spaced {
6567
- margin-bottom: 1rem;
6583
+ margin-bottom: var(--svadmin-space-4);
6568
6584
  }
6569
6585
  .svadmin-breadcrumbs__item {
6570
6586
  display: inline-flex;
@@ -6575,16 +6591,11 @@
6575
6591
  color: var(--muted-foreground);
6576
6592
  }
6577
6593
  .svadmin-filter-toolbar {
6578
- --svadmin-filter-control-height: 2.25rem;
6579
- --svadmin-filter-control-font: 0.875rem;
6580
- --svadmin-filter-search-icon-size: 1rem;
6594
+ --svadmin-filter-control-height: var(--svadmin-control-h);
6595
+ --svadmin-filter-control-font: var(--svadmin-text-body);
6596
+ --svadmin-filter-search-icon-size: var(--svadmin-space-4);
6581
6597
  min-width: 0;
6582
6598
  }
6583
- .svadmin-filter-toolbar[data-density="compact"] {
6584
- --svadmin-filter-control-height: 2rem;
6585
- --svadmin-filter-control-font: 0.75rem;
6586
- --svadmin-filter-search-icon-size: 0.875rem;
6587
- }
6588
6599
  .svadmin-filter-toolbar__search {
6589
6600
  position: relative;
6590
6601
  min-width: 0;
@@ -6592,60 +6603,57 @@
6592
6603
  .svadmin-filter-toolbar__search-icon {
6593
6604
  position: absolute;
6594
6605
  top: 50%;
6595
- inset-inline-start: 0.75rem;
6606
+ inset-inline-start: var(--svadmin-space-3);
6596
6607
  width: var(--svadmin-filter-search-icon-size);
6597
6608
  height: var(--svadmin-filter-search-icon-size);
6598
6609
  color: var(--muted-foreground);
6599
6610
  transform: translateY(-50%);
6600
6611
  pointer-events: none;
6601
6612
  }
6602
- .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__input {
6613
+ .svadmin-filter-toolbar .svadmin-filter-toolbar__input[data-slot="input"] {
6603
6614
  height: var(--svadmin-filter-control-height);
6604
- padding-inline: 2.25rem;
6615
+ padding-inline: calc(var(--svadmin-space-5) + var(--svadmin-space-3));
6605
6616
  font-size: var(--svadmin-filter-control-font);
6606
- line-height: 1rem;
6617
+ line-height: var(--svadmin-leading-tight);
6607
6618
  }
6608
- .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__clear {
6619
+ .svadmin-filter-toolbar .svadmin-filter-toolbar__clear {
6609
6620
  position: absolute;
6610
- top: 50%;
6611
- inset-inline-end: 0.25rem;
6612
- transform: translateY(-50%);
6621
+ inset-block: 0;
6622
+ inset-inline-end: var(--svadmin-space-1);
6623
+ margin-block: auto;
6613
6624
  }
6614
- .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__toggle {
6625
+ .svadmin-filter-toolbar .svadmin-filter-toolbar__toggle {
6615
6626
  flex-shrink: 0;
6616
- gap: 0.375rem;
6627
+ gap: var(--svadmin-space-2);
6617
6628
  height: var(--svadmin-filter-control-height);
6618
6629
  font-size: var(--svadmin-filter-control-font);
6619
6630
  max-width: 100%;
6620
6631
  white-space: normal;
6621
6632
  overflow-wrap: anywhere;
6622
6633
  }
6623
- .svadmin-filter-toolbar[data-density="compact"] .svadmin-filter-toolbar__toggle {
6624
- padding-inline: 0.625rem;
6625
- }
6626
6634
  .svadmin-filter-toolbar .svadmin-filter-toolbar__control-icon {
6627
- width: 0.875rem;
6628
- height: 0.875rem;
6635
+ width: var(--svadmin-space-3);
6636
+ height: var(--svadmin-space-3);
6629
6637
  }
6630
6638
  .svadmin-filter-toolbar .svadmin-filter-toolbar__chevron {
6631
- width: 0.75rem;
6632
- height: 0.75rem;
6633
- margin-inline-start: 0.125rem;
6639
+ width: var(--svadmin-space-3);
6640
+ height: var(--svadmin-space-3);
6641
+ margin-inline-start: var(--svadmin-space-1);
6634
6642
  color: var(--muted-foreground);
6635
6643
  }
6636
- .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__count {
6637
- height: 1rem;
6638
- min-height: 1rem;
6639
- min-width: 1rem;
6640
- margin-inline-start: 0.125rem;
6641
- padding: 0 0.25rem;
6642
- font-size: 0.625rem;
6644
+ .svadmin-filter-toolbar .svadmin-filter-toolbar__count {
6645
+ height: var(--svadmin-space-4);
6646
+ min-height: var(--svadmin-space-4);
6647
+ min-width: var(--svadmin-space-4);
6648
+ margin-inline-start: var(--svadmin-space-1);
6649
+ padding: 0 var(--svadmin-space-1);
6650
+ font-size: var(--svadmin-text-caption);
6643
6651
  font-weight: 600;
6644
6652
  line-height: 1;
6645
6653
  font-variant-numeric: tabular-nums;
6646
6654
  }
6647
6655
  .svadmin-filter-toolbar .svadmin-filter-toolbar-advanced {
6648
- margin-top: 0.5rem;
6656
+ margin-top: var(--svadmin-space-2);
6649
6657
  border: 1px solid var(--border);
6650
6658
  @supports (color: color-mix(in lab, red, red)) {
6651
6659
  border: 1px solid color-mix(in oklch, var(--border) 60%, transparent);
@@ -6655,7 +6663,7 @@
6655
6663
  @supports (color: color-mix(in lab, red, red)) {
6656
6664
  background: color-mix(in oklch, var(--muted) 20%, transparent);
6657
6665
  }
6658
- padding: 0.75rem;
6666
+ padding: var(--svadmin-space-3);
6659
6667
  overflow-wrap: anywhere;
6660
6668
  }
6661
6669
  @media (min-width: 640px) {
@@ -6668,13 +6676,317 @@
6668
6676
  justify-content: space-between;
6669
6677
  }
6670
6678
  .svadmin-page-header__heading {
6671
- flex: 1 1 16rem;
6679
+ flex: 1 1 var(--svadmin-chrome-basis);
6672
6680
  }
6673
6681
  .svadmin-filter-toolbar__search {
6674
- flex: 1 1 14rem;
6682
+ flex: 1 1 var(--svadmin-chrome-basis);
6683
+ }
6684
+ }
6685
+ }
6686
+ /* Router-agnostic application shell.
6687
+ *
6688
+ * Every length, size and color here comes from a token. That is the contract
6689
+ * hosts rely on: a host with its own router composes the shell with snippets and
6690
+ * overrides tokens, instead of re-implementing sidebar, topbar and page
6691
+ * composition in bespoke CSS. See docs/components/app-shell.md. */
6692
+ @layer components {
6693
+ .svadmin-app-shell {
6694
+ display: grid;
6695
+ grid-template-rows: auto minmax(0, 1fr) auto;
6696
+ grid-template-columns: minmax(0, 1fr);
6697
+ min-height: 100dvh;
6698
+ background: var(--background);
6699
+ color: var(--foreground);
6700
+ font-size: var(--svadmin-text-body);
6701
+ line-height: var(--svadmin-leading-body);
6702
+ }
6703
+ .svadmin-app-shell[data-width="narrow"] {
6704
+ --svadmin-shell-max: 48rem;
6705
+ }
6706
+ .svadmin-app-shell[data-width="wide"] {
6707
+ --svadmin-shell-max: 92rem;
6708
+ }
6709
+ .svadmin-app-shell[data-width="full"] {
6710
+ --svadmin-shell-max: none;
6711
+ }
6712
+ .svadmin-app-shell[data-sidebar="true"] {
6713
+ grid-template-columns: var(--svadmin-shell-sidebar-w) minmax(0, 1fr);
6714
+ grid-template-areas:
6715
+ "topbar topbar"
6716
+ "sidebar main"
6717
+ "sidebar footer";
6718
+ }
6719
+ .svadmin-app-shell[data-collapsed="true"] {
6720
+ --svadmin-shell-sidebar-w: var(--svadmin-shell-sidebar-w-collapsed);
6721
+ }
6722
+ .svadmin-app-shell[data-aside="true"] .svadmin-app-shell__body {
6723
+ grid-template-columns: minmax(0, 1fr) minmax(0, var(--svadmin-shell-aside-w));
6724
+ }
6725
+
6726
+ .svadmin-app-shell__skip {
6727
+ position: fixed;
6728
+ z-index: 60;
6729
+ inset-block-start: var(--svadmin-space-2);
6730
+ inset-inline-start: var(--svadmin-space-2);
6731
+ border: 1px solid var(--border);
6732
+ border-radius: var(--radius-md);
6733
+ background: var(--card);
6734
+ padding: var(--svadmin-space-2) var(--svadmin-space-3);
6735
+ color: var(--foreground);
6736
+ font-size: var(--svadmin-text-caption);
6737
+ font-weight: 600;
6738
+ transform: translateY(calc(-1 * (var(--svadmin-space-6) + var(--svadmin-space-5))));
6739
+ }
6740
+ .svadmin-app-shell__skip:focus-visible {
6741
+ transform: none;
6742
+ outline: var(--svadmin-focus-width) solid var(--ring);
6743
+ outline-offset: var(--svadmin-focus-offset);
6744
+ }
6745
+
6746
+ .svadmin-app-shell__topbar {
6747
+ grid-area: topbar;
6748
+ display: flex;
6749
+ align-items: center;
6750
+ gap: var(--svadmin-space-3);
6751
+ min-width: 0;
6752
+ min-height: var(--svadmin-shell-topbar-h);
6753
+ border-bottom: 1px solid var(--border);
6754
+ background: var(--card);
6755
+ padding-inline: var(--svadmin-shell-gutter);
6756
+ }
6757
+ .svadmin-app-shell__topbar-start,
6758
+ .svadmin-app-shell__topbar-end {
6759
+ display: flex;
6760
+ align-items: center;
6761
+ min-width: 0;
6762
+ gap: var(--svadmin-space-2);
6763
+ }
6764
+ .svadmin-app-shell__topbar-main {
6765
+ display: flex;
6766
+ flex: 1 1 auto;
6767
+ align-items: center;
6768
+ min-width: 0;
6769
+ gap: var(--svadmin-space-3);
6770
+ }
6771
+ .svadmin-app-shell__topbar-end {
6772
+ flex: 0 0 auto;
6773
+ justify-content: flex-end;
6774
+ }
6775
+
6776
+ .svadmin-app-shell__sidebar {
6777
+ grid-area: sidebar;
6778
+ display: flex;
6779
+ flex-direction: column;
6780
+ min-width: 0;
6781
+ min-height: 0;
6782
+ border-inline-end: 1px solid var(--sidebar-border, var(--border));
6783
+ background: var(--sidebar, var(--card));
6784
+ color: var(--sidebar-foreground, var(--foreground));
6785
+ overflow-y: auto;
6786
+ overscroll-behavior: contain;
6787
+ }
6788
+ .svadmin-app-shell__sidebar-inner {
6789
+ display: flex;
6790
+ flex: 1 1 auto;
6791
+ flex-direction: column;
6792
+ gap: var(--svadmin-space-2);
6793
+ min-width: 0;
6794
+ padding: var(--svadmin-space-3) var(--svadmin-space-2);
6795
+ }
6796
+
6797
+ .svadmin-app-shell__main {
6798
+ grid-area: main;
6799
+ display: flex;
6800
+ flex-direction: column;
6801
+ min-width: 0;
6802
+ min-height: 0;
6803
+ }
6804
+ .svadmin-app-shell__body {
6805
+ display: grid;
6806
+ grid-template-columns: minmax(0, 1fr);
6807
+ align-items: start;
6808
+ gap: var(--svadmin-section-gap);
6809
+ width: 100%;
6810
+ max-width: var(--svadmin-shell-max);
6811
+ margin-inline: auto;
6812
+ padding: var(--svadmin-shell-gutter);
6813
+ min-width: 0;
6814
+ }
6815
+ .svadmin-app-shell__content {
6816
+ display: grid;
6817
+ gap: var(--svadmin-section-gap);
6818
+ min-width: 0;
6819
+ }
6820
+ .svadmin-app-shell__aside {
6821
+ display: grid;
6822
+ gap: var(--svadmin-section-gap);
6823
+ min-width: 0;
6824
+ }
6825
+
6826
+ .svadmin-app-shell__footer {
6827
+ grid-area: footer;
6828
+ display: flex;
6829
+ flex-wrap: wrap;
6830
+ align-items: center;
6831
+ justify-content: space-between;
6832
+ gap: var(--svadmin-space-2);
6833
+ width: 100%;
6834
+ max-width: var(--svadmin-shell-max);
6835
+ margin-inline: auto;
6836
+ border-top: 1px solid var(--border);
6837
+ padding: var(--svadmin-space-3) var(--svadmin-shell-gutter);
6838
+ color: var(--muted-foreground);
6839
+ font-size: var(--svadmin-text-caption);
6840
+ }
6841
+
6842
+ /* The mobile navigation trigger only exists below the sidebar breakpoint. */
6843
+ .svadmin-app-shell__mobile-toggle {
6844
+ display: none;
6845
+ }
6846
+ .svadmin-app-shell__scrim {
6847
+ display: none;
6848
+ }
6849
+
6850
+ @media (max-width: 63.999rem) {
6851
+ .svadmin-app-shell[data-sidebar="true"] {
6852
+ grid-template-columns: minmax(0, 1fr);
6853
+ grid-template-areas:
6854
+ "topbar"
6855
+ "main"
6856
+ "footer";
6857
+ }
6858
+ .svadmin-app-shell[data-aside="true"] .svadmin-app-shell__body {
6859
+ grid-template-columns: minmax(0, 1fr);
6860
+ }
6861
+ .svadmin-app-shell__mobile-toggle {
6862
+ display: inline-flex;
6863
+ }
6864
+ .svadmin-app-shell__sidebar {
6865
+ position: fixed;
6866
+ z-index: 45;
6867
+ inset-block: var(--svadmin-shell-topbar-h) 0;
6868
+ inset-inline-start: 0;
6869
+ width: var(--svadmin-shell-sidebar-w);
6870
+ max-width: 85vw;
6871
+ box-shadow: var(--shadow-overlay);
6872
+ transform: translateX(-100%);
6873
+ visibility: hidden;
6874
+ transition: transform var(--svadmin-motion-standard) var(--svadmin-motion-easing), visibility var(--svadmin-motion-standard);
6875
+ }
6876
+ [dir="rtl"] .svadmin-app-shell__sidebar {
6877
+ transform: translateX(100%);
6878
+ }
6879
+ .svadmin-app-shell[data-mobile-open="true"] .svadmin-app-shell__sidebar {
6880
+ transform: none;
6881
+ visibility: visible;
6882
+ }
6883
+ .svadmin-app-shell[data-mobile-open="true"] .svadmin-app-shell__scrim {
6884
+ display: block;
6885
+ position: fixed;
6886
+ z-index: 40;
6887
+ inset: var(--svadmin-shell-topbar-h) 0 0;
6888
+ border: 0;
6889
+ background: var(--foreground);
6890
+ opacity: 0.28;
6891
+ cursor: pointer;
6892
+ }
6893
+ }
6894
+
6895
+ /* 窄视口下页面容器自己承担横向留白,外壳不再重复叠加。 */
6896
+ @media (max-width: 40rem) {
6897
+ .svadmin-app-shell {
6898
+ --svadmin-shell-gutter: var(--svadmin-space-4);
6675
6899
  }
6676
6900
  }
6677
6901
  }
6902
+ /* Data panel: the recurring "titled surface with a body" container.
6903
+ *
6904
+ * Hosts previously hand-rolled this block per page, which is how a project ends
6905
+ * up with three panel paddings and two radii. Every length here is a token. */
6906
+ @layer components {
6907
+ .svadmin-data-panel {
6908
+ --svadmin-panel-padding: var(--svadmin-space-5);
6909
+ display: grid;
6910
+ grid-template-columns: minmax(0, 1fr);
6911
+ align-content: start;
6912
+ min-width: 0;
6913
+ border: 1px solid var(--border);
6914
+ border-radius: var(--radius-lg);
6915
+ background: var(--card);
6916
+ color: var(--card-foreground);
6917
+ overflow: hidden;
6918
+ }
6919
+ .svadmin-data-panel[data-padding="compact"] {
6920
+ --svadmin-panel-padding: var(--svadmin-space-4);
6921
+ }
6922
+ .svadmin-data-panel[data-padding="none"] {
6923
+ --svadmin-panel-padding: 0;
6924
+ }
6925
+
6926
+ .svadmin-data-panel__header {
6927
+ display: flex;
6928
+ flex-wrap: wrap;
6929
+ align-items: flex-start;
6930
+ justify-content: space-between;
6931
+ gap: var(--svadmin-space-3);
6932
+ min-width: 0;
6933
+ padding: var(--svadmin-panel-padding);
6934
+ padding-block-end: 0;
6935
+ }
6936
+ .svadmin-data-panel[data-padding="none"] .svadmin-data-panel__header {
6937
+ padding: var(--svadmin-space-4) var(--svadmin-space-5);
6938
+ border-bottom: 1px solid var(--border);
6939
+ }
6940
+ .svadmin-data-panel__heading {
6941
+ display: grid;
6942
+ gap: var(--svadmin-space-1);
6943
+ min-width: 0;
6944
+ flex: 1 1 0;
6945
+ }
6946
+ .svadmin-data-panel__title {
6947
+ margin: 0;
6948
+ color: var(--foreground);
6949
+ font-size: var(--svadmin-text-section);
6950
+ font-weight: 600;
6951
+ line-height: var(--svadmin-leading-tight);
6952
+ overflow-wrap: anywhere;
6953
+ }
6954
+ .svadmin-data-panel__description {
6955
+ max-width: var(--svadmin-measure);
6956
+ margin: 0;
6957
+ color: var(--muted-foreground);
6958
+ font-size: var(--svadmin-text-body);
6959
+ line-height: var(--svadmin-leading-body);
6960
+ overflow-wrap: anywhere;
6961
+ }
6962
+ .svadmin-data-panel__actions {
6963
+ display: flex;
6964
+ flex-wrap: wrap;
6965
+ align-items: center;
6966
+ gap: var(--svadmin-space-2);
6967
+ flex: 0 0 auto;
6968
+ }
6969
+ .svadmin-data-panel__body {
6970
+ display: grid;
6971
+ gap: var(--svadmin-space-4);
6972
+ min-width: 0;
6973
+ padding: var(--svadmin-panel-padding);
6974
+ }
6975
+ .svadmin-data-panel[data-padding="none"] .svadmin-data-panel__body {
6976
+ gap: 0;
6977
+ }
6978
+ .svadmin-data-panel__footer {
6979
+ display: flex;
6980
+ flex-wrap: wrap;
6981
+ align-items: center;
6982
+ justify-content: flex-end;
6983
+ gap: var(--svadmin-space-2);
6984
+ padding: var(--svadmin-space-3) var(--svadmin-space-5);
6985
+ border-top: 1px solid var(--border);
6986
+ color: var(--muted-foreground);
6987
+ font-size: var(--svadmin-text-caption);
6988
+ }
6989
+ }
6678
6990
 
6679
6991
  /* 保留状态对比度和 clean-flat 卡片表现,颜色始终来自宿主 token。 */
6680
6992
  .svadmin-product-status[data-slot="badge"] {
@@ -6753,6 +7065,42 @@
6753
7065
  --svadmin-shadow-control: 0 1px 2px rgb(15 23 42 / 0.04);
6754
7066
  --svadmin-shadow-surface: 0 1px 2px rgb(15 23 42 / 0.035);
6755
7067
  --svadmin-shadow-surface-hover: 0 2px 5px rgb(15 23 42 / 0.06);
7068
+
7069
+ /* Size rhythm. Single source of truth for control, row, spacing and type
7070
+ * sizes; components read these tokens and hosts override the token instead
7071
+ * of re-writing component CSS. Values stay on the 4px grid from DESIGN.md
7072
+ * (xs 4, sm 8, md 16, lg 24, xl 32). */
7073
+ --svadmin-control-h-sm: 1.75rem; /* 28px */
7074
+ --svadmin-control-h: 2.25rem; /* 36px */
7075
+ --svadmin-control-h-lg: 2.5rem; /* 40px */
7076
+ --svadmin-row-h: 3rem; /* 48px */
7077
+ --svadmin-table-head-h: 2.75rem; /* 44px */
7078
+ --svadmin-table-state-min-h: 8rem; /* 128px */
7079
+ --svadmin-table-state-min-h-compact: 6rem; /* 96px */
7080
+ --svadmin-space-1: 0.25rem; /* 4px */
7081
+ --svadmin-space-2: 0.5rem; /* 8px */
7082
+ --svadmin-space-3: 0.75rem; /* 12px */
7083
+ --svadmin-space-4: 1rem; /* 16px */
7084
+ --svadmin-space-5: 1.5rem; /* 24px */
7085
+ --svadmin-space-6: 2rem; /* 32px */
7086
+ --svadmin-section-gap: var(--svadmin-space-5);
7087
+ --svadmin-text-caption: 0.75rem; /* 12px */
7088
+ --svadmin-text-label: 0.8125rem; /* 13px */
7089
+ --svadmin-text-body: 0.875rem; /* 14px */
7090
+ --svadmin-text-section: 1rem; /* 16px */
7091
+ --svadmin-text-title: 1.25rem; /* 20px */
7092
+ --svadmin-leading-tight: 1.25;
7093
+ --svadmin-leading-snug: 1.35;
7094
+ --svadmin-leading-body: 1.5;
7095
+ --svadmin-focus-width: 2px;
7096
+ --svadmin-measure: 65ch;
7097
+ --svadmin-shell-sidebar-w: 15rem;
7098
+ --svadmin-shell-sidebar-w-collapsed: 3.5rem;
7099
+ --svadmin-shell-topbar-h: 3.5rem;
7100
+ --svadmin-shell-gutter: var(--svadmin-space-5);
7101
+ --svadmin-shell-max: 74rem;
7102
+ --svadmin-chrome-basis: 16rem;
7103
+ --svadmin-shell-aside-w: 22rem;
6756
7104
  --svadmin-shadow-overlay: 0 20px 52px rgb(15 23 42 / 0.18), 0 6px 16px rgb(15 23 42 / 0.1);
6757
7105
  }
6758
7106
 
@@ -7178,15 +7526,15 @@ h6,
7178
7526
  }
7179
7527
 
7180
7528
  :is([data-slot="button"], .svadmin-button):is([data-size="default"], .svadmin-button-size--default),
7181
- :is([data-svadmin-button], .svadmin-button):is([data-size="default"], .svadmin-button-size--default) { min-height: 2.25rem; padding: 0 0.75rem; }
7529
+ :is([data-svadmin-button], .svadmin-button):is([data-size="default"], .svadmin-button-size--default) { min-height: var(--svadmin-control-h); padding: 0 0.75rem; }
7182
7530
  :is([data-slot="button"], .svadmin-button):is([data-size="xs"], .svadmin-button-size--xs),
7183
7531
  :is([data-svadmin-button], .svadmin-button):is([data-size="xs"], .svadmin-button-size--xs) { min-height: 1.5rem; padding: 0 0.5rem; font-size: 0.75rem; }
7184
7532
  :is([data-slot="button"], .svadmin-button):is([data-size="sm"], .svadmin-button-size--sm),
7185
7533
  :is([data-svadmin-button], .svadmin-button):is([data-size="sm"], .svadmin-button-size--sm) { min-height: 2rem; padding: 0 0.75rem; font-size: 0.8rem; }
7186
7534
  :is([data-slot="button"], .svadmin-button):is([data-size="lg"], .svadmin-button-size--lg),
7187
- :is([data-svadmin-button], .svadmin-button):is([data-size="lg"], .svadmin-button-size--lg) { min-height: 2.5rem; padding: 0 1rem; }
7535
+ :is([data-svadmin-button], .svadmin-button):is([data-size="lg"], .svadmin-button-size--lg) { min-height: var(--svadmin-control-h-lg); padding: 0 1rem; }
7188
7536
  :is([data-slot="button"], .svadmin-button):is([data-size="icon"], .svadmin-button-size--icon),
7189
- :is([data-svadmin-button], .svadmin-button):is([data-size="icon"], .svadmin-button-size--icon) { width: 2.25rem; height: 2.25rem; }
7537
+ :is([data-svadmin-button], .svadmin-button):is([data-size="icon"], .svadmin-button-size--icon) { width: var(--svadmin-control-h); height: var(--svadmin-control-h); }
7190
7538
  :is([data-slot="button"], .svadmin-button):is([data-size="icon-xs"], .svadmin-button-size--icon-xs),
7191
7539
  :is([data-svadmin-button], .svadmin-button):is([data-size="icon-xs"], .svadmin-button-size--icon-xs) { width: 1.5rem; height: 1.5rem; }
7192
7540
  :is([data-slot="button"], .svadmin-button):is([data-size="icon-sm"], .svadmin-button-size--icon-sm),
@@ -7638,7 +7986,7 @@ main {
7638
7986
  .svadmin-input {
7639
7987
  width: 100%;
7640
7988
  min-width: 0;
7641
- height: 2.25rem;
7989
+ height: var(--svadmin-control-h);
7642
7990
  border: 1px solid var(--border);
7643
7991
  border-radius: 0.5rem;
7644
7992
  background: transparent;
@@ -7728,15 +8076,17 @@ main {
7728
8076
  }
7729
8077
 
7730
8078
  .svadmin-table-cell {
7731
- padding: 0.5rem;
8079
+ height: var(--svadmin-row-h);
8080
+ padding: var(--svadmin-space-2);
8081
+ font-size: var(--svadmin-text-label);
7732
8082
  vertical-align: middle;
7733
8083
  white-space: nowrap;
7734
8084
  }
7735
8085
 
7736
8086
  .svadmin-table-cell[data-density="compact"] {
7737
- height: 2rem;
7738
- padding: 0.25rem 0.5rem;
7739
- font-size: 0.75rem;
8087
+ height: calc(var(--svadmin-row-h) - var(--svadmin-space-4));
8088
+ padding: var(--svadmin-space-1) var(--svadmin-space-2);
8089
+ font-size: var(--svadmin-text-caption);
7740
8090
  }
7741
8091
 
7742
8092
  .svadmin-table-cell[data-sticky="right"],
@@ -8062,9 +8412,9 @@ main {
8062
8412
  }
8063
8413
 
8064
8414
  .svadmin-table-caption {
8065
- margin-top: 1rem;
8415
+ margin-top: var(--svadmin-space-4);
8066
8416
  color: var(--muted-foreground);
8067
- font-size: 0.875rem;
8417
+ font-size: var(--svadmin-text-body);
8068
8418
  }
8069
8419
 
8070
8420
  .svadmin-table-footer {
@@ -8221,7 +8571,7 @@ main {
8221
8571
 
8222
8572
  .svadmin-select {
8223
8573
  width: 100%;
8224
- height: 2.25rem;
8574
+ height: var(--svadmin-control-h);
8225
8575
  border: 1px solid var(--border);
8226
8576
  border-radius: 0.5rem;
8227
8577
  padding: 0.375rem 0.75rem;
@@ -8258,7 +8608,7 @@ main {
8258
8608
  .svadmin-tabs-list {
8259
8609
  display: inline-flex;
8260
8610
  width: fit-content;
8261
- height: 2.25rem;
8611
+ height: var(--svadmin-control-h);
8262
8612
  align-items: center;
8263
8613
  justify-content: center;
8264
8614
  gap: 0.25rem;
@@ -8605,7 +8955,7 @@ main {
8605
8955
  .svadmin-navigation-trigger {
8606
8956
  display: inline-flex;
8607
8957
  width: max-content;
8608
- height: 2.25rem;
8958
+ height: var(--svadmin-control-h);
8609
8959
  align-items: center;
8610
8960
  justify-content: center;
8611
8961
  gap: 0.25rem;
@@ -9005,19 +9355,20 @@ main {
9005
9355
  }
9006
9356
 
9007
9357
  .svadmin-table-head {
9008
- height: 2.25rem;
9009
- padding: 0.5rem;
9358
+ height: var(--svadmin-table-head-h);
9359
+ padding: var(--svadmin-space-2);
9010
9360
  color: var(--foreground);
9011
9361
  text-align: left;
9012
9362
  vertical-align: middle;
9363
+ font-size: var(--svadmin-text-caption);
9013
9364
  font-weight: 500;
9014
9365
  white-space: nowrap;
9015
9366
  }
9016
9367
 
9017
9368
  .svadmin-table-head[data-density="compact"] {
9018
- height: 2rem;
9019
- padding: 0.25rem 0.5rem;
9020
- font-size: 0.75rem;
9369
+ height: calc(var(--svadmin-table-head-h) - var(--svadmin-space-3));
9370
+ padding: var(--svadmin-space-1) var(--svadmin-space-2);
9371
+ font-size: var(--svadmin-text-caption);
9021
9372
  }
9022
9373
 
9023
9374
  .svadmin-table-head[data-sticky="right"],
@@ -9067,8 +9418,8 @@ main {
9067
9418
  }
9068
9419
 
9069
9420
  .svadmin-pagination-icon {
9070
- width: 1rem;
9071
- height: 1rem;
9421
+ width: var(--svadmin-space-4);
9422
+ height: var(--svadmin-space-4);
9072
9423
  }
9073
9424
 
9074
9425
  @keyframes svadmin-menu-enter {
@@ -9370,11 +9721,11 @@ details[data-svadmin-filter][open] > :not(summary),
9370
9721
  }
9371
9722
 
9372
9723
  .layout-clean-flat [data-svadmin-table-head] [data-slot="table-head"] {
9373
- height: 2.75rem;
9724
+ height: var(--svadmin-table-head-h);
9374
9725
  border-bottom-color: var(--svadmin-border);
9375
9726
  background: var(--svadmin-surface-muted);
9376
9727
  color: var(--svadmin-text-muted);
9377
- font-size: 0.75rem;
9728
+ font-size: var(--svadmin-text-caption);
9378
9729
  font-weight: 600;
9379
9730
  letter-spacing: 0;
9380
9731
  text-transform: none;
@@ -9385,10 +9736,10 @@ details[data-svadmin-filter][open] > :not(summary),
9385
9736
  }
9386
9737
 
9387
9738
  .layout-clean-flat [data-svadmin-table-row] [data-slot="table-cell"] {
9388
- height: 3rem;
9739
+ height: var(--svadmin-row-h);
9389
9740
  border-bottom-color: var(--svadmin-border);
9390
9741
  color: var(--svadmin-text);
9391
- font-size: 0.8125rem;
9742
+ font-size: var(--svadmin-text-label);
9392
9743
  }
9393
9744
 
9394
9745
  .layout-clean-flat [data-svadmin-table-head] [data-slot="table-head"][data-density="compact"],
@@ -9440,19 +9791,19 @@ details[data-svadmin-filter][open] > :not(summary),
9440
9791
  border-bottom: 1px solid var(--svadmin-border);
9441
9792
  border-radius: 0;
9442
9793
  background: transparent;
9443
- padding: 0.75rem 0;
9794
+ padding: var(--svadmin-space-3) 0;
9444
9795
  box-shadow: none;
9445
9796
  }
9446
9797
 
9447
9798
  .layout-clean-flat [data-svadmin-table-toolbar] [data-slot="input"] {
9448
- height: 2.625rem;
9799
+ height: var(--svadmin-control-h-lg);
9449
9800
  background: var(--svadmin-surface-muted);
9450
9801
  }
9451
9802
 
9452
9803
  .layout-clean-flat [data-svadmin-list-actions] :is([data-slot="button"], .svadmin-button),
9453
9804
  .layout-clean-flat [data-svadmin-table-toolbar] :is([data-slot="button"], .svadmin-button),
9454
9805
  .layout-clean-flat [data-svadmin-form-actions] :is([data-slot="button"], .svadmin-button) {
9455
- height: 2.5rem;
9806
+ height: var(--svadmin-control-h-lg);
9456
9807
  flex-shrink: 0;
9457
9808
  }
9458
9809
 
@@ -10138,6 +10489,28 @@ details[data-svadmin-filter][open] > :not(summary),
10138
10489
  .svadmin-stats-card__footer { margin-top: 0.5rem; }
10139
10490
 
10140
10491
  /* Auth form compatibility for existing consumers. */
10492
+ [data-svadmin-auth-page] {
10493
+ overflow-wrap: anywhere;
10494
+ }
10495
+
10496
+ [data-svadmin-login-form] :is(input, button) {
10497
+ scroll-margin-block: 0.5rem;
10498
+ }
10499
+
10500
+ [data-svadmin-auth-aside],
10501
+ [data-svadmin-auth-main],
10502
+ [data-svadmin-auth-main] > div,
10503
+ [data-svadmin-auth-card],
10504
+ [data-svadmin-auth-card] form,
10505
+ [data-svadmin-auth-brand],
10506
+ [data-svadmin-auth-brand] > :last-child {
10507
+ min-width: 0;
10508
+ }
10509
+
10510
+ [data-svadmin-auth-brand] > :not(:last-child) {
10511
+ flex-shrink: 0;
10512
+ }
10513
+
10141
10514
  .layout-clean-flat [data-svadmin-auth-page] > main > div {
10142
10515
  display: flex;
10143
10516
  width: min(100%, 28.75rem);
@@ -10227,7 +10600,8 @@ details[data-svadmin-filter][open] > :not(summary),
10227
10600
  gap: 0.5rem;
10228
10601
  }
10229
10602
 
10230
- .layout-clean-flat [data-svadmin-auth-page] form > div > div:first-child {
10603
+ /* 标签操作行保持横排,嵌套密码控件仍使用自己的纵向布局。 */
10604
+ .layout-clean-flat [data-svadmin-auth-page] form > div > div:first-child:not(.svadmin-password-input):not([data-svadmin-password-input]) {
10231
10605
  display: flex;
10232
10606
  align-items: center;
10233
10607
  justify-content: space-between;
@@ -10240,6 +10614,28 @@ details[data-svadmin-filter][open] > :not(summary),
10240
10614
  font-weight: 600;
10241
10615
  }
10242
10616
 
10617
+ .svadmin-auth-input-field {
10618
+ position: relative;
10619
+ display: block;
10620
+ min-width: 0;
10621
+ }
10622
+
10623
+ .svadmin-auth-input-field .svadmin-auth-input-control.svadmin-input {
10624
+ padding-inline-start: 2.25rem;
10625
+ }
10626
+
10627
+ .svadmin-auth-input-icon {
10628
+ position: absolute;
10629
+ top: 50%;
10630
+ inset-inline-start: 0.75rem;
10631
+ z-index: 1;
10632
+ width: 1rem;
10633
+ height: 1rem;
10634
+ transform: translateY(-50%);
10635
+ color: var(--muted-foreground);
10636
+ pointer-events: none;
10637
+ }
10638
+
10243
10639
  .layout-clean-flat [data-svadmin-auth-page] form input {
10244
10640
  width: 100%;
10245
10641
  min-height: 2.75rem;
@@ -10280,6 +10676,104 @@ details[data-svadmin-filter][open] > :not(summary),
10280
10676
  }
10281
10677
  }
10282
10678
 
10679
+ /* Password field anatomy. These stable classes do not depend on host Tailwind,
10680
+ * and the logical padding keeps both the lock and reveal control clear of text
10681
+ * in empty, filled, and plain-text states. */
10682
+ .svadmin-password-input {
10683
+ display: grid;
10684
+ min-width: 0;
10685
+ gap: 0.5rem;
10686
+ }
10687
+
10688
+ .svadmin-password-input__label {
10689
+ color: var(--foreground);
10690
+ font-size: 0.875rem;
10691
+ font-weight: 600;
10692
+ }
10693
+
10694
+ .svadmin-password-input__field {
10695
+ position: relative;
10696
+ display: block;
10697
+ min-width: 0;
10698
+ }
10699
+
10700
+ .svadmin-password-input__field .svadmin-password-input__control.svadmin-input {
10701
+ padding-inline-start: 2.25rem;
10702
+ padding-inline-end: 2.5rem;
10703
+ }
10704
+
10705
+ .svadmin-password-input__icon,
10706
+ .svadmin-password-input__toggle {
10707
+ position: absolute;
10708
+ top: 50%;
10709
+ z-index: 1;
10710
+ translate: 0 -50%;
10711
+ }
10712
+
10713
+ .svadmin-password-input__icon {
10714
+ inset-inline-start: 0.75rem;
10715
+ width: 1rem;
10716
+ height: 1rem;
10717
+ color: var(--muted-foreground);
10718
+ pointer-events: none;
10719
+ }
10720
+
10721
+ .svadmin-password-input .svadmin-password-input__toggle {
10722
+ inset-inline-end: 0.25rem;
10723
+ width: 1.75rem;
10724
+ height: 1.75rem;
10725
+ min-height: 0;
10726
+ padding: 0;
10727
+ }
10728
+
10729
+ .svadmin-password-input__glyph {
10730
+ width: 1rem;
10731
+ height: 1rem;
10732
+ }
10733
+
10734
+ .svadmin-password-input__strength {
10735
+ display: flex;
10736
+ min-width: 0;
10737
+ align-items: center;
10738
+ gap: 0.5rem;
10739
+ }
10740
+
10741
+ .svadmin-password-input__strength-track {
10742
+ flex: 1 1 auto;
10743
+ min-width: 0;
10744
+ height: 0.375rem;
10745
+ overflow: hidden;
10746
+ border-radius: 999px;
10747
+ background: var(--muted);
10748
+ }
10749
+
10750
+ .svadmin-password-input__strength-fill {
10751
+ height: 100%;
10752
+ border-radius: inherit;
10753
+ background: var(--destructive);
10754
+ transition: width var(--svadmin-motion-standard) var(--svadmin-motion-easing);
10755
+ }
10756
+
10757
+ .svadmin-password-input__strength-fill[data-tone="warning"] {
10758
+ background: var(--warning);
10759
+ }
10760
+
10761
+ .svadmin-password-input__strength-fill[data-tone="info"] {
10762
+ background: var(--info);
10763
+ }
10764
+
10765
+ .svadmin-password-input__strength-fill[data-tone="success"] {
10766
+ background: var(--success);
10767
+ }
10768
+
10769
+ .svadmin-password-input__strength-label {
10770
+ flex: 0 0 auto;
10771
+ color: var(--muted-foreground);
10772
+ font-size: 0.75rem;
10773
+ line-height: 1.25;
10774
+ white-space: nowrap;
10775
+ }
10776
+
10283
10777
  /* --- Stripe-inspired visual refinement ---------------------
10284
10778
  * The existing clean-flat preset owns the shell geometry. This layer keeps
10285
10779
  * that contract intact while giving the example a single neutral canvas,