@happyvertical/smrt-svelte 0.57.4 → 0.57.6

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.
@@ -182,7 +182,13 @@ Call `destroy()` when the owner unmounts.
182
182
  The core shortcuts widget draws each shortcut with an inline icon/title heading.
183
183
  The icon uses `--smrt-color-primary` from the active theme, matching the
184
184
  `ShellSectionMenu` card layout; descriptions remain below the heading. Hosts
185
- may still provide an icon component for their own glyphs.
185
+ may still provide an icon component for their own glyphs. The heading row is
186
+ the icon and the title alone: the record count is meta, so like
187
+ `ShellSectionMenu`'s card foot it sits on its own muted row at the card's foot
188
+ (#4120). Never put a count or other meta back on a title row — it takes a
189
+ fixed slice of the row and forces the title to wrap. Grid widget headings are
190
+ the same: the title owns its row and wraps rather than truncating; the
191
+ one-line edit-mode chrome label carries the full title as a tooltip.
186
192
 
187
193
  Props in `grid-types.ts`. `editing` defaults to the shell's layout editor
188
194
  (`tryUseShellLayout()?.editing`), so the same pencil edits the grid under an
@@ -181,10 +181,13 @@ in the tooltip, there is no visible `<kbd>`), and off phones it closes the
181
181
  navigation region: it sits at the end of the nav (`margin-block-start: auto`),
182
182
  above the `leftSidebar.footer` slot, never below it. Order top to bottom, expanded
183
183
  and collapsed: nav, chevron, footer (the account menu; the compact avatar last
184
- in the collapsed rail). Expanded it lives inside the sidebar body
185
- (`tenant-stack`) and hugs the inner edge; collapsed it is the middle row of the
186
- rail stack (content, chevron, `tenantRailFooter`) and is centred. Only a rail
187
- with neither nav nor footer content draws it alone at the bottom. Phones replace it with the drawer's
184
+ in the collapsed rail). It sits in the utility row
185
+ (`.smrt-admin-shell__tenant-utilities`, after any `tenantUtilities` icons such
186
+ as the color-scheme toggle). Expanded the row lives inside the sidebar body
187
+ (`tenant-stack`) and the chevron hugs its inner edge; collapsed the row is the
188
+ middle row of the rail stack (content, utilities, `tenantRailFooter`), stacked
189
+ and centred. Only a rail with neither nav, utilities nor footer content draws
190
+ the chevron alone at the bottom. Phones replace it with the drawer's
188
191
  icon-only "Close menu" at the top, so opening the drawer still focuses a close control. The
189
192
  header, footer and right toggles keep their region label and hotkey hint.
190
193
 
@@ -205,7 +208,7 @@ keep them stable), all movable in the layout editor like `item:brand`:
205
208
  | Item | Default slot | Phone | Opt out |
206
209
  | --- | --- | --- | --- |
207
210
  | `item:account` | `leftSidebar.footer` | compact avatar, last in the header band (`header.end`) | `accountMenu={false}`; `accountMenu={{ slot }}` sets the default |
208
- | `item:color-scheme` | `header.end` | icon-only (no label), accessible name kept | `colorSchemeToggle={false}`; `{ slot }` sets the default |
211
+ | `item:color-scheme` | `leftSidebar.footer` (rendered in the sidebar utility row, see below) | icon button in the header band (`header.end`) | `colorSchemeToggle={false}`; `{ slot }` sets the default |
209
212
  | `item:command-palette` | `header.center` | search glyph button | off unless `commandPalette` is passed |
210
213
 
