@happyvertical/smrt-svelte 0.55.16 → 0.55.18

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 (153) hide show
  1. package/README.md +5 -3
  2. package/agents/cookbook-shell.md +7 -1
  3. package/agents/overview-surfaces.md +5 -0
  4. package/agents/workspace.md +155 -11
  5. package/dist/browser-ai/svelte/components/DownloadProgress.svelte +22 -19
  6. package/dist/browser-ai/svelte/components/ModelStatusControl.svelte +16 -13
  7. package/dist/browser-ai/svelte/components/STTTest.svelte +41 -38
  8. package/dist/browser-ai/svelte/components/VoiceInput.svelte +17 -14
  9. package/dist/components/activity/ActivityList.svelte +1 -1
  10. package/dist/components/app/AppShell.svelte +279 -14
  11. package/dist/components/app/AppShell.svelte.d.ts +63 -2
  12. package/dist/components/app/AppShell.svelte.d.ts.map +1 -1
  13. package/dist/components/app/DockToggles.svelte +53 -11
  14. package/dist/components/app/DockToggles.svelte.d.ts.map +1 -1
  15. package/dist/components/app/OwnerSetupForm.svelte +98 -34
  16. package/dist/components/app/OwnerSetupForm.svelte.d.ts +4 -0
  17. package/dist/components/app/OwnerSetupForm.svelte.d.ts.map +1 -1
  18. package/dist/components/app/PhoneTabBar.svelte +136 -0
  19. package/dist/components/app/PhoneTabBar.svelte.d.ts +22 -0
  20. package/dist/components/app/PhoneTabBar.svelte.d.ts.map +1 -0
  21. package/dist/components/app/ShellSettingsPage.svelte +17 -2
  22. package/dist/components/app/ShellSettingsPage.svelte.d.ts +11 -16
  23. package/dist/components/app/ShellSettingsPage.svelte.d.ts.map +1 -1
  24. package/dist/components/app/dock-toggle.d.ts +3 -2
  25. package/dist/components/app/dock-toggle.d.ts.map +1 -1
  26. package/dist/components/app/index.d.ts +2 -1
  27. package/dist/components/app/index.d.ts.map +1 -1
  28. package/dist/components/app/index.js +1 -0
  29. package/dist/components/app/owner-setup-types.d.ts +5 -0
  30. package/dist/components/app/owner-setup-types.d.ts.map +1 -1
  31. package/dist/components/app/phone-tabs.d.ts +41 -0
  32. package/dist/components/app/phone-tabs.d.ts.map +1 -0
  33. package/dist/components/app/phone-tabs.js +66 -0
  34. package/dist/components/app/slot-item.d.ts +16 -0
  35. package/dist/components/app/slot-item.d.ts.map +1 -1
  36. package/dist/components/app/view-transition.d.ts +43 -0
  37. package/dist/components/app/view-transition.d.ts.map +1 -0
  38. package/dist/components/app/view-transition.js +76 -0
  39. package/dist/components/audit/AuditList.svelte +4 -1
  40. package/dist/components/audit/RecordHistory.svelte +4 -1
  41. package/dist/components/board/Board.svelte +4 -1
  42. package/dist/components/command-palette/CommandPalette.svelte +4 -1
  43. package/dist/components/command-palette/CommandPalette.svelte.d.ts +2 -0
  44. package/dist/components/command-palette/CommandPalette.svelte.d.ts.map +1 -1
  45. package/dist/components/command-palette/CommandPaletteDialog.svelte +3 -0
  46. package/dist/components/command-palette/CommandPaletteTrigger.svelte +3 -0
  47. package/dist/components/cookbook/CookbookApp.svelte +2 -1
  48. package/dist/components/cookbook/CookbookApp.svelte.d.ts.map +1 -1
  49. package/dist/components/cookbook/CookbookSectionPage.svelte +4 -1
  50. package/dist/components/cookbook/brand-theme.d.ts.map +1 -1
  51. package/dist/components/cookbook/brand-theme.js +21 -2
  52. package/dist/components/cookbook/build.js +1 -1
  53. package/dist/components/cookbook/theme.d.ts.map +1 -1
  54. package/dist/components/cookbook/theme.js +9 -5
  55. package/dist/components/cookbook/types.d.ts +5 -1
  56. package/dist/components/cookbook/types.d.ts.map +1 -1
  57. package/dist/components/forms/AddressInput.svelte +25 -22
  58. package/dist/components/forms/CheckboxInput.svelte +8 -5
  59. package/dist/components/forms/DateRangeInput.svelte +41 -38
  60. package/dist/components/forms/DateTimeInput.svelte +29 -26
  61. package/dist/components/forms/FileUpload.svelte +24 -21
  62. package/dist/components/forms/Form.svelte +34 -31
  63. package/dist/components/forms/FormMicButton.svelte +10 -7
  64. package/dist/components/forms/FormScope.svelte +4 -1
  65. package/dist/components/forms/MeasurementInput.svelte +26 -23
  66. package/dist/components/forms/MoneyInput.svelte +18 -15
  67. package/dist/components/forms/NumberInput.svelte +17 -14
  68. package/dist/components/forms/PhoneInput.svelte +37 -34
  69. package/dist/components/forms/SearchInput.svelte +16 -13
  70. package/dist/components/forms/SelectInput.svelte +17 -14
  71. package/dist/components/forms/TextInput.svelte +19 -16
  72. package/dist/components/forms/TextareaInput.svelte +21 -18
  73. package/dist/components/import-export/ImportExport.svelte +4 -1
  74. package/dist/components/module/ModulePanel.svelte +14 -11
  75. package/dist/components/notifications/NotificationBell.svelte +4 -1
  76. package/dist/components/overview/OverviewAssistantUndo.svelte +4 -1
  77. package/dist/components/overview/OverviewGrid.svelte +11 -6
  78. package/dist/components/overview/OverviewGrid.svelte.d.ts.map +1 -1
  79. package/dist/components/overview/WidgetOptionsForm.svelte +3 -0
  80. package/dist/components/overview/widgets/ChartWidget.svelte +7 -4
  81. package/dist/components/overview/widgets/MetricWidget.svelte +5 -2
  82. package/dist/components/overview/widgets/NoteWidget.svelte +5 -2
  83. package/dist/components/overview/widgets/RecordListWidget.svelte +6 -3
  84. package/dist/components/overview/widgets/ShortcutsWidget.svelte +12 -6
  85. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts.map +1 -1
  86. package/dist/components/screens/DetailScreen.svelte +6 -3
  87. package/dist/components/screens/EditForm.svelte +6 -3
  88. package/dist/components/screens/ListScreen.svelte +4 -1
  89. package/dist/components/screens/RecipeScreens.svelte +1 -1
  90. package/dist/components/settings/SettingsCatalog.svelte +4 -1
  91. package/dist/components/sortable/Sortable.svelte +11 -5
  92. package/dist/components/sortable/Sortable.svelte.d.ts.map +1 -1
  93. package/dist/components/workspace/Breadcrumbs.svelte +4 -1
  94. package/dist/components/workspace/NavTree.svelte +4 -1
  95. package/dist/components/workspace/RoleShell.svelte +4 -1
  96. package/dist/components/workspace/WorkspaceShell.svelte +43 -40
  97. package/dist/components/workspace/admin-shell/ActivityItem.svelte +4 -1
  98. package/dist/components/workspace/admin-shell/ActivityList.svelte +5 -2
  99. package/dist/components/workspace/admin-shell/ActivityTicker.svelte +6 -3
  100. package/dist/components/workspace/admin-shell/ActivityToasts.svelte +9 -4
  101. package/dist/components/workspace/admin-shell/AdminShell.svelte +642 -126
  102. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts +7 -1
  103. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts.map +1 -1
  104. package/dist/components/workspace/admin-shell/AppScopePanel.svelte +4 -1
  105. package/dist/components/workspace/admin-shell/HotkeyInput.svelte +4 -1
  106. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte +58 -14
  107. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte.d.ts +9 -2
  108. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte.d.ts.map +1 -1
  109. package/dist/components/workspace/admin-shell/PhoneTopBar.svelte +15 -6
  110. package/dist/components/workspace/admin-shell/ShellBrand.svelte +3 -0
  111. package/dist/components/workspace/admin-shell/ShellCorner.svelte +4 -1
  112. package/dist/components/workspace/admin-shell/ShellIconButton.svelte +11 -7
  113. package/dist/components/workspace/admin-shell/ShellLayoutEditor.svelte +6 -3
  114. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte +19 -13
  115. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts +1 -1
  116. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts.map +1 -1
  117. package/dist/components/workspace/admin-shell/ShellNavToggle.svelte +8 -5
  118. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte +4 -1
  119. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte +24 -17
  120. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte.d.ts.map +1 -1
  121. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte +236 -48
  122. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte.d.ts +11 -1
  123. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte.d.ts.map +1 -1
  124. package/dist/components/workspace/admin-shell/ShellTitle.svelte +4 -1
  125. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte +4 -1
  126. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte +4 -1
  127. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte +5 -2
  128. package/dist/components/workspace/admin-shell/TenantNav.svelte +112 -43
  129. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts +4 -3
  130. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts.map +1 -1
  131. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte +322 -55
  132. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte.d.ts +15 -2
  133. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte.d.ts.map +1 -1
  134. package/dist/components/workspace/admin-shell/motion.d.ts +19 -0
  135. package/dist/components/workspace/admin-shell/motion.d.ts.map +1 -0
  136. package/dist/components/workspace/admin-shell/motion.js +44 -0
  137. package/dist/components/workspace/admin-shell/settings.d.ts +1 -0
  138. package/dist/components/workspace/admin-shell/settings.d.ts.map +1 -1
  139. package/dist/components/workspace/admin-shell/settings.js +1 -1
  140. package/dist/components/workspace/admin-shell/shell-icons.d.ts +8 -0
  141. package/dist/components/workspace/admin-shell/shell-icons.d.ts.map +1 -1
  142. package/dist/components/workspace/admin-shell/shell-icons.js +8 -0
  143. package/dist/components/workspace/admin-shell/state.svelte.d.ts +6 -0
  144. package/dist/components/workspace/admin-shell/state.svelte.d.ts.map +1 -1
  145. package/dist/components/workspace/admin-shell/state.svelte.js +15 -0
  146. package/dist/components/workspace/admin-shell/types.d.ts +13 -3
  147. package/dist/components/workspace/admin-shell/types.d.ts.map +1 -1
  148. package/dist/components/workspace/tools-dock/ToolsDock.svelte +41 -38
  149. package/dist/i18n/strings.workspace.d.ts +37 -0
  150. package/dist/i18n/strings.workspace.d.ts.map +1 -1
  151. package/dist/i18n/strings.workspace.js +42 -2
  152. package/dist/mcp-apps/McpAppsBridge.svelte +4 -1
  153. package/package.json +14 -14
