@happyvertical/smrt-svelte 0.55.16 → 0.55.17

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 +145 -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 +274 -9
  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 +27 -1
  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 +4 -1
  101. package/dist/components/workspace/admin-shell/AdminShell.svelte +502 -72
  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 +21 -8
  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 +4 -1
  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 +4 -1
  113. package/dist/components/workspace/admin-shell/ShellLayoutEditor.svelte +4 -1
  114. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte +13 -7
  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 +4 -1
  118. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte +4 -1
  119. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte +15 -10
  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 +81 -36
  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 +305 -53
  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);
@@ -101,8 +113,8 @@ function accessibleName(item: PhoneBottomBarItem): string {
101
113
  place-items: center;
102
114
  align-content: center;
103
115
  gap: var(--smrt-spacing-1);
104
- min-inline-size: 2.75rem;
105
- min-block-size: 2.75rem;
116
+ min-inline-size: var(--smrt-touch-target-min);
117
+ min-block-size: var(--smrt-touch-target-min);
106
118
  padding: var(--smrt-spacing-1) 0;
107
119
  border: 0;
108
120
  border-radius: var(--smrt-radius-lg);
@@ -167,4 +179,5 @@ function accessibleName(item: PhoneBottomBarItem): string {
167
179
  border-radius: var(--smrt-radius-full);
168
180
  background: var(--smrt-color-primary);
169
181
  }
182
+ }
170
183
  </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;
@@ -91,4 +93,5 @@ const { t } = useI18n();
91
93
  text-overflow: ellipsis;
92
94
  white-space: nowrap;
93
95
  }
96
+ }
94
97
  </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,6 +56,8 @@ 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;
@@ -74,4 +76,5 @@ let {
74
76
  .smrt-shell-icon-button[aria-pressed='true'] { color: var(--smrt-color-on-surface); }
75
77
  .smrt-shell-icon-button:focus-visible { outline: 2px solid var(--smrt-color-primary); outline-offset: 2px; }
76
78
  .smrt-shell-icon-button:disabled { opacity: 0.5; cursor: not-allowed; }
79
+ }
77
80
  </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,6 +246,8 @@ 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; }
@@ -265,4 +267,5 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
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,6 +489,8 @@ 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); }
@@ -511,7 +513,10 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
511
513
  .smrt-nav-editor__overlay { display: inline-flex; align-items: center; flex: 0 0 auto; }
512
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: 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)); }
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;
@@ -85,4 +87,5 @@ const name = $derived(label ?? t(M['ui.shell_nav_toggle.navigation']));
85
87
  outline: 2px solid var(--smrt-color-primary);
86
88
  outline-offset: 2px;
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>
@@ -19,6 +19,7 @@ import Sortable from '../../sortable/Sortable.svelte';
19
19
  import type { SortableItem, SortableItemMove } from '../../sortable/types.js';
20
20
  import { useShellLayout } from './layout-context.js';
21
21
  import type { ShellLayoutController } from './layout-controller.svelte.js';
22
+ import { flipRow } from './motion.js';
22
23
  import ShellIconButton from './ShellIconButton.svelte';
23
24
  import ShellSectionIcon from './ShellSectionIcon.svelte';
24
25
  import { SHELL_DEFAULT_SECTION_ICON, SHELL_ICON_PATHS } from './shell-icons.js';