211
214
  `item:account` renders `WorkspaceAccountMenu` only when `user` is set (nothing
@@ -218,8 +221,18 @@ it shows the full identity (menu opens upward); everywhere else, and in the
218
221
  collapsed rail, it is the compact avatar. In the collapsed rail `AppShell`
219
222
  passes it as `tenantRailFooter` (outside the rail's scroll clip; the menu opens
220
223
  to the inline end over the workspace) instead of letting the footer slot fall
221
- back to another region. `item:color-scheme` reuses `ColorSchemeToggle` from
222
- `@happyvertical/smrt-ui/themes` (no second switcher). `item:command-palette`
224
+ back to another region. `item:color-scheme` is `ShellColorSchemeToggle`
225
+ (`src/components/app/`): an icon-only `ShellIconButton` over the
226
+ `ThemeProvider` context (no second scheme store), named "Dark mode" with
227
+ `aria-pressed`, showing the mode a press switches to (moon in light, sun in
228
+ dark: `darkMode` / `lightMode` in the shell icon set) with a "Switch to dark
229
+ mode" / "Switch to light mode" tooltip. Left in `leftSidebar.footer` on desktop
230
+ it renders in `AdminShell`'s `tenantUtilities` row (#4107): toggle first, the
231
+ collapse chevron at the inner edge, at the end of the nav region above the
232
+ account; in the collapsed rail the row stacks (toggle, chevron) above the
233
+ compact avatar. It never falls back to the header or footer while the left
234
+ edge is shown; in edit mode it is an ordinary movable item in the footer drop
235
+ zone. Will's standing default: never a labelled Light/Dark pill in the header. `item:command-palette`
223
236
  mounts the existing `CommandPalette` (`commandPalette: { providers, placeholder? }`,
224
237
  types `AppShellCommandPalette`/`AppShellAccountMenu` from `./app`): it owns the
225
238
  dialog and the global shortcut, so it mounts once. Planner-style hosts that
@@ -1,7 +1,6 @@
1
1
  <script lang="ts">
2
2
  import {
3
3
  type ColorScheme,
4
- ColorSchemeToggle,
5
4
  type ContrastPreference,
6
5
  type ThemeConfig,
7
6
  type ThemePreset,
@@ -72,6 +71,7 @@ import {
72
71
  resolvePhoneTabBar,
73
72
  } from './phone-tabs.js';
74
73
  import RuntimeDiagnosticsWebMcp from './RuntimeDiagnosticsWebMcp.svelte';
74
+ import ShellColorSchemeToggle from './ShellColorSchemeToggle.svelte';
75
75
  import type { ShellUser } from './shell-user.js';
76
76
  import type {
77
77
  AppShellAccountMenu,
@@ -128,10 +128,13 @@ interface Props {
128
128
  */
129
129
  signOutHref?: string;
130
130
  /**
131
- * The theme switcher (`ColorSchemeToggle` from `smrt-ui/themes`) as the
132
- * built-in item `item:color-scheme`, default slot `header.end`. On by
133
- * default; `false` opts out, `{ slot }` sets the default slot. Icon-only on
134
- * phones.
131
+ * The light/dark switch as the built-in item `item:color-scheme`: an
132
+ * icon-only toggle (moon or sun, "Dark mode" with `aria-pressed`). Default
133
+ * slot `leftSidebar.footer`, where it renders in the sidebar's utility row
134
+ * beside the collapse chevron, above the account menu, and stays a compact
135
+ * icon in the collapsed rail; on phones it defaults to `header.end`. On by
136
+ * default; `false` opts out, `{ slot }` sets the default slot (users can
137
+ * still move it in the layout editor).
135
138
  */
136
139
  colorSchemeToggle?: boolean | { slot?: ShellSlot };
137
140
  /**
@@ -405,7 +408,8 @@ const entries = $derived.by(() => {
405
408
  slot:
406
409
  (typeof colorSchemeToggle === 'object'
407
410
  ? colorSchemeToggle.slot
408
- : undefined) ?? 'header.end',
411
+ : undefined) ??
412
+ (shell.viewport === 'phone' ? 'header.end' : 'leftSidebar.footer'),
409
413
  render: colorSchemeItem,
410
414
  });
411
415
  }
@@ -477,7 +481,10 @@ const slotIds = $derived(resolveShellPlacements(entries, effectiveLayout));
477
481
  const entriesFor = (name: ShellSlot): PlacedEntry[] => {
478
482
  const byId = new Map(entries.map((entry) => [entry.id, entry]));
479
483
  return slotIds[name].flatMap((id) =>
480
- id === SHELL_ACCOUNT_ITEM_ID && accountInRail ? [] : (byId.get(id) ?? []),
484
+ (id === SHELL_ACCOUNT_ITEM_ID && accountInRail) ||
485
+ (id === SHELL_COLOR_SCHEME_ITEM_ID && colorSchemeInSidebar)
486
+ ? []
487
+ : (byId.get(id) ?? []),
481
488
  );
482
489
  };
483
490
  const slotSnippets: Record<ShellSlot, Snippet> = {
@@ -561,6 +568,17 @@ const accountInRail = $derived(
561
568
  shell.isEdgeShown('left') &&
562
569
  shell.panels.left === 'collapsed',
563
570
  );
571
+ // ---- Color scheme ------------------------------------------------------
572
+ // Placed in the left sidebar footer (the default) on desktop, the toggle
573
+ // renders in the sidebar's utility row beside the chevron, expanded or as
574
+ // the rail, rather than in the footer slot or a fallback region. While the
575
+ // layout is edited it stays a movable item in the footer drop zone.
576
+ const colorSchemeInSidebar = $derived(
577
+ slotIds['leftSidebar.footer'].includes(SHELL_COLOR_SCHEME_ITEM_ID) &&
578
+ !editing &&
579
+ shell.viewport !== 'phone' &&
580
+ shell.isEdgeShown('left'),
581
+ );
564
582
  // Full identity only inside an expanded sidebar; everywhere else the avatar.
565
583
  const accountCompact = $derived.by(() => {
566
584
  if (shell.viewport === 'phone' || !accountSlot) return true;
@@ -918,13 +936,7 @@ const EDGE_OF_REGION: Record<ShellRegion, PanelEdge> = {
918
936
  {/snippet}
919
937
 
920
938
  {#snippet colorSchemeItem()}
921
- <span class="smrt-app-shell-color-scheme">
922
- <ColorSchemeToggle
923
- variant="switch"
924
- showLabels={shell.viewport !== 'phone'}
925
- ariaLabel={t(M['ui.app_shell.color_scheme_toggle'])}
926
- />
927
- </span>
939
+ <ShellColorSchemeToggle />
928
940
  {/snippet}
929
941
 
930
942
  {#snippet commandPaletteItem()}
@@ -1011,6 +1023,7 @@ const EDGE_OF_REGION: Record<ShellRegion, PanelEdge> = {
1011
1023
  phoneDockOpener={dockToggles.length === 0 && !tabBarOn}
1012
1024
  phoneBottomBar={tabBarOn ? phoneTabs : undefined}
1013
1025
  tenantRailFooter={accountInRail ? railAccount : undefined}
1026
+ tenantUtilities={colorSchemeInSidebar ? colorSchemeItem : undefined}
1014
1027
  bind:rootElement={shellRoot}
1015
1028
  {floatingReserve}
1016
1029
  >
@@ -1092,8 +1105,6 @@ const EDGE_OF_REGION: Record<ShellRegion, PanelEdge> = {
1092
1105
  .smrt-layout-toggle--floating { position: fixed; z-index: 45; inset-block-start: max(var(--smrt-spacing-3), env(safe-area-inset-top)); inset-inline-end: max(var(--smrt-spacing-3), env(safe-area-inset-right)); border: var(--smrt-hairline); border-radius: var(--smrt-radius-full); background: var(--smrt-surface-raised); box-shadow: var(--smrt-elevation-3), var(--smrt-inset-highlight); }
1093
1106
  .smrt-layout-toggle--floating :global(.smrt-shell-icon-button) { border-radius: var(--smrt-radius-full); }
1094
1107
  .smrt-layout-toggle :global(.smrt-shell-icon-button[aria-pressed='true']) { background: var(--smrt-color-primary-container); color: var(--smrt-color-on-primary-container); }
1095
- .smrt-app-shell-color-scheme { display: inline-flex; align-items: center; }
1096
- .smrt-app-shell-color-scheme :global(.smrt-color-scheme-toggle__switch) { min-block-size: var(--smrt-control-target-min); }
1097
1108
  .smrt-app-shell-palette { display: inline-flex; min-inline-size: 0; }
1098
1109
  .smrt-app-shell-palette[data-search] :global(.smrt-command-palette-trigger) { inline-size: min(28rem, 40vw); justify-content: flex-start; border: var(--smrt-hairline-strong); border-radius: var(--smrt-radius-full); background: var(--smrt-surface-control); color: var(--smrt-color-on-surface-variant); }
1099
1110
  .smrt-app-shell-palette[data-search] :global(.smrt-command-palette-trigger__hint) { margin-inline-start: auto; }
@@ -60,10 +60,13 @@ interface Props {
60
60
  */
61
61
  signOutHref?: string;
62
62
  /**
63
- * The theme switcher (`ColorSchemeToggle` from `smrt-ui/themes`) as the
64
- * built-in item `item:color-scheme`, default slot `header.end`. On by
65
- * default; `false` opts out, `{ slot }` sets the default slot. Icon-only on
66
- * phones.
63
+ * The light/dark switch as the built-in item `item:color-scheme`: an
64
+ * icon-only toggle (moon or sun, "Dark mode" with `aria-pressed`). Default
65
+ * slot `leftSidebar.footer`, where it renders in the sidebar's utility row
66
+ * beside the collapse chevron, above the account menu, and stays a compact
67
+ * icon in the collapsed rail; on phones it defaults to `header.end`. On by
68
+ * default; `false` opts out, `{ slot }` sets the default slot (users can
69
+ * still move it in the layout editor).
67
70
  */
68
71
  colorSchemeToggle?: boolean | {
69
72
  slot?: ShellSlot;
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/app/AppShell.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AppShell.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/app/AppShell.svelte.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ /**
3
+ * The shell's light/dark switch (`AppShell` item `item:color-scheme`): an
4
+ * icon-only toggle button. Its name stays "Dark mode" with `aria-pressed`
5
+ * carrying the state; the icon and tooltip show the mode a press switches
6
+ * to (moon in light mode, sun in dark mode), as the chevron shows where the
7
+ * sidebar will move. Needs the `ThemeProvider` that `AppShell` mounts.
8
+ */
9
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
10
+ import { getThemeContext } from '@happyvertical/smrt-ui/themes';
11
+ import { M } from '../../i18n/strings.workspace.js';
12
+ import ShellIconButton from '../workspace/admin-shell/ShellIconButton.svelte';
13
+
14
+ const theme = getThemeContext();
15
+ const { t } = useI18n();
16
+ const dark = $derived(theme.state.isDark);
17
+ </script>
18
+
19
+ <span class="smrt-app-shell-color-scheme" data-smrt-component="ShellColorSchemeToggle">
20
+ <ShellIconButton
21
+ icon={dark ? 'lightMode' : 'darkMode'}
22
+ label={t(M['ui.app_shell.color_scheme_dark'])}
23
+ pressed={dark}
24
+ tooltip={t(
25
+ dark
26
+ ? M['ui.app_shell.color_scheme_to_light']
27
+ : M['ui.app_shell.color_scheme_to_dark'],
28
+ )}
29
+ onclick={() => theme.toggleColorScheme()}
30
+ />
31
+ </span>
32
+
33
+ <style>
34
+ @layer smrt.reset, smrt.structure, smrt.theme;
35
+ @layer smrt.theme {
36
+ .smrt-app-shell-color-scheme { display: inline-flex; align-items: center; }
37
+ }
38
+ </style>
@@ -0,0 +1,4 @@
1
+ declare const ShellColorSchemeToggle: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type ShellColorSchemeToggle = ReturnType<typeof ShellColorSchemeToggle>;
3
+ export default ShellColorSchemeToggle;
4
+ //# sourceMappingURL=ShellColorSchemeToggle.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellColorSchemeToggle.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/app/ShellColorSchemeToggle.svelte.ts"],"names":[],"mappings":"AAuCA,QAAA,MAAM,sBAAsB,2DAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
@@ -454,7 +454,8 @@ const headingTag = $derived(`h${headingLevel}`);
454
454
  ondragstart={(event) => sortable.dragStart(event, row.widget.id)}
455
455
  ondragend={() => sortable.dragEnd()}
456
456
  ><span aria-hidden="true">⠿</span></button>
457
- <span class="smrt-overview__chrome-title" aria-hidden="true">{row.title}</span>
457
+ <!-- Truncated to one line beside the controls; the tooltip carries the full title. -->
458
+ <span class="smrt-overview__chrome-title" aria-hidden="true" title={row.title}>{row.title}</span>
458
459
  {#if row.def && row.def.options.length > 0}
459
460
  <ShellIconButton
460
461
  icon="settings"
@@ -561,7 +562,7 @@ const headingTag = $derived(`h${headingLevel}`);
561
562
  [data-presentation='plain']:not([data-editing]) .smrt-overview__tile { padding: 0; border: 0; border-radius: 0; background: transparent; }
562
563
  [data-editing] .smrt-overview__tile { border-style: dashed; }
563
564
  .smrt-overview__widget { display: grid; gap: var(--smrt-spacing-2); align-content: start; min-inline-size: 0; }
564
- .smrt-overview__title { margin: 0; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-title-small-size, 0.875rem); font-weight: var(--smrt-typography-weight-medium, 500); }
565
+ .smrt-overview__title { margin: 0; overflow-wrap: break-word; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-title-small-size, 0.875rem); font-weight: var(--smrt-typography-weight-medium, 500); }
565
566
  .smrt-overview__state { margin: 0; color: var(--smrt-color-on-surface-variant); }
566
567
  .smrt-overview__chrome { display: flex; align-items: center; gap: var(--smrt-spacing-1); margin-block-end: var(--smrt-spacing-2); }
567
568
  .smrt-overview__chrome-title { flex: 1 1 auto; min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-label-large-size, 0.875rem); }
@@ -1 +1 @@
1
- {"version":3,"file":"OverviewGrid.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/overview/OverviewGrid.svelte.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAgczD,QAAA,MAAM,YAAY,uDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"OverviewGrid.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/overview/OverviewGrid.svelte.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAiczD,QAAA,MAAM,YAAY,uDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -3,7 +3,9 @@
3
3
  * Shortcuts widget (#3727): the section-overview cards as a widget. It draws
4
4
  * the cards a loader produced (see `shortcutsFromNav`), with the same look as
5
5
  * `ShellSectionMenu layout="cards"`, so a section's default overview is just
6
- * this widget.
6
+ * this widget. As there, the heading row is the icon and the title alone; the
7
+ * record count is meta, so it sits in the card's foot under the description
8
+ * rather than taking a slice of the title's row (#4120).
7
9
  */
8
10
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
9
11
  import { M } from '../../../i18n/strings.overview.js';
@@ -83,9 +85,12 @@ const cards = $derived.by((): Card[] => {
83
85
  <ShellSectionIcon name={card.icon} size={28} {iconComponent} />
84
86
  </span>
85
87
  <span class="smrt-shortcuts__title">{card.label}</span>
86
- {#if card.count !== undefined}<span class="smrt-shortcuts__count">{countLabel(card.count)}</span>{/if}
87
88
  </span>
88
- {#if card.description}<span class="smrt-shortcuts__desc">{card.description}</span>{/if}
89
+ <!-- Clamped to two lines; the tooltip carries the rest. -->
90
+ {#if card.description}<span class="smrt-shortcuts__desc" title={card.description}>{card.description}</span>{/if}
91
+ {#if card.count !== undefined}
92
+ <span class="smrt-shortcuts__foot"><span class="smrt-shortcuts__count">{countLabel(card.count)}</span></span>
93
+ {/if}
89
94
  </a>
90
95
  </li>
91
96
  {/each}
@@ -103,9 +108,10 @@ const cards = $derived.by((): Card[] => {
103
108
  .smrt-shortcuts__heading { display: flex; align-items: center; gap: var(--smrt-spacing-2); min-inline-size: 0; }
104
109
  .smrt-shortcuts__icon { display: inline-grid; place-items: center; flex: 0 0 28px; inline-size: 28px; block-size: 28px; color: var(--smrt-color-primary); }
105
110
  .smrt-shortcuts__icon :global(.smrt-shell-section-icon) { inline-size: 28px; block-size: 28px; }
106
- .smrt-shortcuts__title { font-weight: var(--smrt-typography-weight-medium, 500); overflow-wrap: anywhere; }
111
+ .smrt-shortcuts__title { flex: 1 1 auto; min-inline-size: 0; font-weight: var(--smrt-typography-weight-medium, 500); overflow-wrap: break-word; }
107
112
  .smrt-shortcuts__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); }
108
- .smrt-shortcuts__count { margin-inline-start: auto; flex: 0 0 auto; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-label-large-size, 0.75rem); font-variant-numeric: tabular-nums; white-space: nowrap; }
113
+ .smrt-shortcuts__foot { display: flex; flex-wrap: wrap; align-items: center; gap: var(--smrt-spacing-2); margin-block-start: auto; }
114
+ .smrt-shortcuts__count { color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-body-small-size, 0.75rem); font-variant-numeric: tabular-nums; }
109
115
  /* Plain: entries sit directly on the panel, no frame per entry. */
110
116
  .smrt-shortcuts[data-presentation='plain'] { gap: var(--smrt-spacing-1); }
111
117
  .smrt-shortcuts[data-presentation='plain'] .smrt-shortcuts__card { border: 0; border-radius: var(--smrt-radius-medium); background: transparent; }
@@ -1 +1 @@
1
- {"version":3,"file":"ShortcutsWidget.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/overview/widgets/ShortcutsWidget.svelte.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAY,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AA+F/D,QAAA,MAAM,eAAe,+EAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ShortcutsWidget.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/overview/widgets/ShortcutsWidget.svelte.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAY,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAkG/D,QAAA,MAAM,eAAe,+EAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -100,6 +100,14 @@ function buildLayoutStyle(shell: ModuleShellState): string {
100
100
  tenantRail?: Snippet;
101
101
  /** Content pinned below the collapsed tenant rail. */
102
102
  tenantRailFooter?: Snippet;
103
+ /**
104
+ * Icon controls in the left sidebar's utility row: with the collapse
105
+ * chevron at the end of the nav region, above the sidebar footer, in the
106
+ * expanded sidebar (start of the row; the chevron keeps the inner edge)
107
+ * and in the collapsed rail (stacked above the chevron). Desktop only;
108
+ * `AppShell` puts its color-scheme item here.
109
+ */
110
+ tenantUtilities?: Snippet;
103
111
  /** Content for the left tenant panel. */
104
112
  tenantPanel?: Snippet;
105
113
  /**
@@ -213,6 +221,7 @@ function buildLayoutStyle(shell: ModuleShellState): string {
213
221
  appPanel,
214
222
  tenantRail,
215
223
  tenantRailFooter,
224
+ tenantUtilities,
216
225
  tenantPanel,
217
226
  tenantFooter,
218
227
  slots,
@@ -1123,6 +1132,15 @@ function buildLayoutStyle(shell: ModuleShellState): string {
1123
1132
  {/if}
1124
1133
  {/snippet}
1125
1134
 
1135
+ <!-- The left sidebar's utility row: host icon controls (the color scheme)
1136
+ then the chevron, closing the nav region above the footer slot. -->
1137
+ {#snippet tenantUtilityRow()}
1138
+ <div class="smrt-admin-shell__tenant-utilities" data-smrt-part="utilities">
1139
+ {#if tenantUtilities}{@render tenantUtilities()}{/if}
1140
+ {#if showToggle('left')}{@render edgeToggle('left')}{/if}
1141
+ </div>
1142
+ {/snippet}
1143
+
1126
1144
  {#snippet menuOpener()}
1127
1145
  <!-- raw-primitive-allow: shell chrome control, not a content button -->
1128
1146
  <button
@@ -1383,7 +1401,7 @@ function buildLayoutStyle(shell: ModuleShellState): string {
1383
1401
  {@render tenantRail()}
1384
1402
  {/if}
1385
1403
  </div>
1386
- {#if showToggle('left') && !isPhone && shownOpen('left')}{@render edgeToggle('left')}{/if}
1404
+ {#if shownOpen('left') && !isPhone && (tenantUtilities || showToggle('left'))}{@render tenantUtilityRow()}{/if}
1387
1405
  {#if tenantFooter && !footerInHeader}
1388
1406
  <div class="smrt-admin-shell__tenant-footer">
1389
1407
  {@render tenantFooter()}
@@ -1392,12 +1410,12 @@ function buildLayoutStyle(shell: ModuleShellState): string {
1392
1410
  {@render slotGroup('leftSidebar.footer')}
1393
1411
  </div>
1394
1412
  {/if}
1395
- {#if !shownOpen('left') && (tenantRail || tenantRailFooter)}
1413
+ {#if !shownOpen('left') && (tenantRail || tenantRailFooter || tenantUtilities)}
1396
1414
  <div class="smrt-admin-shell__tenant-rail-stack">
1397
1415
  <div class="smrt-admin-shell__tenant-rail-content">
1398
1416
  {#if tenantRail}{@render tenantRail()}{/if}
1399
1417
  </div>
1400
- {#if showToggle('left') && !isPhone}{@render edgeToggle('left')}{/if}
1418
+ {#if !isPhone && (tenantUtilities || showToggle('left'))}{@render tenantUtilityRow()}{/if}
1401
1419
  {#if tenantRailFooter}
1402
1420
  <div class="smrt-admin-shell__tenant-rail-footer">
1403
1421
  {@render tenantRailFooter()}
@@ -1408,7 +1426,7 @@ function buildLayoutStyle(shell: ModuleShellState): string {
1408
1426
  <!-- The chevron closes the nav region, above the footer slot: inside
1409
1427
  the expanded stack or the collapsed rail stack. Only when neither
1410
1428
  is rendered does it stand alone at the bottom of the rail. -->
1411
- {#if showToggle('left') && !isPhone && !shownOpen('left') && !(tenantRail || tenantRailFooter)}{@render edgeToggle('left')}{/if}
1429
+ {#if showToggle('left') && !isPhone && !shownOpen('left') && !(tenantRail || tenantRailFooter || tenantUtilities)}{@render edgeToggle('left')}{/if}
1412
1430
  </div>
1413
1431
  </aside>
1414
1432
  {/if}
@@ -2302,6 +2320,18 @@ function buildLayoutStyle(shell: ModuleShellState): string {
2302
2320
  `margin-block-start: auto` pins it to the end of the nav region even when
2303
2321
  nothing above it grows. Expanded it hugs the inner edge and points left;
2304
2322
  collapsed it is centred in the narrow rail and points right. */
2323
+ .smrt-admin-shell__tenant-utilities {
2324
+ display: flex;
2325
+ flex: 0 0 auto;
2326
+ align-items: center;
2327
+ gap: var(--smrt-spacing-1);
2328
+ min-width: 0;
2329
+ margin-block-start: auto;
2330
+ }
2331
+ .smrt-admin-shell__edge--left[data-state='collapsed'] .smrt-admin-shell__tenant-utilities {
2332
+ flex-direction: column;
2333
+ grid-row: 2;
2334
+ }
2305
2335
  .smrt-admin-shell__edge--left :global(.smrt-admin-shell__edge-toggle--left) {
2306
2336
  flex: 0 0 auto;
2307
2337
  margin-block-start: auto;
@@ -2319,6 +2349,16 @@ function buildLayoutStyle(shell: ModuleShellState): string {
2319
2349
  .smrt-admin-shell__tenant-rail-stack > :global(.smrt-admin-shell__edge-toggle--left) {
2320
2350
  grid-row: 2;
2321
2351
  }
2352
+ /* In the row the chevron keeps the inner edge (expanded) or the centre
2353
+ (rail); the row itself is what is pinned to the end of the nav region. */
2354
+ .smrt-admin-shell__tenant-utilities > :global(.smrt-admin-shell__edge-toggle--left) {
2355
+ align-self: center;
2356
+ margin-block-start: 0;
2357
+ margin-inline-start: auto;
2358
+ }
2359
+ .smrt-admin-shell__edge--left[data-state='collapsed'] .smrt-admin-shell__tenant-utilities > :global(.smrt-admin-shell__edge-toggle--left) {
2360
+ margin-inline-start: 0;
2361
+ }
2322
2362
  .smrt-admin-shell__edge--left[data-state='expanded'] :global(.smrt-admin-shell__edge-toggle-chevron) {
2323
2363
  transform: scaleX(-1);
2324
2364
  }
@@ -16,6 +16,14 @@ interface Props extends AdminShellProps {
16
16
  tenantRail?: Snippet;
17
17
  /** Content pinned below the collapsed tenant rail. */
18
18
  tenantRailFooter?: Snippet;
19
+ /**
20
+ * Icon controls in the left sidebar's utility row: with the collapse
21
+ * chevron at the end of the nav region, above the sidebar footer, in the
22
+ * expanded sidebar (start of the row; the chevron keeps the inner edge)
23
+ * and in the collapsed rail (stacked above the chevron). Desktop only;
24
+ * `AppShell` puts its color-scheme item here.
25
+ */
26
+ tenantUtilities?: Snippet;
19
27
  /** Content for the left tenant panel. */
20
28
  tenantPanel?: Snippet;
21
29
  /**
@@ -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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"}
@@ -37,6 +37,10 @@ export declare const SHELL_ICON_PATHS: {
37
37
  readonly chevronRight: "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z";
38
38
  readonly menu: "M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z";
39
39
  readonly chat: "M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z";
40
+ /** Material `light_mode`: the sun the color-scheme toggle shows in dark mode. */
41
+ readonly lightMode: "M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41l-1.06-1.06zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z";
42
+ /** Material `dark_mode`: the moon the color-scheme toggle shows in light mode. */
43
+ readonly darkMode: "M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1z";
40
44
  readonly close: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z";
41
45
  };
42
46
  export type ShellIconName = keyof typeof SHELL_ICON_PATHS;
@@ -1 +1 @@
1
- {"version":3,"file":"shell-icons.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/shell-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDnB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAE1D,sEAAsE;AACtE,eAAO,MAAM,uBAAuB,EAAE,aAAwB,CAAC;AAE/D,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,EAAE,aAAwB,CAAC;AAElE,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,EAAE,aAA6B,CAAC;AAEnE,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,EAAE,SAAS,aAAa,EAqBvD,CAAC;AAEF,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,aAAa,CAEnE"}
1
+ {"version":3,"file":"shell-icons.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/shell-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoD3B,iFAAiF;;IAGjF,kFAAkF;;;CAK1E,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAE1D,sEAAsE;AACtE,eAAO,MAAM,uBAAuB,EAAE,aAAwB,CAAC;AAE/D,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,EAAE,aAAwB,CAAC;AAElE,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,EAAE,aAA6B,CAAC;AAEnE,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,EAAE,SAAS,aAAa,EAqBvD,CAAC;AAEF,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,aAAa,CAEnE"}
@@ -37,6 +37,10 @@ export const SHELL_ICON_PATHS = {
37
37
  chevronRight: 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z',
38
38
  menu: 'M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z',
39
39
  chat: 'M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z',
40
+ /** Material `light_mode`: the sun the color-scheme toggle shows in dark mode. */
41
+ lightMode: 'M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41l-1.06-1.06zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z',
42
+ /** Material `dark_mode`: the moon the color-scheme toggle shows in light mode. */
43
+ darkMode: 'M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1z',
40
44
  close: 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z',
41
45
  };
42
46
  /** Icon used for a dock or focus tool that does not bring its own. */
@@ -213,7 +213,9 @@ export declare const M: {
213
213
  readonly 'ui.phone_tab_bar.more': "ui.phone_tab_bar.more";
214
214
  readonly 'ui.app_shell.account_item': "ui.app_shell.account_item";
215
215
  readonly 'ui.app_shell.color_scheme_item': "ui.app_shell.color_scheme_item";
216
- readonly 'ui.app_shell.color_scheme_toggle': "ui.app_shell.color_scheme_toggle";
216
+ readonly 'ui.app_shell.color_scheme_dark': "ui.app_shell.color_scheme_dark";
217
+ readonly 'ui.app_shell.color_scheme_to_dark': "ui.app_shell.color_scheme_to_dark";
218
+ readonly 'ui.app_shell.color_scheme_to_light': "ui.app_shell.color_scheme_to_light";
217
219
  readonly 'ui.app_shell.command_palette_item': "ui.app_shell.command_palette_item";
218
220
  readonly 'ui.app_shell.account_settings': "ui.app_shell.account_settings";
219
221
  readonly 'ui.dock_toggles.set_up': "ui.dock_toggles.set_up";
@@ -1 +1 @@
1
- {"version":3,"file":"strings.workspace.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkPZ,CAAC"}
1
+ {"version":3,"file":"strings.workspace.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoPZ,CAAC"}
@@ -224,7 +224,9 @@ export const M = defineMessages({
224
224
  // components/app/AppShell built-in header and account items (issue #3853)
225
225
  'ui.app_shell.account_item': 'Account menu',
226
226
  'ui.app_shell.color_scheme_item': 'Color scheme',
227
- 'ui.app_shell.color_scheme_toggle': 'Toggle color scheme',
227
+ 'ui.app_shell.color_scheme_dark': 'Dark mode',
228
+ 'ui.app_shell.color_scheme_to_dark': 'Switch to dark mode',
229
+ 'ui.app_shell.color_scheme_to_light': 'Switch to light mode',
228
230
  'ui.app_shell.command_palette_item': 'Search',
229
231
  'ui.app_shell.account_settings': 'Settings',
230
232
  // components/app/DockToggles not-ready state (issue #3860)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-svelte",
3
- "version": "0.57.4",
3
+ "version": "0.57.6",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Svelte 5 components for SMRT user management - auth, users, tenants, roles, permissions, groups",
6
6
  "type": "module",
@@ -209,12 +209,12 @@
209
209
  "access": "public"
210
210
  },
211
211
  "dependencies": {
212
- "@happyvertical/logger": "^0.105.1",
213
- "@happyvertical/smrt-languages": "0.57.4",
214
- "@happyvertical/smrt-mcp-apps": "0.57.4",
215
- "@happyvertical/smrt-types": "0.57.4",
216
- "@happyvertical/smrt-ui": "0.57.4",
217
- "@happyvertical/smrt-web": "0.57.4",
212
+ "@happyvertical/logger": "^0.105.2",
213
+ "@happyvertical/smrt-languages": "0.57.6",
214
+ "@happyvertical/smrt-mcp-apps": "0.57.6",
215
+ "@happyvertical/smrt-types": "0.57.6",
216
+ "@happyvertical/smrt-ui": "0.57.6",
217
+ "@happyvertical/smrt-web": "0.57.6",
218
218
  "@tanstack/db": "^0.6.14",
219
219
  "@tanstack/svelte-db": "^0.1.91",
220
220
  "esm-env": "^1.2.2"
@@ -249,15 +249,15 @@
249
249
  }
250
250
  },
251
251
  "devDependencies": {
252
- "@happyvertical/smrt-agents": "0.57.4",
253
- "@happyvertical/smrt-chat": "0.57.4",
254
- "@happyvertical/smrt-content": "0.57.4",
255
- "@happyvertical/smrt-core": "0.57.4",
256
- "@happyvertical/smrt-reports": "0.57.4",
257
- "@happyvertical/smrt-scanner": "0.57.4",
258
- "@happyvertical/smrt-tenancy": "0.57.4",
259
- "@happyvertical/smrt-users": "0.57.4",
260
- "@happyvertical/speech": "^0.105.1",
252
+ "@happyvertical/smrt-agents": "0.57.6",
253
+ "@happyvertical/smrt-chat": "0.57.6",
254
+ "@happyvertical/smrt-content": "0.57.6",
255
+ "@happyvertical/smrt-core": "0.57.6",
256
+ "@happyvertical/smrt-reports": "0.57.6",
257
+ "@happyvertical/smrt-scanner": "0.57.6",
258
+ "@happyvertical/smrt-tenancy": "0.57.6",
259
+ "@happyvertical/smrt-users": "0.57.6",
260
+ "@happyvertical/speech": "^0.105.2",
261
261
  "@sveltejs/package": "^2.5.8",
262
262
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
263
263
  "@testing-library/jest-dom": "^7.0.1",