@@ -103,8 +103,14 @@ interface Props extends AdminShellProps {
103
103
  viewport: ShellViewport;
104
104
  bottomBar: BottomBarMode;
105
105
  }]>;
106
- /** Phone behavior switches (scrim, swipe to close, hide on scroll). */
106
+ /** Phone behavior switches (scrim and swipe to close default on; hide on scroll). */
107
107
  phone?: AdminShellPhoneOptions;
108
+ /**
109
+ * Show the built-in "Tools" opener on phones while the right edge has
110
+ * focus tools (default true). `AppShell` turns it off when dock toggles
111
+ * already open the dock from the header.
112
+ */
113
+ phoneDockOpener?: boolean;
108
114
  /** Keep the phone top bar shown (e.g. while a banner is visible). */
109
115
  pinChrome?: boolean;
110
116
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AdminShell.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/AdminShell.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdminShell.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/AdminShell.svelte.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ const { t } = useI18n();
36
36
 
37
37
  <section
38
38
  class="smrt-app-scope-panel"
39
- aria-label={t(M['ui.app_scope_panel.app_scope'])}
39
+ aria-label={t(M['ui.app_scope_panel.app_scope'])} data-smrt-component="AppScopePanel"
40
40
  >
41
41
  <header>
42
42
  <div>