@@ -130,7 +131,7 @@ function onmove(move: SortableItemMove<SortableItem>): void {
130
131
  class="smrt-section-menu"
131
132
  class:smrt-section-menu--cards={layoutMode === 'cards'}
132
133
  bind:this={rootEl}
133
- data-editing={editing ? '' : undefined}
134
+ data-editing={editing ? '' : undefined} data-smrt-component="ShellSectionMenu"
134
135
  >
135
136
  {#if editing}
136
137
  <Sortable
@@ -203,12 +204,14 @@ function onmove(move: SortableItemMove<SortableItem>): void {
203
204
  {:else if layoutMode === 'cards'}
204
205
  <ul class="smrt-section-menu__cards" aria-label={listLabel}>
205
206
  {#each entries as entry (entry.id)}
206
- <li class="smrt-section-menu__card">
207
+ <li class="smrt-section-menu__card" animate:flipRow>
207
208
  <a class="smrt-section-menu__card-link" href={entry.href} onclick={onNavigate}>
208
- <span class="smrt-section-menu__card-icon">
209
- <ShellSectionIcon name={entry.icon ?? SHELL_DEFAULT_SECTION_ICON} size={32} iconComponent={IconComponent} />
209
+ <span class="smrt-section-menu__card-heading">
210
+ <span class="smrt-section-menu__card-icon">
211
+ <ShellSectionIcon name={entry.icon ?? SHELL_DEFAULT_SECTION_ICON} size={28} iconComponent={IconComponent} />
212
+ </span>
213
+ <span class="smrt-section-menu__card-title">{entry.label}</span>
210
214
  </span>
211
- <span class="smrt-section-menu__card-title">{entry.label}</span>
212
215
  {#if entry.item.description}
213
216
  <span class="smrt-section-menu__desc">{entry.item.description}</span>
214
217
  {/if}
@@ -225,7 +228,7 @@ function onmove(move: SortableItemMove<SortableItem>): void {
225
228
  {:else}
226
229
  <ul class="smrt-section-menu__list" aria-label={listLabel}>
227
230
  {#each entries as entry (entry.id)}
228
- <li class="smrt-section-menu__item">
231
+ <li class="smrt-section-menu__item" animate:flipRow>
229
232
  <a class="smrt-section-menu__link" href={entry.href} onclick={onNavigate}>
230
233
  {#if entry.icon}
231
234
  <ShellSectionIcon name={entry.icon} iconComponent={IconComponent} />
@@ -242,6 +245,8 @@ function onmove(move: SortableItemMove<SortableItem>): void {
242
245
  </div>
243
246
 
244
247
  <style>
248
+ @layer smrt.reset, smrt.structure, smrt.theme;
249
+ @layer smrt.theme {
245
250
  .smrt-section-menu { min-inline-size: 0; }
246
251
  .smrt-section-menu__list { display: grid; gap: var(--smrt-spacing-1); margin: 0; padding: 0; list-style: none; }
247
252
  .smrt-section-menu__item { position: relative; display: flex; align-items: center; gap: var(--smrt-spacing-3); min-inline-size: 0; padding: var(--smrt-spacing-2) var(--smrt-spacing-3); border: 1px solid var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-medium); background: var(--smrt-color-surface); color: var(--smrt-color-on-surface); }
@@ -257,9 +262,7 @@ function onmove(move: SortableItemMove<SortableItem>): void {
257
262
  .smrt-section-menu__chevron { flex: 0 0 auto; color: var(--smrt-color-on-surface-variant); }
258
263
  /* Fixed icon column so labels align whatever the glyph (or a missing one). */
259
264
  .smrt-section-menu :global(.smrt-shell-section-icon) { inline-size: 20px; block-size: 20px; }
260
- /* Cards draw a 32px icon: its box must match, or the glyph spills out of
261
- the centred circle. */
262
- .smrt-section-menu__card-icon :global(.smrt-shell-section-icon) { inline-size: 32px; block-size: 32px; }
265
+ .smrt-section-menu__card-icon :global(.smrt-shell-section-icon) { inline-size: 28px; block-size: 28px; }
263
266
  /* Cards: a responsive grid; the whole card is one stretched link. */
264
267
  .smrt-section-menu__cards, .smrt-section-menu--cards :global(.smrt-sortable__items) { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(16rem, 100%), 1fr)); gap: var(--smrt-spacing-3); margin: 0; padding: 0; list-style: none; }
265
268
  .smrt-section-menu__card { position: relative; display: flex; flex-direction: column; gap: var(--smrt-spacing-3); min-inline-size: 0; padding: var(--smrt-spacing-4); border: 1px solid var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-large, var(--smrt-radius-medium)); background: var(--smrt-color-surface); color: var(--smrt-color-on-surface); transition: background-color 120ms, border-color 120ms, transform 120ms; }
@@ -268,7 +271,8 @@ function onmove(move: SortableItemMove<SortableItem>): void {
268
271
  .smrt-section-menu__card-link::after { content: ''; position: absolute; inset: 0; border-radius: inherit; }
269
272
  .smrt-section-menu__card-link:focus-visible { outline: none; }
270
273
  .smrt-section-menu__card-link:focus-visible::after { outline: 2px solid var(--smrt-color-primary); outline-offset: 2px; }
271
- .smrt-section-menu__card-icon { display: inline-grid; place-items: center; inline-size: 56px; block-size: 56px; border-radius: var(--smrt-radius-full, 9999px); background: var(--smrt-color-primary-container); color: var(--smrt-color-on-primary-container); }
274
+ .smrt-section-menu__card-heading { display: flex; align-items: center; gap: var(--smrt-spacing-2); min-inline-size: 0; }
275
+ .smrt-section-menu__card-icon { display: inline-grid; place-items: center; flex: 0 0 28px; inline-size: 28px; block-size: 28px; color: var(--smrt-color-primary); }
272
276
  .smrt-section-menu__card-title { font-size: var(--smrt-typography-title-medium-size, 1rem); font-weight: var(--smrt-typography-weight-medium, 500); overflow-wrap: anywhere; }
273
277
  .smrt-section-menu__desc { display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-body-medium-size, 0.875rem); }
274
278
  .smrt-section-menu__card-foot { position: relative; z-index: 1; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--smrt-spacing-2); }
@@ -287,4 +291,5 @@ function onmove(move: SortableItemMove<SortableItem>): void {
287
291
  .smrt-section-menu__row--muted { opacity: 0.55; }
288
292
  .smrt-section-menu__row strong { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--smrt-typography-weight-medium, 500); }
289
293
  :global(.smrt-section-menu__name) { flex: 1 1 auto; min-inline-size: 0; }
294
+ }
290
295
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"ShellSectionMenu.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellSectionMenu.svelte.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAKrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAI3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,UAAU,KAAK;IACb,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,aAAa,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,oDAAoD;IACpD,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACxC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAuLD,QAAA,MAAM,gBAAgB,0BAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"ShellSectionMenu.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellSectionMenu.svelte.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAKrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAK3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,UAAU,KAAK;IACb,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,aAAa,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,oDAAoD;IACpD,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACxC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AA0LD,QAAA,MAAM,gBAAgB,0BAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}