@@ -74,6 +74,8 @@ const { t } = useI18n();
74
74
  </section>
75
75
 
76
76
  <style>
77
+ @layer smrt.reset, smrt.structure, smrt.theme;
78
+ @layer smrt.theme {
77
79
  .smrt-app-scope-panel {
78
80
  display: grid;
79
81
  grid-template-columns: minmax(0, 1fr);
@@ -110,4 +112,5 @@ const { t } = useI18n();
110
112
  .smrt-app-scope-panel__section {
111
113
  min-width: 0;
112
114
  }
115
+ }
113
116
  </style>
@@ -45,7 +45,7 @@ function handleKeydown(event: KeyboardEvent): void {
45
45
  }
46
46
  </script>
47
47
 
48
- <div class="smrt-hotkey-input">
48
+ <div class="smrt-hotkey-input" data-smrt-component="HotkeyInput">
49
49
  <Button
50
50
  variant="secondary"
51
51
  size="sm"
@@ -63,6 +63,8 @@ function handleKeydown(event: KeyboardEvent): void {
63
63
  </div>
64
64
 
65
65
  <style>
66
+ @layer smrt.reset, smrt.structure, smrt.theme;
67
+ @layer smrt.theme {
66
68
  .smrt-hotkey-input {
67
69
  display: flex;
68
70
  align-items: center;
@@ -75,4 +77,5 @@ function handleKeydown(event: KeyboardEvent): void {
75
77
  font-size: var(--smrt-typography-body-small-size);
76
78
  overflow-wrap: anywhere;
77
79
  }
80
+ }
78
81
  </style>
@@ -7,21 +7,27 @@
7
7
  * while a form's action bar is on screen or the keyboard is open.
8
8
  */
9
9
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
10
+ import type { Component } from 'svelte';
10
11
  import { M } from '../../../i18n/strings.workspace.js';
11
12
  import type { PhoneBottomBarItem } from './mobile-shell.js';
13
+ import ShellSectionIcon from './ShellSectionIcon.svelte';
14
+ import { SHELL_PLACEHOLDER_ICON } from './shell-icons.js';
15
+ import type { PhoneBottomBarEntry } from './types.js';
12
16
 
13
17
  interface Props {
14
18
  /** Bar entries, left to right. */
15
- items: PhoneBottomBarItem[];
19
+ items: (PhoneBottomBarItem | PhoneBottomBarEntry)[];
20
+ /** Renders `iconName`s that are not built-in shell icons. */
21
+ iconComponent?: Component<{ name: string; size?: number }>;
16
22
  /** Accessible name of the nav landmark (default "Main"). */
17
23
  label?: string;
18
24
  }
19
25
 
20
- let { items, label }: Props = $props();
26
+ let { items, label, iconComponent }: Props = $props();
21
27
 
22
28
  const { t } = useI18n();
23
29
 
24
- function accessibleName(item: PhoneBottomBarItem): string {
30
+ function accessibleName(item: PhoneBottomBarEntry): string {
25
31
  const parts = [item.label];
26
32
  if (item.badge) {
27
33
  parts.push(
@@ -33,9 +39,13 @@ function accessibleName(item: PhoneBottomBarItem): string {
33
39
  }
34
40
  </script>
35
41
 
36
- {#snippet content(item: PhoneBottomBarItem)}
42
+ {#snippet content(item: PhoneBottomBarEntry)}
37
43
  <span class="smrt-phone-bottom-bar__icon" aria-hidden="true">
38
- <item.icon size={22} />
44
+ {#if item.icon}
45
+ <item.icon size={22} />
46
+ {:else}
47
+ <ShellSectionIcon name={item.iconName ?? SHELL_PLACEHOLDER_ICON} size={22} {iconComponent} />
48
+ {/if}
39
49
  {#if item.badge}
40
50
  <span class="smrt-phone-bottom-bar__badge">
41
51
  {item.badge > 9 ? '9+' : item.badge}
@@ -50,7 +60,7 @@ function accessibleName(item: PhoneBottomBarItem): string {
50
60
  <nav
51
61
  class="smrt-phone-bottom-bar"
52
62
  aria-label={label ?? t(M['ui.phone_bottom_bar.label'])}
53
- data-testid="phone-bottom-bar"
63
+ data-testid="phone-bottom-bar" data-smrt-component="PhoneBottomBar"
54
64
  >
55
65
  {#each items as item (item.id)}
56
66
  {#if item.href}
@@ -84,6 +94,8 @@ function accessibleName(item: PhoneBottomBarItem): string {
84
94
  </nav>
85
95
 
86
96
  <style>
97
+ @layer smrt.reset, smrt.structure, smrt.theme;
98
+ @layer smrt.theme {
87
99
  .smrt-phone-bottom-bar {
88
100
  display: grid;
89
101
  grid-auto-columns: minmax(0, 1fr);
@@ -92,8 +104,10 @@ function accessibleName(item: PhoneBottomBarItem): string {
92
104
  box-sizing: content-box;
93
105
  block-size: 3.5rem;
94
106
  padding: 0 var(--smrt-spacing-2) env(safe-area-inset-bottom);
95
- border-block-start: 1px solid var(--smrt-color-outline-variant);
96
- background: var(--smrt-color-surface);
107
+ border-block-start: var(--smrt-hairline);
108
+ background: var(--smrt-glass-surface);
109
+ -webkit-backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation));
110
+ backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation));
97
111
  }
98
112
 
99
113
  .smrt-phone-bottom-bar__item {
@@ -101,11 +115,11 @@ function accessibleName(item: PhoneBottomBarItem): string {
101
115
  place-items: center;
102
116
  align-content: center;
103
117
  gap: var(--smrt-spacing-1);
104
- min-inline-size: 2.75rem;
105
- min-block-size: 2.75rem;
118
+ min-inline-size: var(--smrt-touch-target-min);
119
+ min-block-size: var(--smrt-touch-target-min);
106
120
  padding: var(--smrt-spacing-1) 0;
107
121
  border: 0;
108
- border-radius: var(--smrt-radius-lg);
122
+ border-radius: var(--smrt-control-radius);
109
123
  background: transparent;
110
124
  color: var(--smrt-color-on-surface-variant);
111
125
  font: inherit;
@@ -114,6 +128,35 @@ function accessibleName(item: PhoneBottomBarItem): string {
114
128
  -webkit-tap-highlight-color: transparent;
115
129
  }
116
130
 
131
+ .smrt-phone-bottom-bar__item {
132
+ position: relative;
133
+ }
134
+
135
+ /* State layer over the whole tab; the selected indicator pill keeps its
136
+ container fill. */
137
+ .smrt-phone-bottom-bar__item::after {
138
+ content: '';
139
+ position: absolute;
140
+ inset: 0;
141
+ border-radius: inherit;
142
+ background: currentColor;
143
+ opacity: 0;
144
+ pointer-events: none;
145
+ }
146
+
147
+ .smrt-phone-bottom-bar__item:hover::after {
148
+ opacity: var(--smrt-state-hover);
149
+ }
150
+
151
+ .smrt-phone-bottom-bar__item:active::after {
152
+ opacity: var(--smrt-state-pressed);
153
+ }
154
+
155
+ .smrt-phone-bottom-bar__item:disabled,
156
+ .smrt-phone-bottom-bar__item[aria-disabled='true'] {
157
+ opacity: var(--smrt-state-disabled);
158
+ }
159
+
117
160
  .smrt-phone-bottom-bar__item.active {
118
161
  color: var(--smrt-color-primary);
119
162
  }
@@ -124,8 +167,8 @@ function accessibleName(item: PhoneBottomBarItem): string {
124
167
  }
125
168
 
126
169
  .smrt-phone-bottom-bar__item:focus-visible {
127
- outline: 2px solid var(--smrt-color-primary);
128
- outline-offset: -2px;
170
+ outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
171
+ outline-offset: calc(-1 * var(--smrt-focus-ring-width));
129
172
  }
130
173
 
131
174
  .smrt-phone-bottom-bar__icon {
@@ -163,8 +206,9 @@ function accessibleName(item: PhoneBottomBarItem): string {
163
206
  inset-inline-end: 1rem;
164
207
  inline-size: 0.6rem;
165
208
  block-size: 0.6rem;
166
- border: 2px solid var(--smrt-color-surface);
209
+ border: var(--smrt-focus-ring-width) solid var(--smrt-surface-panel);
167
210
  border-radius: var(--smrt-radius-full);
168
211
  background: var(--smrt-color-primary);
169
212
  }
213
+ }
170
214
  </style>
@@ -1,11 +1,18 @@
1
+ import type { Component } from 'svelte';
1
2
  import type { PhoneBottomBarItem } from './mobile-shell.js';
3
+ import type { PhoneBottomBarEntry } from './types.js';
2
4
  interface Props {
3
5
  /** Bar entries, left to right. */
4
- items: PhoneBottomBarItem[];
6
+ items: (PhoneBottomBarItem | PhoneBottomBarEntry)[];
7
+ /** Renders `iconName`s that are not built-in shell icons. */
8
+ iconComponent?: Component<{
9
+ name: string;
10
+ size?: number;
11
+ }>;
5
12
  /** Accessible name of the nav landmark (default "Main"). */
6
13
  label?: string;
7
14
  }
8
- declare const PhoneBottomBar: import("svelte").Component<Props, {}, "">;
15
+ declare const PhoneBottomBar: Component<Props, {}, "">;
9
16
  type PhoneBottomBar = ReturnType<typeof PhoneBottomBar>;
10
17
  export default PhoneBottomBar;
11
18
  //# sourceMappingURL=PhoneBottomBar.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PhoneBottomBar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/PhoneBottomBar.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,UAAU,KAAK;IACb,kCAAkC;IAClC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyDD,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"PhoneBottomBar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/PhoneBottomBar.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,UAAU,KAAK;IACb,kCAAkC;IAClC,KAAK,EAAE,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,EAAE,CAAC;IACpD,6DAA6D;IAC7D,aAAa,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiED,QAAA,MAAM,cAAc,0BAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -23,7 +23,7 @@ let { model, homeHref }: Props = $props();
23
23
  const { t } = useI18n();
24
24
  </script>
25
25
 
26
- <div class="smrt-phone-top-bar" data-testid="phone-top-bar" data-kind={model.kind}>
26
+ <div class="smrt-phone-top-bar" data-testid="phone-top-bar" data-kind={model.kind} data-smrt-component="PhoneTopBar">
27
27
  {#if model.kind === 'detail'}
28
28
  <a
29
29
  class="smrt-phone-top-bar__back"
@@ -52,6 +52,8 @@ const { t } = useI18n();
52
52
  </div>
53
53
 
54
54
  <style>
55
+ @layer smrt.reset, smrt.structure, smrt.theme;
56
+ @layer smrt.theme {
55
57
  .smrt-phone-top-bar {
56
58
  display: flex;
57
59
  align-items: center;
@@ -59,8 +61,10 @@ const { t } = useI18n();
59
61
  box-sizing: border-box;
60
62
  block-size: var(--smrt-admin-shell-phone-top-size, 3.5rem);
61
63
  padding: 0 var(--smrt-spacing-2);
62
- border-block-end: 1px solid var(--smrt-color-outline-variant);
63
- background: var(--smrt-color-surface);
64
+ border-block-end: var(--smrt-hairline);
65
+ background: var(--smrt-glass-surface);
66
+ -webkit-backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation));
67
+ backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation));
64
68
  color: var(--smrt-color-on-surface);
65
69
  }
66
70
 
@@ -76,12 +80,16 @@ const { t } = useI18n();
76
80
 
77
81
  .smrt-phone-top-bar__back:hover,
78
82
  .smrt-phone-top-bar__back:focus-visible {
79
- background: var(--smrt-color-surface-container-high);
83
+ background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent);
84
+ }
85
+
86
+ .smrt-phone-top-bar__back:active {
87
+ background: color-mix(in srgb, currentColor calc(var(--smrt-state-pressed) * 100%), transparent);
80
88
  }
81
89
 
82
90
  .smrt-phone-top-bar__back:focus-visible {
83
- outline: 2px solid var(--smrt-color-primary);
84
- outline-offset: -2px;
91
+ outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
92
+ outline-offset: calc(-1 * var(--smrt-focus-ring-width));
85
93
  }
86
94
 
87
95
  .smrt-phone-top-bar__title {
@@ -91,4 +99,5 @@ const { t } = useI18n();
91
99
  text-overflow: ellipsis;
92
100
  white-space: nowrap;
93
101
  }
102
+ }
94
103
  </style>
@@ -54,6 +54,8 @@ const { t } = useI18n();
54
54
  {/if}
55
55
 
56
56
  <style>
57
+ @layer smrt.reset, smrt.structure, smrt.theme;
58
+ @layer smrt.theme {
57
59
  .smrt-admin-shell__brand {
58
60
  display: flex;
59
61
  align-items: center;
@@ -83,4 +85,5 @@ const { t } = useI18n();
83
85
  .smrt-admin-shell__brand-text.wordmark strong {
84
86
  font: var(--smrt-typography-headline-small-font, 500 1.5rem/2rem sans-serif);
85
87
  }
88
+ }
86
89
  </style>
@@ -10,11 +10,13 @@ interface Props {
10
10
  let { side, children }: Props = $props();
11
11
  </script>
12
12
 
13
- <div class="smrt-shell-corner" data-side={side}>
13
+ <div class="smrt-shell-corner" data-side={side} data-smrt-component="ShellCorner">
14
14
  {@render children()}
15
15
  </div>
16
16
 
17
17
  <style>
18
+ @layer smrt.reset, smrt.structure, smrt.theme;
19
+ @layer smrt.theme {
18
20
  .smrt-shell-corner {
19
21
  inline-size: var(--smrt-admin-shell-left-track);
20
22
  min-inline-size: 0;
@@ -23,4 +25,5 @@ let { side, children }: Props = $props();
23
25
  .smrt-shell-corner[data-side='right'] {
24
26
  inline-size: var(--smrt-admin-shell-right-track);
25
27
  }
28
+ }
26
29
  </style>
@@ -44,7 +44,7 @@ let {
44
44
  class="smrt-shell-icon-button {className}"
45
45
  aria-label={label}
46
46
  title={tooltip ?? label}
47
- aria-pressed={pressed}
47
+ aria-pressed={pressed} data-smrt-component="ShellIconButton"
48
48
  >
49
49
  {#if children}
50
50
  {@render children()}
@@ -56,22 +56,26 @@ let {
56
56
  </button>
57
57
 
58
58
  <style>
59
+ @layer smrt.reset, smrt.structure, smrt.theme;
60
+ @layer smrt.theme {
59
61
  .smrt-shell-icon-button {
60
62
  flex: 0 0 auto;
61
63
  display: inline-grid;
62
64
  place-items: center;
63
65
  box-sizing: border-box;
64
- inline-size: max(2rem, var(--smrt-control-target-min, 0px));
65
- block-size: max(2rem, var(--smrt-control-target-min, 0px));
66
+ inline-size: max(var(--smrt-control-height-small), var(--smrt-control-target-min, 0px));
67
+ block-size: max(var(--smrt-control-height-small), var(--smrt-control-target-min, 0px));
66
68
  padding: 0;
67
69
  border: 0;
68
- border-radius: var(--smrt-radius-medium, 0.5rem);
70
+ border-radius: var(--smrt-control-radius);
69
71
  background: transparent;
70
72
  color: var(--smrt-color-on-surface-variant);
71
73
  cursor: pointer;
72
74
  }
73
- .smrt-shell-icon-button:hover { background: var(--smrt-color-surface-container-high); color: var(--smrt-color-on-surface); }
75
+ .smrt-shell-icon-button:hover { background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent); color: var(--smrt-color-on-surface); }
76
+ .smrt-shell-icon-button:active { background: color-mix(in srgb, currentColor calc(var(--smrt-state-pressed) * 100%), transparent); }
74
77
  .smrt-shell-icon-button[aria-pressed='true'] { color: var(--smrt-color-on-surface); }
75
- .smrt-shell-icon-button:focus-visible { outline: 2px solid var(--smrt-color-primary); outline-offset: 2px; }
76
- .smrt-shell-icon-button:disabled { opacity: 0.5; cursor: not-allowed; }
78
+ .smrt-shell-icon-button:focus-visible { outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color); outline-offset: var(--smrt-focus-ring-offset); }
79
+ .smrt-shell-icon-button:disabled { opacity: var(--smrt-state-disabled); cursor: not-allowed; }
80
+ }
77
81
  </style>
@@ -114,7 +114,7 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
114
114
  }
115
115
  </script>
116
116
 
117
- <section class="smrt-shell-layout-editor" aria-labelledby={headingId} bind:this={rootEl}>
117
+ <section class="smrt-shell-layout-editor" aria-labelledby={headingId} bind:this={rootEl} data-smrt-component="ShellLayoutEditor">
118
118
  <header>
119
119
  <div>
120
120
  <h2 id={headingId}>{t(M['ui.shell_layout_editor.heading'])}</h2>
@@ -246,12 +246,14 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
246
246
  </section>
247
247
 
248
248
  <style>
249
+ @layer smrt.reset, smrt.structure, smrt.theme;
250
+ @layer smrt.theme {
249
251
  .smrt-shell-layout-editor { display: grid; gap: var(--smrt-spacing-4); min-inline-size: 0; overflow-wrap: anywhere; }
250
252
  .smrt-shell-layout-editor header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--smrt-spacing-3); }
251
253
  .smrt-shell-layout-editor h2, .smrt-shell-layout-editor h3, .smrt-shell-layout-editor p { margin: 0; }
252
254
  .smrt-shell-layout-editor p, .smrt-shell-layout-editor__muted { color: var(--smrt-color-on-surface-variant); }
253
255
  .smrt-shell-layout-editor h3 { font: var(--smrt-typography-title-small-font); margin-block-end: var(--smrt-spacing-2); }
254
- .smrt-shell-layout-editor__panels { display: grid; gap: var(--smrt-spacing-2); margin: 0; padding: var(--smrt-spacing-3); border: 1px solid var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-md); }
256
+ .smrt-shell-layout-editor__panels { display: grid; gap: var(--smrt-spacing-2); margin: 0; padding: var(--smrt-spacing-3); border: var(--smrt-hairline); border-radius: var(--smrt-radius-md); }
255
257
  .smrt-shell-layout-editor__panels legend { padding-inline: var(--smrt-spacing-1); font: var(--smrt-typography-title-small-font); }
256
258
  .smrt-shell-layout-editor__row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--smrt-spacing-4); }
257
259
  .smrt-shell-layout-editor__body { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: var(--smrt-spacing-4); align-items: start; }
@@ -259,10 +261,11 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
259
261
  .smrt-shell-layout-editor__nav-head h3 { margin-block-end: 0; }
260
262
  :global(.smrt-shell-layout-editor__name) { flex: 1 1 8rem; min-inline-size: 0; }
261
263
  .smrt-shell-layout-editor__label { flex: 1 1 auto; min-inline-size: 0; }
262
- .smrt-shell-layout-editor__preview-frame { padding: var(--smrt-spacing-3); border: 1px dashed var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-md); background: var(--smrt-color-surface-container-low, var(--smrt-color-surface)); }
264
+ .smrt-shell-layout-editor__preview-frame { padding: var(--smrt-spacing-3); border: var(--smrt-hairline); border-style: dashed; border-radius: var(--smrt-radius-md); background: var(--smrt-surface-sunken); }
263
265
  /* Label on its own line (never broken mid-word); the select and Reset share the next line. */
264
266
  @media (max-width: 48rem) {
265
267
  .smrt-shell-layout-editor header { flex-direction: column; }
266
268
  .smrt-shell-layout-editor__body { grid-template-columns: minmax(0, 1fr); }
267
269
  }
270
+ }
268
271
  </style>
@@ -43,7 +43,7 @@ interface Props {
43
43
  * picker); their entries are edited on the section's own page with
44
44
  * `ShellSectionMenu`. Default `'items'`.
45
45
  */
46
- navMode?: 'items' | 'sections';
46
+ navMode?: 'items' | 'sections' | 'sections-with-items';
47
47
  }
48
48
 
49
49
  let {
@@ -312,7 +312,7 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
312
312
  data-layout-editing=""
313
313
  data-nav-mode={navMode}
314
314
  aria-label={ariaLabel || t(M['ui.shell_layout_editor.sortable_label'])}
315
- bind:this={rootEl}
315
+ bind:this={rootEl} data-smrt-component="ShellNavEditor"
316
316
  >
317
317
  <Sortable
318
318
  {containers}
@@ -350,7 +350,7 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
350
350
  aria-label={t(M['ui.layout_edit.edit_section'], { label: entry.label })}
351
351
  onpointerenter={(event) => onhover(entry.id, event)}
352
352
  onclick={() => onactivate(entry.id)}
353
- >{#if navMode === 'sections'}<span class="smrt-nav-editor__section-icon"><ShellSectionIcon name={entry.icon} iconComponent={IconComponent} /></span>{/if}{entry.label}</button>
353
+ >{#if navMode !== 'items'}<span class="smrt-nav-editor__section-icon"><ShellSectionIcon name={entry.icon} iconComponent={IconComponent} /></span>{/if}{entry.label}</button>
354
354
  <span class="smrt-nav-editor__overlay">
355
355
  {@render toggles(entry)}
356
356
  {@render actions(entry)}
@@ -377,7 +377,7 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
377
377
  }}
378
378
  />
379
379
  {@render toggles(entry)}
380
- {#if navMode === 'sections'}
380
+ {#if navMode !== 'items'}
381
381
  <ShellIconButton
382
382
  data-section-icon={entry.id}
383
383
  aria-haspopup="true"
@@ -396,7 +396,7 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
396
396
  />
397
397
  {/if}
398
398
  {@render actions(entry)}
399
- {#if navMode === 'sections' && iconPicker === entry.id}
399
+ {#if navMode !== 'items' && iconPicker === entry.id}
400
400
  <div
401
401
  class="smrt-nav-editor__icons"
402
402
  role="group"
@@ -432,7 +432,7 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
432
432
  {#if IconComponent}
433
433
  <IconComponent name={icon} size={18} />
434
434
  {:else}
435
- {icon}
435
+ <ShellSectionIcon name={icon} size={18} />
436
436
  {/if}
437
437
  </span>
438
438
  {/if}
@@ -489,13 +489,15 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
489
489
  </nav>
490
490
 
491
491
  <style>
492
+ @layer smrt.reset, smrt.structure, smrt.theme;
493
+ @layer smrt.theme {
492
494
  .smrt-nav-editor { display: grid; gap: var(--smrt-spacing-2); min-inline-size: 0; }
493
495
  /* Make the generic Sortable read as the real navigation. */
494
496
  .smrt-nav-editor :global(.smrt-sortable) { gap: var(--smrt-spacing-1); }
495
497
  .smrt-nav-editor :global(.smrt-sortable__containers) { gap: var(--smrt-spacing-1); }
496
498
  .smrt-nav-editor :global(.smrt-sortable__container) { padding: 0; border: 0; background: transparent; gap: var(--smrt-spacing-1); }
497
- .smrt-nav-editor :global(.smrt-sortable__item) { padding: 0; border: 0; border-radius: var(--smrt-radius-medium); background: transparent; }
498
- .smrt-nav-editor :global(.smrt-sortable__item:hover) { background: var(--smrt-color-surface-container-high); }
499
+ .smrt-nav-editor :global(.smrt-sortable__item) { padding: 0; border: 0; border-radius: var(--smrt-control-radius); background: transparent; }
500
+ .smrt-nav-editor :global(.smrt-sortable__item:hover) { background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent); }
499
501
  .smrt-nav-editor :global(.smrt-sortable__items) { padding-inline-start: var(--smrt-spacing-3); min-block-size: 0; }
500
502
  .smrt-nav-editor :global(.smrt-sortable__header) { min-block-size: 0; }
501
503
  .smrt-nav-editor :global(.smrt-sortable__empty) { padding-block: 0; }
@@ -503,15 +505,18 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
503
505
 
504
506
  .smrt-nav-editor__top { color: var(--smrt-color-on-surface-variant); font: var(--smrt-typography-label-small-font); text-transform: uppercase; letter-spacing: 0.04em; }
505
507
  .smrt-nav-editor__head { position: relative; flex: 1 1 auto; display: flex; align-items: center; gap: var(--smrt-spacing-1); min-inline-size: 0; }
506
- .smrt-nav-editor__title { flex: 1 1 auto; min-inline-size: 0; padding: var(--smrt-spacing-2) var(--smrt-spacing-3); border: 0; border-radius: var(--smrt-radius-medium); background: transparent; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-label-large-size); font-weight: var(--smrt-typography-weight-semibold); text-align: start; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
507
- .smrt-nav-editor__title:hover, .smrt-nav-editor__head[data-toolbar-open] .smrt-nav-editor__title { background: var(--smrt-color-surface-container-high); }
508
- .smrt-nav-editor__title:focus-visible { outline: 2px solid var(--smrt-color-primary); outline-offset: 2px; }
508
+ .smrt-nav-editor__title { flex: 1 1 auto; min-inline-size: 0; padding: var(--smrt-spacing-2) var(--smrt-spacing-3); border: 0; border-radius: var(--smrt-control-radius); background: transparent; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-label-large-size); font-weight: var(--smrt-typography-weight-semibold); text-align: start; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
509
+ .smrt-nav-editor__title:hover, .smrt-nav-editor__head[data-toolbar-open] .smrt-nav-editor__title { background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent); }
510
+ .smrt-nav-editor__title:focus-visible { outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color); outline-offset: var(--smrt-focus-ring-offset); }
509
511
  .smrt-nav-editor__title--off { font-style: italic; font-weight: var(--smrt-typography-weight-normal, normal); }
510
512
  .smrt-nav-editor__title--hidden { opacity: 0.55; }
511
513
  .smrt-nav-editor__overlay { display: inline-flex; align-items: center; flex: 0 0 auto; }
512
- .smrt-nav-editor__toolbar { position: absolute; inset-block-start: 100%; inset-inline: 0; z-index: 40; display: flex; flex-wrap: wrap; align-items: center; gap: var(--smrt-spacing-1); padding: var(--smrt-spacing-2); border: 1px solid var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-medium); background: var(--smrt-color-surface-container-high); box-shadow: var(--smrt-elevation-2, 0 4px 12px rgb(0 0 0 / 0.2)); }
514
+ .smrt-nav-editor__toolbar { position: absolute; inset-block-start: 100%; inset-inline: 0; z-index: 40; display: flex; flex-wrap: wrap; align-items: center; gap: var(--smrt-spacing-1); padding: var(--smrt-spacing-2); border: var(--smrt-hairline); border-radius: var(--smrt-radius-medium); background: var(--smrt-glass-surface-strong); -webkit-backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation)); backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation)); box-shadow: var(--smrt-elevation-3), var(--smrt-inset-highlight); }
513
515
  :global(.smrt-nav-editor__name) { flex: 1 1 100%; min-inline-size: 0; }
514
- .smrt-nav-editor__row { flex: 1 1 auto; min-inline-size: 0; display: flex; align-items: center; gap: var(--smrt-spacing-2); padding: var(--smrt-spacing-2) var(--smrt-spacing-1); color: var(--smrt-color-on-surface); }
516
+ .smrt-nav-editor__row { flex: 1 1 auto; min-inline-size: 0; display: flex; align-items: center; gap: var(--smrt-spacing-2); box-sizing: border-box; min-block-size: var(--smrt-control-target-min); padding: var(--smrt-spacing-2) var(--smrt-spacing-1); color: var(--smrt-color-on-surface); }
517
+ @media (max-width: 48rem) {
518
+ .smrt-nav-editor { --smrt-control-target-min: var(--smrt-touch-target-min); }
519
+ }
515
520
  .smrt-nav-editor__row--muted { opacity: 0.55; }
516
521
  .smrt-nav-editor__row strong { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--smrt-typography-weight-medium, 500); }
517
522
  /* Keep editor rows inside the sidebar: the implicit grid column would size to
@@ -528,4 +533,5 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
528
533
  .smrt-nav-editor__section-icon { display: inline-flex; margin-inline-end: var(--smrt-spacing-2); vertical-align: middle; }
529
534
  .smrt-nav-editor__icons { flex: 1 1 100%; display: grid; grid-template-columns: repeat(auto-fill, minmax(2rem, 1fr)); gap: var(--smrt-spacing-1); padding-block-start: var(--smrt-spacing-1); }
530
535
  .smrt-nav-editor__icons :global(.smrt-shell-icon-button[aria-pressed='true']) { background: var(--smrt-color-primary-container); color: var(--smrt-color-on-primary-container); }
536
+ }
531
537
  </style>
@@ -18,7 +18,7 @@ interface Props {
18
18
  * picker); their entries are edited on the section's own page with
19
19
  * `ShellSectionMenu`. Default `'items'`.
20
20
  */
21
- navMode?: 'items' | 'sections';
21
+ navMode?: 'items' | 'sections' | 'sections-with-items';
22
22
  }
23
23
  declare const ShellNavEditor: Component<Props, {}, "">;
24
24
  type ShellNavEditor = ReturnType<typeof ShellNavEditor>;
@@ -1 +1 @@
1
- {"version":3,"file":"ShellNavEditor.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellNavEditor.svelte.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAUrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAO3E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG7D,UAAU,KAAK;IACb,oEAAoE;IACpE,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,yEAAyE;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAChC;AA+WD,QAAA,MAAM,cAAc,0BAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ShellNavEditor.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellNavEditor.svelte.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAUrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAO3E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG7D,UAAU,KAAK;IACb,oEAAoE;IACpE,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,yEAAyE;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,qBAAqB,CAAC;CACxD;AA+WD,QAAA,MAAM,cAAc,0BAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -41,7 +41,7 @@ const name = $derived(label ?? t(M['ui.shell_nav_toggle.navigation']));
41
41
  aria-expanded={expanded}
42
42
  aria-controls={controls}
43
43
  data-testid="shell-nav-toggle"
44
- {onclick}
44
+ {onclick} data-smrt-component="ShellNavToggle"
45
45
  >
46
46
  <svg
47
47
  viewBox="0 0 24 24"
@@ -63,6 +63,8 @@ const name = $derived(label ?? t(M['ui.shell_nav_toggle.navigation']));
63
63
  </button>
64
64
 
65
65
  <style>
66
+ @layer smrt.reset, smrt.structure, smrt.theme;
67
+ @layer smrt.theme {
66
68
  .smrt-shell-nav-toggle {
67
69
  display: inline-grid;
68
70
  place-items: center;
@@ -70,19 +72,20 @@ const name = $derived(label ?? t(M['ui.shell_nav_toggle.navigation']));
70
72
  inline-size: 2.75rem;
71
73
  block-size: 2.75rem;
72
74
  border: 0;
73
- border-radius: var(--smrt-radius-md);
75
+ border-radius: var(--smrt-control-radius);
74
76
  background: transparent;
75
77
  color: var(--smrt-color-on-surface-variant);
76
78
  cursor: pointer;
77
79
  }
78
80
 
79
81
  .smrt-shell-nav-toggle:hover {
80
- background: var(--smrt-color-surface-container-high);
82
+ background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent);
81
83
  color: var(--smrt-color-on-surface);
82
84
  }
83
85
 
84
86
  .smrt-shell-nav-toggle:focus-visible {
85
- outline: 2px solid var(--smrt-color-primary);
86
- outline-offset: 2px;
87
+ outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
88
+ outline-offset: var(--smrt-focus-ring-offset);
87
89
  }
90
+ }
88
91
  </style>
@@ -42,7 +42,7 @@ $effect(() => {
42
42
  });
43
43
  </script>
44
44
 
45
- <span class="smrt-shell-section-icon" aria-hidden="true">
45
+ <span class="smrt-shell-section-icon" aria-hidden="true" data-smrt-component="ShellSectionIcon">
46
46
  {#if isShellIconName(name)}
47
47
  <svg viewBox="0 0 24 24" width={size} height={size} fill="currentColor" focusable="false"><path d={SHELL_ICON_PATHS[name]} /></svg>
48
48
  {:else if Host}
@@ -53,5 +53,8 @@ $effect(() => {
53
53
  </span>
54
54
 
55
55
  <style>
56
+ @layer smrt.reset, smrt.structure, smrt.theme;
57
+ @layer smrt.theme {
56
58
  .smrt-shell-section-icon { display: inline-grid; place-items: center; flex: 0 0 auto; }
59
+ }
57
60
  </style>