smoodly 0.0.24 → 0.0.26
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.
- package/README.md +214 -40
- package/bin/smoodly.js +6 -0
- package/dist/admin/client-ops.js +1 -0
- package/dist/admin/editor/EditorView.js +100 -22
- package/dist/admin/editor/InsertPicker.d.ts +14 -0
- package/dist/admin/editor/InsertPicker.js +37 -7
- package/dist/admin/editor/InspectorFields.js +1 -1
- package/dist/admin/editor/Outline.js +2 -2
- package/dist/admin/editor/PageSettings.js +1 -1
- package/dist/admin/editor/SeoSettings.js +1 -1
- package/dist/admin/editor/autosave.d.ts +4 -1
- package/dist/admin/editor/autosave.js +24 -1
- package/dist/admin/editor/global-edit.d.ts +5 -1
- package/dist/admin/editor/global-edit.js +15 -5
- package/dist/admin/editor/locale-url.d.ts +7 -4
- package/dist/admin/editor/locale-url.js +14 -7
- package/dist/admin/editor/useGlobalEdit.d.ts +1 -1
- package/dist/admin/editor/useGlobalEdit.js +1 -1
- package/dist/admin/editor/usePageLocale.js +9 -1
- package/dist/admin/forms/CropEditor.d.ts +4 -2
- package/dist/admin/forms/CropEditor.js +6 -3
- package/dist/admin/forms/DatePicker.d.ts +9 -0
- package/dist/admin/forms/DatePicker.js +133 -0
- package/dist/admin/forms/FieldWidget.js +11 -5
- package/dist/admin/forms/ImagePreview.d.ts +9 -0
- package/dist/admin/forms/ImagePreview.js +11 -0
- package/dist/admin/forms/MediaWidget.d.ts +8 -2
- package/dist/admin/forms/MediaWidget.js +13 -13
- package/dist/admin/forms/RichtextElementCard.js +1 -1
- package/dist/admin/forms/RichtextImageCard.js +14 -9
- package/dist/admin/forms/date-picker.d.ts +44 -0
- package/dist/admin/forms/date-picker.js +117 -0
- package/dist/admin/forms/elements-context.d.ts +3 -0
- package/dist/admin/forms/elements-context.js +7 -2
- package/dist/admin/forms/time-zone-context.d.ts +7 -0
- package/dist/admin/forms/time-zone-context.js +15 -0
- package/dist/admin/forms/useRichtextEditor.js +10 -1
- package/dist/admin/next/bridge.d.ts +2 -1
- package/dist/admin/next/bridge.js +35 -5
- package/dist/admin/next/create-admin.d.ts +4 -0
- package/dist/admin/next/create-admin.js +3 -1
- package/dist/admin/next/index.d.ts +1 -0
- package/dist/admin/ops-impl.js +74 -24
- package/dist/admin/ops.d.ts +31 -12
- package/dist/admin/serialize.d.ts +2 -0
- package/dist/admin/serialize.js +1 -0
- package/dist/admin/shell/AdminApp.d.ts +3 -1
- package/dist/admin/shell/AdminApp.js +42 -2
- package/dist/admin/shell/EntriesList.js +17 -22
- package/dist/admin/shell/EntryForm.js +91 -13
- package/dist/admin/shell/GlobalForm.js +68 -9
- package/dist/admin/shell/GlobalList.js +10 -20
- package/dist/admin/shell/IconRail.js +14 -5
- package/dist/admin/shell/InviteModal.js +9 -5
- package/dist/admin/shell/ListView.js +2 -2
- package/dist/admin/shell/MediaScreen.js +11 -1
- package/dist/admin/shell/MembersPage.js +33 -15
- package/dist/admin/shell/PageDialogs.d.ts +26 -0
- package/dist/admin/shell/PageDialogs.js +38 -0
- package/dist/admin/shell/PagesList.js +101 -74
- package/dist/admin/shell/RouteLink.js +1 -1
- package/dist/admin/shell/SchemaNotice.d.ts +4 -0
- package/dist/admin/shell/SchemaNotice.js +4 -0
- package/dist/admin/shell/SettingsView.js +11 -26
- package/dist/admin/shell/live-url.d.ts +4 -3
- package/dist/admin/shell/live-url.js +12 -3
- package/dist/admin/shell/locale-memory.d.ts +8 -0
- package/dist/admin/shell/locale-memory.js +23 -0
- package/dist/admin/shell/members-list.d.ts +2 -0
- package/dist/admin/shell/members-list.js +5 -0
- package/dist/admin/shell/page-dialogs.d.ts +9 -0
- package/dist/admin/shell/page-dialogs.js +19 -0
- package/dist/admin/shell/presence-context.d.ts +9 -0
- package/dist/admin/shell/presence-context.js +35 -0
- package/dist/admin/shell/presence-realtime.d.ts +3 -0
- package/dist/admin/shell/presence-realtime.js +22 -0
- package/dist/admin/shell/presence.d.ts +51 -0
- package/dist/admin/shell/presence.js +90 -0
- package/dist/admin/shell/router.d.ts +10 -7
- package/dist/admin/shell/router.js +18 -9
- package/dist/admin/shell/settings.d.ts +0 -6
- package/dist/admin/shell/settings.js +4 -5
- package/dist/admin/shell/stale.d.ts +28 -0
- package/dist/admin/shell/stale.js +17 -0
- package/dist/admin/tree-ops.js +3 -0
- package/dist/admin/ui/ActionMenu.js +26 -6
- package/dist/admin/ui/Combobox.d.ts +5 -0
- package/dist/admin/ui/Combobox.js +1 -1
- package/dist/admin/ui/ConfirmDialog.d.ts +8 -0
- package/dist/admin/ui/ConfirmDialog.js +30 -0
- package/dist/admin/ui/Dialog.d.ts +13 -0
- package/dist/admin/ui/Dialog.js +54 -0
- package/dist/admin/ui/HistoryModal.d.ts +2 -1
- package/dist/admin/ui/HistoryModal.js +7 -2
- package/dist/admin/ui/LockIcon.d.ts +4 -0
- package/dist/admin/ui/LockIcon.js +12 -0
- package/dist/admin/ui/PresenceLine.d.ts +6 -0
- package/dist/admin/ui/PresenceLine.js +11 -0
- package/dist/admin/ui/ResizeHandle.js +4 -4
- package/dist/admin/ui/StaleBanner.d.ts +5 -0
- package/dist/admin/ui/StaleBanner.js +9 -0
- package/dist/admin/ui/confirm.d.ts +35 -0
- package/dist/admin/ui/confirm.js +57 -0
- package/dist/admin/ui/primitives.d.ts +19 -4
- package/dist/admin/ui/primitives.js +12 -5
- package/dist/admin/ui/resize.d.ts +7 -4
- package/dist/admin/ui/resize.js +7 -4
- package/dist/admin/ui/theme.d.ts +1 -1
- package/dist/admin/ui/theme.js +373 -204
- package/dist/admin/validate.d.ts +4 -0
- package/dist/admin/validate.js +28 -0
- package/dist/cli/load-collections.d.ts +2 -0
- package/dist/cli/load-collections.js +26 -0
- package/dist/cli/main.d.ts +13 -0
- package/dist/cli/main.js +62 -0
- package/dist/cli/migrate.d.ts +23 -0
- package/dist/cli/migrate.js +64 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +9 -0
- package/dist/draft-token.d.ts +31 -0
- package/dist/draft-token.js +41 -0
- package/dist/entry-store.d.ts +11 -8
- package/dist/entry-store.js +24 -10
- package/dist/env.d.ts +9 -0
- package/dist/env.js +19 -0
- package/dist/fields.d.ts +2 -0
- package/dist/fields.js +2 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.js +4 -2
- package/dist/marks.d.ts +3 -0
- package/dist/marks.js +3 -0
- package/dist/migrations.d.ts +37 -0
- package/dist/migrations.js +73 -0
- package/dist/schema-version.d.ts +17 -0
- package/dist/schema-version.js +32 -0
- package/dist/sql-space.js +17 -0
- package/dist/sql.js +21 -0
- package/dist/store.d.ts +14 -8
- package/dist/store.js +30 -8
- package/dist/supabase-entry-store.d.ts +15 -5
- package/dist/supabase-entry-store.js +87 -22
- package/dist/supabase-store.d.ts +18 -5
- package/dist/supabase-store.js +83 -20
- package/dist/time-zone.d.ts +6 -0
- package/dist/time-zone.js +27 -0
- package/migrations/20260926120000_smoodly_v1.sql +535 -0
- package/migrations/20260926130000_smoodly_v2.sql +26 -0
- package/package.json +13 -3
package/dist/admin/ui/theme.js
CHANGED
|
@@ -7,70 +7,91 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
7
7
|
// is scoped under `.sm-admin` — never `:root` — so the host's own custom
|
|
8
8
|
// properties and class names can't collide with ours.
|
|
9
9
|
//
|
|
10
|
-
// The values come from
|
|
11
|
-
// look:
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
10
|
+
// The values come from design_handoff_smoodly_neutral/tokens/*.css (the
|
|
11
|
+
// neutral look, 2026-09-25: a navy frame around a white sheet, soft grey
|
|
12
|
+
// tiles instead of white cards, white fields on the tiles, Spruce accent,
|
|
13
|
+
// sans only). Every rule below reads its colours, radii, sizes and letter
|
|
14
|
+
// case from tokens, so a look is a token block: the previous warm look
|
|
15
|
+
// survives as the `warm` block further down, on `data-look="warm"`.
|
|
16
|
+
// Hover/focus/disabled live here rather than in inline styles, which is
|
|
17
|
+
// the whole reason for the stylesheet.
|
|
16
18
|
import { INSPECTOR_W_KEY, MIN_INSPECTOR_W } from "./resize.js";
|
|
17
19
|
const TOKENS_LIGHT = `
|
|
18
20
|
--accent:#1C6E5B; --accent-hover:#175C4C; --accent-soft:#DDEBE4; --accent-line:#9CC9B8; --on-accent:#FFFFFF;
|
|
19
21
|
--green-700:#1F7A46; --green-50:#E3F3EA; --green-300:#6FD39A; --green-500:#2E9E5B;
|
|
20
22
|
--amber-700:#8A5A00; --amber-50:#FBF1DC; --amber-300:#E8B85A;
|
|
21
|
-
--red-700:#
|
|
23
|
+
--red-700:#C4372E; --red-50:#FBE9E7; --red-300:#F5A5A0;
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
--
|
|
25
|
-
--
|
|
26
|
-
--
|
|
25
|
+
/* The shell: navy frame, white sheet, grey tiles on the sheet, white fields on the tiles. */
|
|
26
|
+
--frame:#151727; --sheet:#FFFFFF;
|
|
27
|
+
--bg:var(--sheet); --canvas:#ECEDF1; --surface:#F6F6F6; --surface-form:#F6F6F6; --surface-inset:#FFFFFF;
|
|
28
|
+
--menu-bg:#FFFFFF;
|
|
29
|
+
--input-bg:#FFFFFF; --input-hover-bg:#FFFFFF; --input-focus-bg:#FFFFFF; --input-border:transparent;
|
|
30
|
+
--line:#E4E5EA; --line-dashed:#CFD1D9; --line-soft:#ECEDF1;
|
|
31
|
+
--text:#151727; --text-secondary:#454A5C; --text-muted:#6B6F80; --text-subtle:#9A9EAB; --text-disabled:#C5C8D2;
|
|
27
32
|
--selection:var(--accent); --nav-active-bg:var(--accent-soft); --nav-active-fg:var(--accent);
|
|
28
33
|
--selection-global:#C4620C;
|
|
29
|
-
--hover:rgba(
|
|
30
|
-
--btn-secondary-bg:var(--surface); --btn-secondary-hover:#
|
|
34
|
+
--hover:rgba(21,23,39,.05); --press:rgba(21,23,39,.09); --control-hover:#ECEDF1; --canvas-ground:#EDEDED;
|
|
35
|
+
--btn-secondary-bg:var(--surface); --btn-secondary-hover:#ECEDF1;
|
|
36
|
+
/* The rail sits on the frame: its own greys, the active tile a white tint. */
|
|
37
|
+
--rail-fg:#B9BDCE; --rail-active-fg:#FFFFFF; --rail-active-bg:rgba(255,255,255,.14); --rail-hover-bg:rgba(255,255,255,.08);
|
|
31
38
|
--bar-bg:transparent; --bar-border:0; --menu-border:0; --card-divider:0;
|
|
32
39
|
--card-title-size:var(--text-md); --card-title-color:var(--text);
|
|
33
|
-
|
|
34
|
-
--
|
|
35
|
-
--
|
|
40
|
+
/* In-card segmented (tabs, the span bar): white track, the chosen option in the tile grey. */
|
|
41
|
+
--tabs-bg:var(--surface-inset); --tab-active-bg:var(--surface); --tab-active-fg:var(--text); --tab-active-shadow:none;
|
|
42
|
+
--spanbar-bg:var(--surface-inset); --spanbar-col:var(--surface); --switch-bg:var(--line-dashed);
|
|
43
|
+
/* On the sheet (the locale switch): grey track, the chosen option white. */
|
|
44
|
+
--seg-bg:var(--surface); --seg-active-bg:var(--surface-inset);
|
|
45
|
+
/* Rows keep a light rule (asked for 2026-09-25); the header has none, as the handoff. */
|
|
46
|
+
--table-rule:1px solid transparent; --row-rule:1px solid var(--line);
|
|
47
|
+
--outline-row-bg:var(--surface-inset); --outline-row-border:1px solid transparent;
|
|
48
|
+
--toolbar-bg:#151727; --toolbar-fg:#FFFFFF;
|
|
36
49
|
/* The "+" rides the canvas page, which stays light in both themes — so
|
|
37
50
|
literals, opaque, not the theme's accent-soft (a translucent tint in
|
|
38
51
|
dark mode that washed out over the white page, 2026-09-10). */
|
|
39
52
|
--plus-bg:#DDEBE4; --plus-hover:#D0E3D9; --plus-fg:#1C6E5B;
|
|
40
53
|
--plus-icon-bg:#1C6E5B; --plus-icon-fg:#FFFFFF; --plus-shadow:none;
|
|
41
|
-
--logo-color:var(--accent);
|
|
54
|
+
--logo-color:var(--accent); --logo-outer:#FFFFFF; --logo-inner:var(--frame);
|
|
42
55
|
|
|
43
56
|
--status-published-fg:var(--green-700); --status-published-bg:var(--green-50);
|
|
44
57
|
--status-changes-fg:var(--amber-700); --status-changes-bg:var(--amber-50);
|
|
45
|
-
--status-draft-fg:var(--text-muted); --status-draft-bg:var(--
|
|
58
|
+
--status-draft-fg:var(--text-muted); --status-draft-bg:var(--control-hover);
|
|
46
59
|
--status-scheduled-fg:var(--accent); --status-scheduled-bg:var(--accent-soft);
|
|
47
60
|
--status-saved-dot:var(--green-500);
|
|
48
61
|
--warn:var(--amber-700); --warn-soft:var(--amber-50);
|
|
49
62
|
--danger:var(--red-700); --danger-soft:var(--red-50);
|
|
50
63
|
|
|
51
64
|
/* The edited page inside the canvas stays light in both themes. */
|
|
52
|
-
--page-bg:#FFFFFF; --page-text:#
|
|
65
|
+
--page-bg:#FFFFFF; --page-text:#151727;
|
|
53
66
|
--shadow-page:0 1px 2px rgba(0,0,0,.06), 0 12px 32px rgba(0,0,0,.1);
|
|
54
67
|
--shadow-float:0 2px 8px rgba(0,0,0,.2);
|
|
55
|
-
--shadow-seg:0 1px 2px rgba(
|
|
68
|
+
--shadow-seg:0 1px 2px rgba(21,23,39,.08);
|
|
56
69
|
--focus-ring:0 0 0 .5px var(--accent);
|
|
57
|
-
--shadow-pop:0 4px 20px rgba(
|
|
70
|
+
--shadow-pop:0 4px 20px rgba(21,23,39,.14);
|
|
71
|
+
--scrim:rgba(21,23,39,.4); --shadow-modal:0 24px 64px rgba(21,23,39,.28);
|
|
58
72
|
--logo-filter:none;
|
|
59
73
|
|
|
60
74
|
/* Which half of the theme toggle is visible. A token, so the icon can never
|
|
61
75
|
disagree with the colors — both follow the one cascade below. */
|
|
62
76
|
--when-light:inline-flex; --when-dark:none;
|
|
63
77
|
`;
|
|
78
|
+
/* The handoff's dark proposal (VisualEditor.md, 8c right board): the frame
|
|
79
|
+
and sheet a step darker, tiles a step lighter, fields in the sheet tone;
|
|
80
|
+
the rail and the logo unchanged. */
|
|
64
81
|
const TOKENS_DARK = `
|
|
65
|
-
--accent:#6CC4A6; --accent-hover:#82D2B8; --accent-soft:rgba(108,196,166,.18); --accent-line:#6CC4A6; --on-accent:#
|
|
82
|
+
--accent:#6CC4A6; --accent-hover:#82D2B8; --accent-soft:rgba(108,196,166,.18); --accent-line:#6CC4A6; --on-accent:#151727;
|
|
66
83
|
--selection-global:#F09A5C;
|
|
67
|
-
--
|
|
68
|
-
--
|
|
69
|
-
--
|
|
70
|
-
--
|
|
71
|
-
--
|
|
72
|
-
--
|
|
73
|
-
--
|
|
84
|
+
--frame:#0F1120; --sheet:#1B1E30;
|
|
85
|
+
--canvas:#131526; --surface:#242840; --surface-form:#242840; --surface-inset:#1B1E30;
|
|
86
|
+
--menu-bg:#242840;
|
|
87
|
+
--input-bg:#1B1E30; --input-hover-bg:#1B1E30; --input-focus-bg:#1B1E30;
|
|
88
|
+
--line:#33384F; --line-dashed:#444A63; --line-soft:#33384F;
|
|
89
|
+
--text:#EEF0F5; --text-secondary:#C5C8D2; --text-muted:#9A9FB3; --text-subtle:#7C819A; --text-disabled:#4F5570;
|
|
90
|
+
--hover:rgba(238,240,245,.05); --press:rgba(238,240,245,.09); --control-hover:#2C3049; --canvas-ground:var(--control-hover);
|
|
91
|
+
--btn-secondary-bg:var(--surface); --btn-secondary-hover:#2C3049;
|
|
92
|
+
--switch-bg:var(--line-dashed);
|
|
93
|
+
--toolbar-bg:#0F1120; --toolbar-fg:#EEF0F5;
|
|
94
|
+
--logo-inner:#151727;
|
|
74
95
|
|
|
75
96
|
--status-published-fg:var(--green-300); --status-published-bg:rgba(111,211,154,.14);
|
|
76
97
|
--status-changes-fg:var(--amber-300); --status-changes-bg:rgba(232,184,90,.14);
|
|
@@ -80,62 +101,78 @@ const TOKENS_DARK = `
|
|
|
80
101
|
|
|
81
102
|
--shadow-page:0 1px 2px rgba(0,0,0,.4), 0 12px 32px rgba(0,0,0,.35);
|
|
82
103
|
--shadow-pop:0 4px 20px rgba(0,0,0,.5);
|
|
104
|
+
--scrim:rgba(0,0,0,.55); --shadow-modal:0 24px 64px rgba(0,0,0,.5);
|
|
83
105
|
--when-light:none; --when-dark:inline-flex;
|
|
84
106
|
`;
|
|
107
|
+
/* Sizes are the app's (14px base, 18px titles, 30px document title, 64px
|
|
108
|
+
top bar, 360px inspector), not the handoff's 13/20/22/56/296: the restyle
|
|
109
|
+
changes tokens of colour and shape only (decided 2026-09-25). */
|
|
85
110
|
const SCALE = `
|
|
86
111
|
--font-sans:'Public Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;
|
|
87
|
-
--font-serif:
|
|
112
|
+
--font-serif:var(--font-sans);
|
|
88
113
|
--font-mono:ui-monospace,Menlo,Consolas,monospace;
|
|
89
114
|
--text-2xs:10px; --text-xs:11px; --text-sm:12px; --text-md:14px;
|
|
90
115
|
--text-lg:15px; --text-xl:16px; --text-2xl:20px; --text-3xl:22px; --text-4xl:30px;
|
|
91
116
|
--tracking-tight:-0.02em; --tracking-label:0.1em; --tracking-tag:0.08em;
|
|
92
|
-
/* Sentence case everywhere; the technical look flips these to caps. */
|
|
93
117
|
--caps-transform:none; --caps-tracking:0;
|
|
94
118
|
--label-size:12px; --label-weight:500; --label-transform:none; --label-tracking:0;
|
|
95
119
|
--meta-font:var(--font-sans); --meta-size:13px;
|
|
96
120
|
--title-font:var(--font-sans); --title-size:18px; --title-weight:600; --title-tracking:-0.01em;
|
|
97
121
|
--doc-title-size:30px;
|
|
98
122
|
--blocktag-font:var(--font-sans); --blocktag-size:11px; --blocktag-transform:none; --blocktag-tracking:0;
|
|
99
|
-
--blocktag-radius:
|
|
123
|
+
--blocktag-radius:4px; --blocktag-shift:translate(16px,-50%); --blocktag-shift-inside:translate(16px,8px);
|
|
100
124
|
--badge-h:24px; --badge-dot:inline-block;
|
|
101
125
|
|
|
102
|
-
--radius-xs:2px; --radius-sm:
|
|
103
|
-
--radius-card:
|
|
104
|
-
--page-radius:
|
|
126
|
+
--radius-xs:2px; --radius-sm:6px; --radius-md:8px; --radius-lg:10px;
|
|
127
|
+
--radius-card:16px; --radius-card-lg:16px; --radius-modal:20px; --radius-btn:999px; --radius-round:999px;
|
|
128
|
+
--page-radius:8px 8px 0 0; --selection-radius:2px; /* the canvas hover/selection ring: 2px (asked for 2026-09-26; 8px before) */
|
|
129
|
+
--outline-row-radius:6px; --tabs-radius:10px; --tab-radius:6px; --row-radius:2px; --tag-radius:999px; /* list row hover fill: 2px (same day; 10px before) */
|
|
130
|
+
--plus-radius:8px; --toolbar-radius:8px;
|
|
131
|
+
--rtcard-bg:var(--surface); --rtcard-border:var(--line);
|
|
105
132
|
--control-h:40px; --control-h-sm:34px; --control-h-lg:48px; --button-h:36px; --button-h-sm:28px; --row-h:48px; --topbar-h:64px;
|
|
106
133
|
--outline-row-h:36px; --seg-pad-y:7px; --tabs-pad:3px;
|
|
107
134
|
--plus-h:32px; --plus-pad:0 14px 0 6px; --plus-label:inline;
|
|
108
|
-
--nav-w:72px; --inspector-w:360px; --gutter:20px;
|
|
109
|
-
|
|
110
|
-
--
|
|
135
|
+
--nav-w:72px; --inspector-w:360px; --gutter:20px;
|
|
136
|
+
/* The frame is 6px above, right of and below the sheet; the rail fills the left edge. */
|
|
137
|
+
--frame-pad:6px; --frame-pad-top:6px; --shell-gap:0px; --sheet-radius:20px; --sheet-pad:0 24px 24px;
|
|
138
|
+
--rail-pad:18px 6px 16px; --rail-logo:block; --rail-logo-opacity:.8; --rail-tile-w:44px; --rail-tile-h:40px; --rail-tile-radius:12px;
|
|
139
|
+
--topbar-pad:0; --back-size:32px; --back-bg:var(--surface);
|
|
140
|
+
--table-pad:8px 12px; --table-top:80px; --canvas-pad:28px 40px 0; --card-pad:16px 18px; --card-gap:12px; --form-pad:32px 40px;
|
|
111
141
|
--border:1px solid var(--line);
|
|
112
142
|
--outline-selection:2px solid var(--selection);
|
|
113
143
|
--outline-selection-global:2px solid var(--selection-global);
|
|
114
144
|
`;
|
|
115
|
-
/* ──
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
--
|
|
126
|
-
--gray-500:#8B93A7; --gray-600:#6B7386; --gray-700:#4A5165; --gray-900:#0F1420;
|
|
145
|
+
/* ── The warm look (design_handoff_smoodly_warm/, the default from
|
|
146
|
+
2026-09-08 to 2026-09-25), kept as a token block for comparison: frozen
|
|
147
|
+
copies of the three strings as they were, plus WARM_EXTRA giving the
|
|
148
|
+
tokens the neutral restyle added their warm values. Applied under
|
|
149
|
+
`.sm-admin[data-look="warm"]`; switch from the console with
|
|
150
|
+
localStorage.setItem("smoodly-look","warm") and reload, removeItem to go
|
|
151
|
+
back. A token snapshot, not a pixel restore: shared class rules move
|
|
152
|
+
with the default look. The earlier technical look is at tag
|
|
153
|
+
`look-technical`. */
|
|
154
|
+
const WARM_LIGHT = `
|
|
155
|
+
--accent:#1C6E5B; --accent-hover:#175C4C; --accent-soft:#DDEBE4; --accent-line:#9CC9B8; --on-accent:#FFFFFF;
|
|
127
156
|
--green-700:#1F7A46; --green-50:#E3F3EA; --green-300:#6FD39A; --green-500:#2E9E5B;
|
|
128
157
|
--amber-700:#8A5A00; --amber-50:#FBF1DC; --amber-300:#E8B85A;
|
|
129
158
|
--red-700:#B42318; --red-50:#FDECEC; --red-300:#F5A5A0;
|
|
130
159
|
|
|
131
|
-
--bg
|
|
132
|
-
--input-bg
|
|
133
|
-
--
|
|
134
|
-
--
|
|
135
|
-
--selection:var(--
|
|
136
|
-
--selection-global:#
|
|
137
|
-
--hover:rgba(
|
|
138
|
-
--
|
|
160
|
+
--bg:#F4F1EB; --canvas:#ECE8DF; --surface:#FFFFFF; --surface-form:#FDFCFA; --surface-inset:#F4F1EB;
|
|
161
|
+
--input-bg:#FFFFFF; --input-hover-bg:#FFFFFF; --input-focus-bg:#FFFFFF; --input-border:var(--line);
|
|
162
|
+
--line:#E8E3DA; --line-dashed:#D8D1C4; --line-soft:#EFEBE3;
|
|
163
|
+
--text:#1F1D1A; --text-secondary:#4E4942; --text-muted:#7A746A; --text-subtle:#A39C90; --text-disabled:#C4BDB1;
|
|
164
|
+
--selection:var(--accent); --nav-active-bg:var(--accent-soft); --nav-active-fg:var(--accent);
|
|
165
|
+
--selection-global:#C4620C;
|
|
166
|
+
--hover:rgba(31,29,26,.05); --press:rgba(31,29,26,.09); --control-hover:#F8F6F1;
|
|
167
|
+
--btn-secondary-bg:var(--surface); --btn-secondary-hover:#F8F6F1; --tile-hover:var(--surface);
|
|
168
|
+
--bar-bg:transparent; --bar-border:0; --menu-border:0; --card-divider:0;
|
|
169
|
+
--card-title-size:var(--text-md); --card-title-color:var(--text);
|
|
170
|
+
--tabs-bg:var(--surface-inset); --tab-active-bg:var(--surface); --tab-active-fg:var(--text); --tab-active-shadow:var(--shadow-seg);
|
|
171
|
+
--seg-bg:var(--canvas);
|
|
172
|
+
--toolbar-bg:#1F1D1A; --toolbar-fg:#F4F1EB;
|
|
173
|
+
--plus-bg:#DDEBE4; --plus-hover:#D0E3D9; --plus-fg:#1C6E5B;
|
|
174
|
+
--plus-icon-bg:#1C6E5B; --plus-icon-fg:#FFFFFF; --plus-shadow:none;
|
|
175
|
+
--logo-color:var(--accent);
|
|
139
176
|
|
|
140
177
|
--status-published-fg:var(--green-700); --status-published-bg:var(--green-50);
|
|
141
178
|
--status-changes-fg:var(--amber-700); --status-changes-bg:var(--amber-50);
|
|
@@ -145,27 +182,25 @@ const TECHNICAL_LIGHT = `
|
|
|
145
182
|
--warn:var(--amber-700); --warn-soft:var(--amber-50);
|
|
146
183
|
--danger:var(--red-700); --danger-soft:var(--red-50);
|
|
147
184
|
|
|
148
|
-
--page-bg:#FFFFFF; --page-text
|
|
149
|
-
--shadow-page:0 1px 2px rgba(0,0,0,.
|
|
150
|
-
--shadow-float:0 2px 8px rgba(0,0,0,.
|
|
151
|
-
--shadow-seg:0 1px 2px rgba(
|
|
152
|
-
--focus-ring:0 0 0
|
|
153
|
-
--shadow-pop:0
|
|
185
|
+
--page-bg:#FFFFFF; --page-text:#1F1D1A;
|
|
186
|
+
--shadow-page:0 1px 2px rgba(0,0,0,.06), 0 12px 32px rgba(0,0,0,.1);
|
|
187
|
+
--shadow-float:0 2px 8px rgba(0,0,0,.2);
|
|
188
|
+
--shadow-seg:0 1px 2px rgba(40,30,10,.08);
|
|
189
|
+
--focus-ring:0 0 0 .5px var(--accent);
|
|
190
|
+
--shadow-pop:0 4px 20px rgba(0,0,0,.14);
|
|
154
191
|
--logo-filter:none;
|
|
155
|
-
|
|
156
|
-
/* Which half of the theme toggle is visible. A token, so the icon can never
|
|
157
|
-
disagree with the colors — both follow the one cascade below. */
|
|
158
192
|
--when-light:inline-flex; --when-dark:none;
|
|
159
193
|
`;
|
|
160
|
-
const
|
|
161
|
-
--
|
|
162
|
-
--
|
|
163
|
-
--
|
|
164
|
-
--
|
|
165
|
-
--
|
|
166
|
-
--
|
|
167
|
-
--hover:rgba(
|
|
168
|
-
--
|
|
194
|
+
const WARM_DARK = `
|
|
195
|
+
--accent:#6CC4A6; --accent-hover:#82D2B8; --accent-soft:rgba(108,196,166,.18); --accent-line:#6CC4A6; --on-accent:#0B1F18;
|
|
196
|
+
--selection-global:#F09A5C;
|
|
197
|
+
--bg:#1C1A17; --canvas:#141210; --surface:#27241F; --surface-form:#27241F; --surface-inset:#1C1A17;
|
|
198
|
+
--input-bg:#211E1A; --input-hover-bg:#211E1A; --input-focus-bg:#211E1A;
|
|
199
|
+
--line:#3A3630; --line-dashed:#4A453D; --line-soft:#3A3630;
|
|
200
|
+
--text:#F1EDE6; --text-secondary:#C9C2B7; --text-muted:#9A9388; --text-subtle:#7C7568; --text-disabled:#5A5449;
|
|
201
|
+
--hover:rgba(241,237,230,.05); --press:rgba(241,237,230,.09); --control-hover:#2E2A25;
|
|
202
|
+
--btn-secondary-bg:var(--surface); --btn-secondary-hover:#2E2A25;
|
|
203
|
+
--toolbar-bg:#0F0E0C; --toolbar-fg:#F1EDE6;
|
|
169
204
|
|
|
170
205
|
--status-published-fg:var(--green-300); --status-published-bg:rgba(111,211,154,.14);
|
|
171
206
|
--status-changes-fg:var(--amber-300); --status-changes-bg:rgba(232,184,90,.14);
|
|
@@ -173,62 +208,57 @@ const TECHNICAL_DARK = `
|
|
|
173
208
|
--warn:var(--amber-300); --warn-soft:rgba(232,184,90,.14);
|
|
174
209
|
--danger:var(--red-300); --danger-soft:rgba(244,102,92,.14);
|
|
175
210
|
|
|
176
|
-
--shadow-page:0 1px 2px rgba(0,0,0,.4), 0
|
|
177
|
-
--shadow-pop:0
|
|
178
|
-
--logo-filter:brightness(0) invert(1);
|
|
211
|
+
--shadow-page:0 1px 2px rgba(0,0,0,.4), 0 12px 32px rgba(0,0,0,.35);
|
|
212
|
+
--shadow-pop:0 4px 20px rgba(0,0,0,.5);
|
|
179
213
|
--when-light:none; --when-dark:inline-flex;
|
|
180
214
|
`;
|
|
181
|
-
const
|
|
215
|
+
const WARM_SCALE = `
|
|
182
216
|
--font-sans:'Public Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;
|
|
217
|
+
--font-serif:'Source Serif 4',Georgia,'Times New Roman',serif;
|
|
183
218
|
--font-mono:ui-monospace,Menlo,Consolas,monospace;
|
|
184
|
-
--text-2xs:
|
|
185
|
-
--text-lg:
|
|
219
|
+
--text-2xs:10px; --text-xs:11px; --text-sm:12px; --text-md:14px;
|
|
220
|
+
--text-lg:15px; --text-xl:16px; --text-2xl:20px; --text-3xl:22px; --text-4xl:30px;
|
|
186
221
|
--tracking-tight:-0.02em; --tracking-label:0.1em; --tracking-tag:0.08em;
|
|
222
|
+
--caps-transform:none; --caps-tracking:0;
|
|
223
|
+
--label-size:12px; --label-weight:500; --label-transform:none; --label-tracking:0;
|
|
224
|
+
--meta-font:var(--font-sans); --meta-size:13px;
|
|
225
|
+
--title-font:var(--font-sans); --title-size:18px; --title-weight:600; --title-tracking:-0.01em;
|
|
226
|
+
--doc-title-size:30px;
|
|
227
|
+
--blocktag-font:var(--font-sans); --blocktag-size:11px; --blocktag-transform:none; --blocktag-tracking:0;
|
|
228
|
+
--blocktag-radius:var(--radius-round); --blocktag-shift:translate(16px,-50%); --blocktag-shift-inside:translate(16px,8px);
|
|
229
|
+
--badge-h:24px; --badge-dot:inline-block;
|
|
187
230
|
|
|
188
|
-
--radius-xs:
|
|
189
|
-
--
|
|
190
|
-
--
|
|
231
|
+
--radius-xs:2px; --radius-sm:8px; --radius-md:10px; --radius-lg:12px;
|
|
232
|
+
--radius-card:14px; --radius-card-lg:16px; --radius-btn:999px; --radius-round:999px;
|
|
233
|
+
--page-radius:4px 4px 0 0; --selection-radius:4px;
|
|
234
|
+
--control-h:40px; --control-h-sm:34px; --control-h-lg:48px; --button-h:36px; --button-h-sm:28px; --row-h:48px; --topbar-h:64px;
|
|
235
|
+
--outline-row-h:36px; --seg-pad-y:7px; --tabs-pad:3px;
|
|
236
|
+
--plus-h:32px; --plus-pad:0 14px 0 6px; --plus-label:inline;
|
|
237
|
+
--nav-w:72px; --inspector-w:360px; --gutter:20px; --frame-pad:24px;
|
|
238
|
+
--rail-pad:22px 6px 16px; --rail-logo:none; --topbar-pad:0; --back-size:32px; --back-bg:var(--surface);
|
|
239
|
+
--table-pad:8px 12px; --table-top:80px; --canvas-pad:24px 40px 0; --card-pad:16px 18px; --card-gap:12px; --form-pad:32px 40px;
|
|
191
240
|
--border:1px solid var(--line);
|
|
192
|
-
--outline-selection:
|
|
193
|
-
--outline-selection-global:
|
|
194
|
-
`;
|
|
195
|
-
/* The tokens the warm restyle added, with the values the technical look
|
|
196
|
-
implied, so the frozen block above renders the old shapes too. */
|
|
197
|
-
const TECHNICAL_SHAPE = `
|
|
198
|
-
--font-serif:var(--font-sans);
|
|
199
|
-
--caps-transform:uppercase; --caps-tracking:.06em;
|
|
200
|
-
--label-size:var(--text-2xs); --label-weight:600; --label-transform:uppercase; --label-tracking:var(--tracking-label);
|
|
201
|
-
--meta-font:var(--font-mono); --meta-size:var(--text-2xs);
|
|
202
|
-
--title-font:var(--font-sans); --title-size:var(--text-xl); --title-weight:600; --title-tracking:0;
|
|
203
|
-
--doc-title-size:var(--text-2xl);
|
|
204
|
-
--blocktag-font:var(--font-mono); --blocktag-size:var(--text-2xs); --blocktag-transform:uppercase; --blocktag-tracking:var(--tracking-tag);
|
|
205
|
-
--blocktag-radius:var(--radius-sm) 0 var(--radius-sm) 0; --blocktag-shift:none; --blocktag-shift-inside:none;
|
|
206
|
-
--badge-h:20px; --badge-dot:none;
|
|
207
|
-
--radius-lg:var(--radius-md); --radius-card:var(--radius-md); --radius-card-lg:var(--radius-md); --radius-btn:var(--radius-md);
|
|
208
|
-
--page-radius:var(--radius-md); --selection-radius:var(--radius-sm);
|
|
209
|
-
--control-h-sm:24px; --button-h:var(--control-h); --button-h-sm:24px;
|
|
210
|
-
--outline-row-h:var(--control-h); --seg-pad-y:3px; --tabs-pad:0 14px;
|
|
211
|
-
--plus-h:24px; --plus-pad:0; --plus-label:none;
|
|
212
|
-
--gutter:0px; --frame-pad:0px;
|
|
213
|
-
--rail-pad:14px 6px 12px; --rail-logo:block; --topbar-pad:0 16px; --back-size:auto; --back-bg:transparent;
|
|
214
|
-
--table-pad:0 16px 16px; --table-top:0px; --canvas-pad:0 20px 20px; --card-pad:14px; --card-gap:0px; --form-pad:24px 32px;
|
|
215
|
-
`;
|
|
216
|
-
const TECHNICAL_LIGHT_EXTRA = `
|
|
217
|
-
--accent-hover:var(--brand-500); --accent-line:var(--brand-200); --canvas:var(--bg); --surface-form:var(--surface);
|
|
218
|
-
--input-bg:var(--surface-inset); --input-hover-bg:var(--control-hover); --input-focus-bg:var(--gray-0); --input-border:transparent;
|
|
219
|
-
--line-soft:var(--line); --text-secondary:var(--gray-700); --text-disabled:var(--gray-300);
|
|
220
|
-
--btn-secondary-bg:var(--surface-inset); --btn-secondary-hover:var(--control-hover); --tile-hover:var(--surface-inset);
|
|
221
|
-
--bar-bg:var(--surface); --bar-border:var(--border); --menu-border:var(--border); --card-divider:var(--border);
|
|
222
|
-
--card-title-size:var(--label-size); --card-title-color:var(--text-muted);
|
|
223
|
-
--tabs-bg:transparent; --tab-active-bg:transparent; --tab-active-fg:var(--accent); --tab-active-shadow:inset 0 -2px 0 var(--accent);
|
|
224
|
-
--seg-bg:var(--surface-inset);
|
|
225
|
-
--toolbar-bg:#15181F; --toolbar-fg:#EEF0F5;
|
|
226
|
-
--plus-bg:var(--selection); --plus-hover:var(--brand-500); --plus-fg:#fff;
|
|
227
|
-
--plus-icon-bg:transparent; --plus-icon-fg:#fff; --plus-shadow:0 2px 6px rgba(0,56,177,.35);
|
|
228
|
-
--logo-color:#0038B1;
|
|
241
|
+
--outline-selection:2px solid var(--selection);
|
|
242
|
+
--outline-selection-global:2px solid var(--selection-global);
|
|
229
243
|
`;
|
|
230
|
-
|
|
231
|
-
|
|
244
|
+
/* The tokens the neutral restyle added, with the values the warm look
|
|
245
|
+
implied: no frame or sheet (the ground is the shell's background and the
|
|
246
|
+
main column sits on it), the rail on the ground in the text colour,
|
|
247
|
+
menus and modals on the card surface, ruled table rows, hairlined
|
|
248
|
+
outline rows, pill tabs and tags. */
|
|
249
|
+
const WARM_EXTRA = `
|
|
250
|
+
--frame:var(--bg); --sheet:transparent; --menu-bg:var(--surface);
|
|
251
|
+
--rail-fg:var(--text); --rail-active-fg:var(--nav-active-fg); --rail-active-bg:var(--nav-active-bg); --rail-hover-bg:var(--tile-hover);
|
|
252
|
+
--spanbar-bg:var(--seg-bg); --spanbar-col:var(--surface); --switch-bg:var(--seg-bg); --seg-active-bg:var(--surface);
|
|
253
|
+
--table-rule:1px solid var(--line); --row-rule:1px solid var(--line-soft);
|
|
254
|
+
--outline-row-bg:transparent; --outline-row-border:1px solid var(--line);
|
|
255
|
+
--logo-outer:var(--accent); --logo-inner:#FFFFFF;
|
|
256
|
+
--scrim:rgba(0,0,0,.45); --shadow-modal:var(--shadow-pop);
|
|
257
|
+
--radius-modal:var(--radius-card); --outline-row-radius:var(--radius-md); --tabs-radius:var(--radius-btn); --tab-radius:var(--radius-btn);
|
|
258
|
+
--row-radius:0; --tag-radius:var(--radius-sm); --plus-radius:var(--radius-round); --toolbar-radius:var(--radius-btn);
|
|
259
|
+
--rtcard-bg:var(--input-bg); --rtcard-border:var(--input-border); --canvas-ground:var(--control-hover);
|
|
260
|
+
--frame-pad-top:0px; --shell-gap:var(--gutter); --sheet-radius:0; --sheet-pad:0;
|
|
261
|
+
--rail-logo-opacity:1; --rail-tile-w:42px; --rail-tile-h:34px; --rail-tile-radius:var(--radius-md);
|
|
232
262
|
`;
|
|
233
263
|
/** The light/dark cascade for one root selector. Order matters: the last
|
|
234
264
|
* rule has the same specificity as the host-attribute rule, so an explicit
|
|
@@ -248,7 +278,7 @@ export const ADMIN_CSS = `
|
|
|
248
278
|
@import url("https://fonts.googleapis.com/css2?family=Public+Sans:wght@400;500;600;700&family=Source+Serif+4:opsz,wght@8..60,500;8..60,600&display=swap");
|
|
249
279
|
|
|
250
280
|
${cascade(".sm-admin", SCALE, TOKENS_LIGHT, TOKENS_DARK)}
|
|
251
|
-
${cascade('.sm-admin[data-look="
|
|
281
|
+
${cascade('.sm-admin[data-look="warm"]', WARM_SCALE + WARM_EXTRA, WARM_LIGHT, WARM_DARK)}
|
|
252
282
|
|
|
253
283
|
/* The admin owns the viewport; a host <body> margin would push it into a
|
|
254
284
|
page scrollbar. Scoped by :has, so only a page holding the admin is touched. */
|
|
@@ -269,27 +299,37 @@ body:has(.sm-admin){margin:0}
|
|
|
269
299
|
.sm-admin ::placeholder{color:var(--text-subtle)}
|
|
270
300
|
.sm-admin ::selection{background:var(--accent-soft);color:var(--text)}
|
|
271
301
|
.sm-mono{font-family:var(--font-mono)}
|
|
302
|
+
.sm-code{background:var(--surface);border-radius:8px;padding:10px 12px;margin:0;font:13px/1.5 var(--font-mono);overflow:auto}
|
|
272
303
|
|
|
273
304
|
/* ── shell ─────────────────────────────────────────────────────────── */
|
|
274
|
-
/* Rail | main
|
|
275
|
-
|
|
276
|
-
|
|
305
|
+
/* Rail | main. The shell is the frame (design_handoff_smoodly_neutral/
|
|
306
|
+
components/AppShell.html): navy, 6px above, right of and below the main
|
|
307
|
+
column, which is the white sheet with a 20px radius and its own inner
|
|
308
|
+
padding; the rail fills the frame's left edge. In the warm look the frame
|
|
309
|
+
is the ground, the sheet transparent, and a gutter separates the columns.
|
|
310
|
+
The main column stacks the top bar over one tile-shaped region: list,
|
|
311
|
+
form or editor. */
|
|
277
312
|
.sm-shell{
|
|
278
|
-
display:grid;grid-template-columns:var(--nav-w) 1fr;column-gap:var(--
|
|
279
|
-
padding:
|
|
313
|
+
display:grid;grid-template-columns:var(--nav-w) 1fr;column-gap:var(--shell-gap);
|
|
314
|
+
padding:var(--frame-pad-top) var(--frame-pad) var(--frame-pad) 0;height:100vh;height:100dvh;overflow:hidden;background:var(--frame);
|
|
315
|
+
}
|
|
316
|
+
.sm-shell>.sm-main{
|
|
317
|
+
min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;
|
|
318
|
+
background:var(--sheet);border-radius:var(--sheet-radius);padding:var(--sheet-pad);
|
|
280
319
|
}
|
|
281
|
-
.sm-shell>.sm-main{min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}
|
|
282
320
|
.sm-wordmark{height:18px;width:auto;color:var(--logo-color);filter:var(--logo-filter);flex:none}
|
|
283
|
-
/* The IconRail (
|
|
284
|
-
72px rail
|
|
285
|
-
|
|
286
|
-
|
|
321
|
+
/* The IconRail (design_handoff_smoodly_neutral/components/IconRail.html):
|
|
322
|
+
a 72px rail on the frame with the app icon on top, 18px Lucide icons
|
|
323
|
+
over a 10px label and a 44×40 active tile in a white tint — the rail's
|
|
324
|
+
own colour tokens, since the frame is navy in both themes. */
|
|
287
325
|
.sm-rail{
|
|
288
326
|
width:var(--nav-w);height:100%;display:flex;flex-direction:column;align-items:center;gap:18px;
|
|
289
|
-
padding:var(--rail-pad);background:var(--bar-bg);border-right:var(--bar-border);color:var(--
|
|
327
|
+
padding:var(--rail-pad);background:var(--bar-bg);border-right:var(--bar-border);color:var(--rail-fg);
|
|
290
328
|
font:500 10px/1 var(--font-sans);position:relative;
|
|
291
329
|
}
|
|
292
|
-
|
|
330
|
+
/* The logo: white outer / navy inner on the frame, at a little under full
|
|
331
|
+
opacity so it does not glare (2026-09-25). */
|
|
332
|
+
.sm-rail__logo{width:20px;height:auto;display:var(--rail-logo);flex:none;margin-bottom:6px;opacity:var(--rail-logo-opacity)} /* 20px wide (asked for 2026-09-26; 28px before) */
|
|
293
333
|
.sm-rail__list{display:flex;flex-direction:column;gap:8px;width:100%;margin:0;padding:0;list-style:none}
|
|
294
334
|
.sm-rail__item{position:relative}
|
|
295
335
|
.sm-rail__btn{
|
|
@@ -297,12 +337,12 @@ body:has(.sm-admin){margin:0}
|
|
|
297
337
|
align-items:center;gap:6px;color:inherit;font:inherit;cursor:pointer;border-radius:var(--radius-md);text-decoration:none;
|
|
298
338
|
}
|
|
299
339
|
.sm-rail__btn:hover{color:inherit}
|
|
300
|
-
.sm-rail__btn:focus-visible{outline:2px solid var(--
|
|
301
|
-
.sm-rail__tile{position:relative;width:
|
|
302
|
-
.sm-rail__btn:hover .sm-rail__tile{background:var(--
|
|
303
|
-
.sm-rail__btn[aria-current="page"],.sm-rail__btn[aria-expanded="true"]{color:var(--
|
|
304
|
-
.sm-rail__btn[aria-current="page"]:hover,.sm-rail__btn[aria-expanded="true"]:hover{color:var(--
|
|
305
|
-
.sm-rail__btn[aria-current="page"] .sm-rail__tile,.sm-rail__btn[aria-expanded="true"] .sm-rail__tile{background:var(--
|
|
340
|
+
.sm-rail__btn:focus-visible{outline:2px solid var(--rail-active-fg);outline-offset:-2px;box-shadow:none}
|
|
341
|
+
.sm-rail__tile{position:relative;width:var(--rail-tile-w);height:var(--rail-tile-h);border-radius:var(--rail-tile-radius);display:grid;place-items:center;transition:background .12s}
|
|
342
|
+
.sm-rail__btn:hover .sm-rail__tile{background:var(--rail-hover-bg)}
|
|
343
|
+
.sm-rail__btn[aria-current="page"],.sm-rail__btn[aria-expanded="true"]{color:var(--rail-active-fg);font-weight:600}
|
|
344
|
+
.sm-rail__btn[aria-current="page"]:hover,.sm-rail__btn[aria-expanded="true"]:hover{color:var(--rail-active-fg)}
|
|
345
|
+
.sm-rail__btn[aria-current="page"] .sm-rail__tile,.sm-rail__btn[aria-expanded="true"] .sm-rail__tile{background:var(--rail-active-bg)}
|
|
306
346
|
.sm-rail__tile svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
|
307
347
|
.sm-rail__label{letter-spacing:.01em;white-space:nowrap}
|
|
308
348
|
/* Not greyed: the reference renders every inactive item at --text and marks
|
|
@@ -314,11 +354,12 @@ body:has(.sm-admin){margin:0}
|
|
|
314
354
|
width:28px;height:28px;border-radius:var(--radius-round);background:var(--accent-soft);color:var(--accent);
|
|
315
355
|
display:grid;place-items:center;font-size:var(--text-xs);font-weight:600;border:0;cursor:pointer;padding:0;
|
|
316
356
|
}
|
|
317
|
-
.sm-rail__user:focus-visible{outline:2px solid var(--
|
|
318
|
-
/* Flyout: 6px right of the rail, aligned with its item (the user menu aligns to the bottom).
|
|
357
|
+
.sm-rail__user:focus-visible{outline:2px solid var(--rail-active-fg);outline-offset:1px;box-shadow:none}
|
|
358
|
+
/* Flyout: 6px right of the rail, aligned with its item (the user menu aligns to the bottom).
|
|
359
|
+
Menus float on --menu-bg (the sheet white in the neutral look, so they read over the frame). */
|
|
319
360
|
.sm-rail__menu{
|
|
320
361
|
position:absolute;left:calc(100% + 6px);top:0;z-index:20;width:168px;padding:6px;margin:0;list-style:none;
|
|
321
|
-
background:var(--
|
|
362
|
+
background:var(--menu-bg);border:var(--menu-border);border-radius:var(--radius-md);box-shadow:var(--shadow-pop);
|
|
322
363
|
display:none;flex-direction:column;gap:1px;font-size:var(--text-md);font-weight:500;color:var(--text);
|
|
323
364
|
}
|
|
324
365
|
.sm-rail__menu[data-open="true"]{display:flex}
|
|
@@ -333,7 +374,7 @@ body:has(.sm-admin){margin:0}
|
|
|
333
374
|
appearance:none;background:none;border:0;width:100%;display:flex;align-items:center;justify-content:space-between;
|
|
334
375
|
padding:7px 10px;border-radius:var(--radius-sm);color:inherit;font:inherit;cursor:pointer;text-align:left;text-decoration:none;
|
|
335
376
|
}
|
|
336
|
-
.sm-rail__menu-item:hover,.sm-rail__menu-item:focus-visible{background:var(--
|
|
377
|
+
.sm-rail__menu-item:hover,.sm-rail__menu-item:focus-visible{background:var(--hover);color:inherit;outline:0;box-shadow:none}
|
|
337
378
|
.sm-rail__menu-item[aria-current="page"],.sm-rail__menu-item[aria-current="page"]:hover{background:var(--nav-active-bg);color:var(--nav-active-fg);font-weight:600}
|
|
338
379
|
.sm-when-light{display:var(--when-light);align-items:center;gap:8px}
|
|
339
380
|
.sm-when-dark{display:var(--when-dark);align-items:center;gap:8px}
|
|
@@ -377,6 +418,8 @@ body:has(.sm-admin){margin:0}
|
|
|
377
418
|
text-decoration:none;
|
|
378
419
|
}
|
|
379
420
|
.sm-btn--lg{height:var(--control-h-lg);padding:0 20px}
|
|
421
|
+
/* An icon-only pill: the top bar's View live eye (2026-09-26). */
|
|
422
|
+
.sm-btn--icon{width:var(--button-h);padding:0;border-radius:50%;color:var(--text-muted)}
|
|
380
423
|
.sm-btn--sm,.sm-btn--sm.sm-btn--primary,.sm-btn--sm.sm-btn--ok{height:var(--button-h-sm);padding:0 12px;font-size:var(--text-sm)}
|
|
381
424
|
.sm-btn--primary{background:var(--accent);color:var(--on-accent);font-weight:600;padding:0 18px}
|
|
382
425
|
.sm-btn--primary:hover{background:var(--accent-hover);color:var(--on-accent)}
|
|
@@ -386,6 +429,9 @@ body:has(.sm-admin){margin:0}
|
|
|
386
429
|
.sm-btn--ghost:hover{background:var(--accent-soft);color:var(--accent)}
|
|
387
430
|
.sm-btn--danger{background:var(--btn-secondary-bg);color:var(--danger)}
|
|
388
431
|
.sm-btn--danger:hover{background:var(--danger-soft);color:var(--danger)}
|
|
432
|
+
/* The confirm dialog's destructive primary: filled red (ConfirmModal.html). */
|
|
433
|
+
.sm-btn--destructive{background:var(--danger);color:#fff;font-weight:600;padding:0 18px}
|
|
434
|
+
.sm-btn--destructive:hover{filter:brightness(.94);color:#fff}
|
|
389
435
|
.sm-btn--ok{background:var(--status-published-bg);color:var(--status-published-fg);font-weight:600;padding:0 18px}
|
|
390
436
|
.sm-btn:disabled,.sm-btn[aria-disabled="true"]{opacity:.5;cursor:default;pointer-events:none}
|
|
391
437
|
.sm-btn:focus-visible,.sm-iconbtn:focus-visible,.sm-nav-item:focus-visible,
|
|
@@ -421,6 +467,10 @@ body:has(.sm-admin){margin:0}
|
|
|
421
467
|
/* A head's text action (a list's Collapse all / Expand all): a small accent link. */
|
|
422
468
|
.sm-field__action{background:none;border:0;padding:0;font:inherit;font-size:var(--text-sm);font-weight:600;color:var(--accent);cursor:pointer}
|
|
423
469
|
.sm-field__action:hover{color:var(--accent-hover)}
|
|
470
|
+
/* A row of them: a media field's Edit / Replace / Remove in the head, and
|
|
471
|
+
the same three on a richtext image card's head (2026-09-25). */
|
|
472
|
+
.sm-field__actions{display:flex;align-items:baseline;gap:12px;flex:none}
|
|
473
|
+
.sm-rtcard__head .sm-field__actions{margin-left:auto;padding-right:4px}
|
|
424
474
|
.sm-hint{font-size:var(--text-sm);color:var(--text-muted)}
|
|
425
475
|
.sm-input,.sm-textarea,.sm-select{
|
|
426
476
|
width:100%;min-width:0;border:1px solid var(--input-border);border-radius:var(--radius-md);
|
|
@@ -429,11 +479,12 @@ body:has(.sm-admin){margin:0}
|
|
|
429
479
|
}
|
|
430
480
|
.sm-input,.sm-select{height:var(--control-h);padding:0 14px}
|
|
431
481
|
.sm-textarea{padding:11px 14px;line-height:1.55;resize:vertical;min-height:72px}
|
|
432
|
-
/* The document title
|
|
482
|
+
/* The document title at the doc-title size (serif in the warm look, sans in the neutral). */
|
|
433
483
|
.sm-input--lg{
|
|
434
484
|
height:var(--control-h-lg);font:600 var(--doc-title-size)/1.2 var(--font-serif);letter-spacing:var(--title-tracking);
|
|
435
485
|
}
|
|
436
|
-
.sm-input
|
|
486
|
+
/* Scoped, so it outranks the .sm-admin input {font-family:inherit} reset above. */
|
|
487
|
+
.sm-admin .sm-input--mono{font-family:var(--font-mono);font-size:var(--text-sm)}
|
|
437
488
|
.sm-input:hover,.sm-textarea:hover,.sm-select:hover{background:var(--input-hover-bg)}
|
|
438
489
|
.sm-input:focus,.sm-textarea:focus,.sm-select:focus,
|
|
439
490
|
.sm-inputwrap:focus-within{
|
|
@@ -451,7 +502,9 @@ body:has(.sm-admin){margin:0}
|
|
|
451
502
|
display:flex;align-items:center;gap:0;height:var(--control-h);padding:0 14px;
|
|
452
503
|
border:1px solid var(--input-border);border-radius:var(--radius-md);background:var(--input-bg);
|
|
453
504
|
}
|
|
454
|
-
|
|
505
|
+
/* The inner input keeps a 22px line box: with the 12px mono font alone its
|
|
506
|
+
caret was a 14px sliver flush against the prefix, a blinking glyph (2026-09-25). */
|
|
507
|
+
.sm-inputwrap>.sm-input{height:auto;line-height:22px;padding:0;background:transparent;border:0;box-shadow:none}
|
|
455
508
|
.sm-inputwrap>.sm-input:hover,.sm-inputwrap>.sm-input:focus{background:transparent;box-shadow:none}
|
|
456
509
|
.sm-prefix{color:var(--text-muted);font-family:var(--font-mono);font-size:var(--text-sm);flex:none}
|
|
457
510
|
.sm-error{color:var(--danger);font-size:var(--text-sm)}
|
|
@@ -461,12 +514,17 @@ body:has(.sm-admin){margin:0}
|
|
|
461
514
|
.sm-richtext__sep{width:1px;height:16px;margin:0 4px;background:var(--line)}
|
|
462
515
|
.sm-richtext__bar .sm-iconbtn[aria-pressed="true"]{background:var(--press);color:var(--text)}
|
|
463
516
|
.sm-richtext__link{display:flex;align-items:center;gap:6px}
|
|
517
|
+
/* A hairline, not the (transparent in the neutral look) input border: a
|
|
518
|
+
rich text box is a canvas, and its edge must read without a hover (asked for 2026-09-25). */
|
|
464
519
|
.sm-richtext__content{
|
|
465
|
-
min-height:140px;padding:12px 14px;border:1px solid var(--
|
|
520
|
+
min-height:140px;padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius-md);
|
|
466
521
|
background:var(--input-bg);color:var(--text);font-size:var(--text-lg);line-height:1.6;outline:0;
|
|
467
522
|
}
|
|
468
523
|
.sm-richtext__content:hover{background:var(--input-hover-bg)}
|
|
469
|
-
|
|
524
|
+
/* The field's focus ring steps back while a block node is selected: the
|
|
525
|
+
selected card carries the accent outline, and two green frames read as
|
|
526
|
+
one confusing one (2026-09-25). */
|
|
527
|
+
.sm-richtext__content:focus:not(:has(.ProseMirror-selectednode)){background:var(--input-focus-bg);border-color:var(--selection);box-shadow:var(--focus-ring)}
|
|
470
528
|
/* Block spacing: the sibling rules carry the .sm-admin prefix so they
|
|
471
529
|
outrank the admin-wide .sm-admin p{margin:0} reset (a bare
|
|
472
530
|
.sm-richtext__content>*+* lost to it and left the paragraphs
|
|
@@ -498,15 +556,18 @@ body:has(.sm-admin){margin:0}
|
|
|
498
556
|
.sm-richtext__menu{
|
|
499
557
|
position:absolute;top:calc(100% + 6px);right:0;z-index:65;width:300px;max-width:100%;
|
|
500
558
|
display:flex;flex-direction:column;gap:6px;padding:6px;
|
|
501
|
-
background:var(--
|
|
559
|
+
background:var(--menu-bg);border:var(--menu-border);border-radius:var(--radius-md);box-shadow:var(--shadow-pop);
|
|
502
560
|
}
|
|
503
561
|
.sm-richtext__menu .sm-picker{width:100%;padding:0;border:0;box-shadow:none;background:transparent}
|
|
504
562
|
.sm-richtext__slash .sm-picker{width:100%;max-width:300px}
|
|
505
563
|
.sm-richtext__slash{position:absolute;left:0;z-index:65}
|
|
506
564
|
.sm-richtext__insert-empty{padding:8px;color:var(--text-muted);font-size:var(--text-sm)}
|
|
507
565
|
.sm-picker__item--active,.sm-picker__item[aria-selected="true"]{background:var(--nav-active-bg)}
|
|
508
|
-
/* block-node cards
|
|
509
|
-
|
|
566
|
+
/* block-node cards (elements, images) inside a richtext field: the tile
|
|
567
|
+
tone with a hairline in the neutral look, so a card stands off the white
|
|
568
|
+
field it sits in (2026-09-25); white and hairlined in the warm one. The
|
|
569
|
+
selected card takes the accent outline below. */
|
|
570
|
+
.sm-rtcard{border:1px solid var(--rtcard-border);border-radius:var(--radius-md);background:var(--rtcard-bg);min-width:0}
|
|
510
571
|
.sm-richtext__content .ProseMirror-selectednode .sm-rtcard,.sm-richtext__content .sm-rtcard.ProseMirror-selectednode{outline:2px solid var(--accent);outline-offset:1px}
|
|
511
572
|
.sm-rtcard__head{display:flex;align-items:center;gap:6px;height:var(--control-h-sm);padding:0 6px 0 10px;cursor:grab;user-select:none}
|
|
512
573
|
.sm-rtcard__icon{width:18px;height:18px;flex:none;border-radius:var(--radius-xs);background:var(--accent-soft);color:var(--accent);display:grid;place-items:center;font-size:11px}
|
|
@@ -514,7 +575,7 @@ body:has(.sm-admin){margin:0}
|
|
|
514
575
|
.sm-rtcard__body{display:flex;flex-direction:column;gap:10px;padding:10px 12px 12px;border-top:1px solid var(--line)}
|
|
515
576
|
/* The whole image, letterboxed on the inset tone, never cropped: the card is a preview, not a crop. */
|
|
516
577
|
.sm-rtcard__thumb{display:block;width:100%;height:160px;object-fit:contain;border-radius:var(--radius-sm);background:var(--surface-inset)}
|
|
517
|
-
.sm-
|
|
578
|
+
.sm-rtcard__caption{font-size:var(--text-sm);font-style:italic;color:var(--text-muted);text-align:center}
|
|
518
579
|
.sm-richtext__content blockquote{padding-left:12px;border-left:2px solid var(--line);color:var(--text-muted)}
|
|
519
580
|
.sm-richtext__content a{color:var(--accent);text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--accent-line)}
|
|
520
581
|
|
|
@@ -525,7 +586,7 @@ body:has(.sm-admin){margin:0}
|
|
|
525
586
|
.sm-fieldedit{outline:1.5px solid var(--selection);outline-offset:3px;border-radius:2px;pointer-events:none}
|
|
526
587
|
.sm-floatbar{
|
|
527
588
|
position:absolute;z-index:60;display:flex;flex-direction:column;gap:6px;padding:4px;
|
|
528
|
-
background:var(--
|
|
589
|
+
background:var(--menu-bg);border-radius:var(--radius-md);box-shadow:var(--shadow-pop);pointer-events:auto;
|
|
529
590
|
}
|
|
530
591
|
.sm-floatbar .sm-richtext__link{padding:0 4px 4px}
|
|
531
592
|
.sm-floatbar .sm-richtext__menu{position:static;width:300px}
|
|
@@ -544,7 +605,7 @@ body:has(.sm-admin){margin:0}
|
|
|
544
605
|
}
|
|
545
606
|
/* The custom section's row cards and the width bar (spec 2026-09-14 §6). */
|
|
546
607
|
.sm-rowcards{display:flex;flex-direction:column;gap:12px;align-items:stretch}
|
|
547
|
-
.sm-rowcard{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--
|
|
608
|
+
.sm-rowcard{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--input-border);border-radius:var(--radius-md);background:var(--input-bg);min-width:0}
|
|
548
609
|
.sm-rowcard__head{display:flex;align-items:center;gap:4px}
|
|
549
610
|
.sm-rowcard__title{flex:1;font-weight:600}
|
|
550
611
|
.sm-rowcard__presets{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
|
|
@@ -553,8 +614,10 @@ body:has(.sm-admin){margin:0}
|
|
|
553
614
|
.sm-rowcards > .sm-btn{align-self:flex-start;border:1px solid var(--line)}
|
|
554
615
|
.sm-stepper{display:flex;align-items:center;gap:8px}
|
|
555
616
|
.sm-stepper__value{min-width:20px;text-align:center;font-weight:600}
|
|
556
|
-
|
|
557
|
-
.sm-
|
|
617
|
+
/* The − and + read as buttons, not glyphs: a hairline in both themes (asked for 2026-09-25). */
|
|
618
|
+
.sm-stepper .sm-iconbtn{border:1px solid var(--line)}
|
|
619
|
+
.sm-spanbar{display:flex;gap:2px;height:32px;background:var(--spanbar-bg);border-radius:var(--radius-md);padding:3px;user-select:none}
|
|
620
|
+
.sm-spanbar__col{position:relative;display:flex;align-items:center;justify-content:center;min-width:0;background:var(--spanbar-col);border-radius:6px;font-size:var(--text-sm);color:var(--text-muted)}
|
|
558
621
|
.sm-spanbar__handle{position:absolute;right:-6px;top:0;bottom:0;width:10px;padding:0;border:0;background:transparent;cursor:col-resize;touch-action:none;z-index:1}
|
|
559
622
|
.sm-spanbar__handle::after{content:"";position:absolute;left:4px;top:8px;bottom:8px;width:2px;border-radius:1px;background:var(--text-muted)}
|
|
560
623
|
.sm-spanbar__handle:focus-visible{outline:none}
|
|
@@ -565,7 +628,7 @@ body:has(.sm-admin){margin:0}
|
|
|
565
628
|
|
|
566
629
|
.sm-group{display:flex;flex-direction:column;gap:10px;padding:2px 0 0 12px;border-left:2px solid var(--line)}
|
|
567
630
|
.sm-list{display:flex;flex-direction:column;gap:8px;align-items:stretch}
|
|
568
|
-
.sm-listrow{border:1px solid var(--
|
|
631
|
+
.sm-listrow{border:1px solid var(--input-border);border-radius:var(--radius-md);background:var(--input-bg);min-width:0}
|
|
569
632
|
.sm-listrow__head{display:flex;align-items:center;gap:2px;height:var(--control-h-sm);padding:0 6px 0 6px}
|
|
570
633
|
.sm-listrow__toggle{
|
|
571
634
|
flex:1;min-width:0;display:flex;align-items:center;gap:6px;height:100%;padding:0 6px;
|
|
@@ -579,22 +642,27 @@ body:has(.sm-admin){margin:0}
|
|
|
579
642
|
/* ── data ──────────────────────────────────────────────────────────── */
|
|
580
643
|
/* The list card: the scrolling region under the top bar (ListView). */
|
|
581
644
|
.sm-listwrap{flex:1;min-height:0;overflow:auto;background:var(--surface-form);border-radius:var(--radius-card-lg)}
|
|
645
|
+
.sm-listnotice{display:flex;flex-direction:column;gap:var(--card-gap);margin-bottom:var(--card-gap);flex:none}
|
|
646
|
+
.sm-listnotice:empty{display:none}
|
|
582
647
|
/* The rows sit in a centred column of at most 1200px inside the card,
|
|
583
648
|
under --table-top of air reserved for the coming search and filters. */
|
|
584
649
|
.sm-table{display:flex;flex-direction:column;padding:var(--table-pad);padding-top:var(--table-top);max-width:1200px;margin:0 auto}
|
|
585
650
|
.sm-table__head,.sm-row{display:grid;gap:12px;align-items:center;padding:0 8px}
|
|
586
651
|
.sm-table__head{
|
|
587
|
-
height:40px;border-bottom:
|
|
652
|
+
height:40px;border-bottom:var(--table-rule);font-family:var(--meta-font);font-weight:500;
|
|
588
653
|
font-size:var(--meta-size);letter-spacing:var(--caps-tracking);color:var(--text-muted);
|
|
589
654
|
text-transform:var(--caps-transform);position:sticky;top:0;background:var(--surface-form);z-index:1;
|
|
590
655
|
}
|
|
591
|
-
/* Rows
|
|
592
|
-
|
|
656
|
+
/* Rows: a hairline under every row in both looks (the header's too in the
|
|
657
|
+
warm look, 2026-09-09; none in the neutral, 2026-09-25). The rule is a
|
|
658
|
+
pseudo-element, not a border: a border would follow the rounded corners
|
|
659
|
+
the neutral hover fill has, and the line must stay straight. */
|
|
593
660
|
.sm-table__body{display:flex;flex-direction:column}
|
|
594
661
|
.sm-row{
|
|
595
|
-
height:var(--row-h);border-radius:
|
|
596
|
-
border:0;
|
|
662
|
+
position:relative;height:var(--row-h);border-radius:var(--row-radius);background:transparent;
|
|
663
|
+
border:0;font:inherit;color:inherit;text-align:left;width:100%;
|
|
597
664
|
}
|
|
665
|
+
.sm-row::after{content:"";position:absolute;left:0;right:0;bottom:0;border-bottom:var(--row-rule);pointer-events:none}
|
|
598
666
|
.sm-row--clickable{cursor:pointer}
|
|
599
667
|
.sm-row--clickable:hover{background:var(--surface-inset)}
|
|
600
668
|
.sm-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
|
|
@@ -637,9 +705,10 @@ body:has(.sm-admin){margin:0}
|
|
|
637
705
|
.sm-dotmenu:disabled{opacity:.4;cursor:default}
|
|
638
706
|
.sm-dotmenu:disabled:hover{background:var(--btn-secondary-bg);color:var(--text-muted)}
|
|
639
707
|
.sm-dotmenu--sm{width:var(--button-h-sm);height:var(--button-h-sm);font-size:var(--text-sm)}
|
|
640
|
-
|
|
708
|
+
/* Fixed, placed by ActionMenu from the button's rect (2026-09-26): a table cell clips absolute children. */
|
|
709
|
+
.sm-picker--menu{position:fixed;width:220px;z-index:60}
|
|
641
710
|
|
|
642
|
-
/* Status pill: a dot before the word
|
|
711
|
+
/* Status pill: a dot before the word. */
|
|
643
712
|
.sm-badge{
|
|
644
713
|
display:inline-flex;align-items:center;gap:6px;height:var(--badge-h);padding:0 10px;border-radius:var(--radius-btn);
|
|
645
714
|
font-size:var(--text-sm);font-weight:600;letter-spacing:var(--caps-tracking);white-space:nowrap;
|
|
@@ -652,16 +721,16 @@ body:has(.sm-admin){margin:0}
|
|
|
652
721
|
.sm-dot{width:6px;height:6px;border-radius:var(--radius-round);flex:none}
|
|
653
722
|
|
|
654
723
|
/* ── navigation bits ───────────────────────────────────────────────── */
|
|
655
|
-
/* Tabs read as
|
|
656
|
-
the
|
|
657
|
-
|
|
724
|
+
/* Tabs read as an in-card segmented control: a white track with the chosen
|
|
725
|
+
option in the tile grey and 10/6px corners in the neutral look, a pill
|
|
726
|
+
track with a white shadowed option in the warm one — all tokens. */
|
|
658
727
|
.sm-tabs{
|
|
659
|
-
display:flex;gap:2px;padding:var(--tabs-pad);background:var(--tabs-bg);border-radius:var(--radius
|
|
728
|
+
display:flex;gap:2px;padding:var(--tabs-pad);background:var(--tabs-bg);border-radius:var(--tabs-radius);
|
|
660
729
|
border-bottom:var(--card-divider);flex:none;
|
|
661
730
|
}
|
|
662
731
|
.sm-tab{
|
|
663
732
|
flex:1;display:flex;align-items:center;justify-content:center;border:0;background:transparent;
|
|
664
|
-
padding:var(--seg-pad-y) 10px;border-radius:var(--radius
|
|
733
|
+
padding:var(--seg-pad-y) 10px;border-radius:var(--tab-radius);font:inherit;font-weight:500;
|
|
665
734
|
cursor:pointer;color:var(--text-muted);white-space:nowrap;
|
|
666
735
|
}
|
|
667
736
|
.sm-tab:hover{color:var(--text)}
|
|
@@ -680,7 +749,7 @@ body:has(.sm-admin){margin:0}
|
|
|
680
749
|
color:var(--text-muted);font:inherit;font-weight:500;cursor:pointer;white-space:nowrap;
|
|
681
750
|
}
|
|
682
751
|
.sm-seg__opt:hover{color:var(--text)}
|
|
683
|
-
.sm-seg__opt[aria-pressed="true"]{background:var(--
|
|
752
|
+
.sm-seg__opt[aria-pressed="true"]{background:var(--seg-active-bg);color:var(--text);font-weight:600;box-shadow:var(--shadow-seg)}
|
|
684
753
|
/* A locale the record does not have yet: subtle, still a button (it opens the add pane). */
|
|
685
754
|
.sm-seg__opt--absent{color:var(--text-subtle)}
|
|
686
755
|
/* f.radio as a pill row (spec 2026-09-14 §5): small chips a step below the tabs and the
|
|
@@ -693,10 +762,12 @@ body:has(.sm-admin){margin:0}
|
|
|
693
762
|
}
|
|
694
763
|
.sm-pill:hover{color:var(--text);background:var(--surface-inset)}
|
|
695
764
|
.sm-pill[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent);font-weight:600}
|
|
765
|
+
.sm-pills--disabled{opacity:.6}
|
|
766
|
+
.sm-pill:disabled{cursor:default}
|
|
696
767
|
/* The custom-CSS box: code, no wrapping, no spellcheck. */
|
|
697
768
|
.sm-css{font-family:var(--font-mono);font-size:12px;line-height:1.5;white-space:pre;overflow-x:auto}
|
|
698
769
|
/* Switch (f.boolean, the SEO noindex toggle): a pill track, knob slides right when on. */
|
|
699
|
-
.sm-switch{width:36px;height:20px;padding:2px;border:0;border-radius:var(--radius-round);background:var(--
|
|
770
|
+
.sm-switch{width:36px;height:20px;padding:2px;border:0;border-radius:var(--radius-round);background:var(--switch-bg);cursor:pointer;display:inline-flex;align-items:center;flex:none}
|
|
700
771
|
.sm-switch[aria-checked="true"]{background:var(--accent)}
|
|
701
772
|
.sm-switch__knob{width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}
|
|
702
773
|
.sm-switch[aria-checked="true"] .sm-switch__knob{transform:translateX(16px)}
|
|
@@ -706,15 +777,26 @@ body:has(.sm-admin){margin:0}
|
|
|
706
777
|
.sm-choices{display:flex;flex-direction:column;gap:8px;padding:4px 0}
|
|
707
778
|
.sm-choice{display:flex;align-items:center;gap:8px;font-size:var(--text-md);cursor:pointer}
|
|
708
779
|
.sm-choice input{accent-color:var(--accent);width:16px;height:16px;margin:0;flex:none}
|
|
780
|
+
/* A choice with a description line (the invite modal's roles): input on the first line, text stacked. */
|
|
781
|
+
.sm-choice--desc{align-items:flex-start}
|
|
782
|
+
.sm-choice--desc input{margin-top:2px}
|
|
783
|
+
.sm-choice__label{display:block;font-weight:500}
|
|
784
|
+
.sm-choice__desc{display:block;margin-top:2px;font-size:var(--text-sm);color:var(--text-muted)}
|
|
709
785
|
/* A soft counter past its limit (SEO title and description). */
|
|
710
786
|
.sm-counter--over{color:var(--warn)}
|
|
711
787
|
/* The page glyph beside the page title in the empty-selection inspector head. */
|
|
712
788
|
.sm-pageglyph{width:10px;height:13px;border:1.5px solid var(--text-muted);border-radius:var(--radius-xs);flex:none}
|
|
713
789
|
.sm-divider{height:1px;background:var(--line);flex:none}
|
|
714
790
|
.sm-sectionlabel{display:flex;align-items:center;justify-content:space-between;gap:8px}
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
791
|
+
/* The overline: a small uppercase tracked heading for a group — the
|
|
792
|
+
inspector's Spacing & layout / Advanced, the picker's Add to <zone> and
|
|
793
|
+
Site, the outline's zones, the Settings nav (2026-09-26; a mono face before). */
|
|
794
|
+
.sm-overline,.sm-sectionlabel--caps>.sm-label{
|
|
795
|
+
font-family:var(--font-sans);font-size:var(--text-xs);font-weight:600;letter-spacing:var(--tracking-tag);text-transform:uppercase;color:var(--text-muted);
|
|
796
|
+
}
|
|
797
|
+
.sm-stale{padding:8px 20px 0}
|
|
798
|
+
.sm-lock{display:inline-flex;align-items:center;margin-left:6px;color:var(--text-muted);vertical-align:middle}
|
|
799
|
+
.sm-presence{margin:0;padding:6px 20px 0;font-size:13px;color:var(--text-muted)}
|
|
718
800
|
.sm-banner{
|
|
719
801
|
display:flex;gap:14px;align-items:flex-start;padding:12px 16px;border-radius:var(--radius-md);
|
|
720
802
|
font-size:var(--text-md);
|
|
@@ -727,7 +809,7 @@ body:has(.sm-admin){margin:0}
|
|
|
727
809
|
|
|
728
810
|
/* ── cards ─────────────────────────────────────────────────────────── */
|
|
729
811
|
/* The inspector column (editor, entry and global forms) is a stack of
|
|
730
|
-
cards
|
|
812
|
+
cards (grey tiles in the neutral look, white cards in the warm). */
|
|
731
813
|
.sm-inspector{
|
|
732
814
|
display:flex;flex-direction:column;gap:var(--card-gap);min-height:0;overflow:auto;
|
|
733
815
|
background:var(--bar-bg);border-left:var(--bar-border);
|
|
@@ -757,10 +839,12 @@ body:has(.sm-admin){margin:0}
|
|
|
757
839
|
|
|
758
840
|
/* ── editor ────────────────────────────────────────────────────────── */
|
|
759
841
|
/* canvas · handle · inspector. The handle column is the gutter (8px in the
|
|
760
|
-
|
|
761
|
-
drag maths (ui/resize.ts) also applies
|
|
842
|
+
warm look; 8px in the neutral, whose gutter is 0). The calc() is the
|
|
843
|
+
maximum the drag maths (ui/resize.ts) also applies — the row less the
|
|
844
|
+
handle and the canvas's 440px minimum — so a window that shrinks after a
|
|
762
845
|
drag never leaves the canvas squeezed. */
|
|
763
|
-
.sm-editor{flex:1;min-height:0;display:grid;grid-template-columns:1fr max(var(--gutter),8px) min(var(--inspector-w),
|
|
846
|
+
.sm-editor{flex:1;min-height:0;display:grid;grid-template-columns:1fr max(var(--gutter),8px) min(var(--inspector-w),calc(100% - max(var(--gutter),8px) - 440px))}
|
|
847
|
+
.sm-editor[inert],.sm-form[inert]{opacity:.6}
|
|
764
848
|
/* The drag-to-resize handle (spec 2026-09-10 §3): fills its column, draws a
|
|
765
849
|
2px line down its centre on hover and while dragging — a shade off the
|
|
766
850
|
ground, since the col-resize cursor already says it drags (2026-09-10);
|
|
@@ -788,7 +872,7 @@ body:has(.sm-admin){margin:0}
|
|
|
788
872
|
}
|
|
789
873
|
.sm-blockglyph{width:14px;height:10px;border:1.5px solid var(--text-muted);border-radius:var(--radius-xs);flex:none}
|
|
790
874
|
/* The selected block's label: a pill riding the outline in the warm look,
|
|
791
|
-
a
|
|
875
|
+
a 4px-cornered chip in the neutral one. */
|
|
792
876
|
.sm-blocktag{
|
|
793
877
|
position:absolute;top:0;left:0;transform:var(--blocktag-shift);background:var(--selection);color:var(--on-accent);
|
|
794
878
|
font-family:var(--blocktag-font);font-size:var(--blocktag-size);font-weight:600;line-height:1.3;
|
|
@@ -798,15 +882,15 @@ body:has(.sm-admin){margin:0}
|
|
|
798
882
|
.sm-blocktag--global{background:var(--selection-global)}
|
|
799
883
|
.sm-blocktag--inside{transform:var(--blocktag-shift-inside)}
|
|
800
884
|
.sm-blocktoolbar{
|
|
801
|
-
display:flex;gap:2px;padding:3px;background:var(--toolbar-bg);border-radius:var(--radius
|
|
885
|
+
display:flex;gap:2px;padding:3px;background:var(--toolbar-bg);border-radius:var(--toolbar-radius);
|
|
802
886
|
box-shadow:var(--shadow-float);
|
|
803
887
|
}
|
|
804
888
|
.sm-blocktoolbar__note{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--toolbar-fg);opacity:.7;padding:4px 8px}
|
|
805
889
|
/* The insert affordance between sections: a labelled pill (the label is
|
|
806
|
-
|
|
890
|
+
8px-cornered in the neutral look, a pill in the warm). */
|
|
807
891
|
.sm-plus{
|
|
808
892
|
display:inline-flex;align-items:center;gap:8px;height:var(--plus-h);min-width:var(--plus-h);padding:var(--plus-pad);
|
|
809
|
-
border-radius:var(--radius
|
|
893
|
+
border-radius:var(--plus-radius);border:0;background:var(--plus-bg);color:var(--plus-fg);
|
|
810
894
|
font:500 var(--text-lg)/1 var(--font-sans);cursor:pointer;box-shadow:var(--plus-shadow);white-space:nowrap;
|
|
811
895
|
transition:background .12s,transform .12s;
|
|
812
896
|
}
|
|
@@ -819,14 +903,15 @@ body:has(.sm-admin){margin:0}
|
|
|
819
903
|
}
|
|
820
904
|
.sm-plus__label{display:var(--plus-label);font-size:var(--text-sm)}
|
|
821
905
|
.sm-guide{height:1px;background:color-mix(in srgb,var(--selection) 35%,transparent)}
|
|
906
|
+
/* Outline rows: white boxes on the tile in the neutral look, hairlined in the warm one. */
|
|
822
907
|
.sm-outline-row{
|
|
823
908
|
display:flex;align-items:center;justify-content:space-between;gap:4px;
|
|
824
|
-
height:var(--outline-row-h);border-radius:var(--radius
|
|
825
|
-
color:var(--text);font-weight:500;background:
|
|
826
|
-
border:
|
|
909
|
+
height:var(--outline-row-h);border-radius:var(--outline-row-radius);padding:0 6px 0 12px;
|
|
910
|
+
color:var(--text);font-weight:500;background:var(--outline-row-bg);
|
|
911
|
+
border:var(--outline-row-border);
|
|
827
912
|
}
|
|
828
913
|
.sm-outline-row--clickable{cursor:pointer}
|
|
829
|
-
.sm-outline-row--clickable:hover{background:var(--
|
|
914
|
+
.sm-outline-row--clickable:hover{background:var(--control-hover)}
|
|
830
915
|
/* Selected and locked rows are read by their fill, so they drop the hairline —
|
|
831
916
|
border-color, not border, so every row keeps the same box. */
|
|
832
917
|
.sm-outline-row--selected,.sm-outline-row--selected:hover{
|
|
@@ -842,7 +927,7 @@ body:has(.sm-admin){margin:0}
|
|
|
842
927
|
.sm-outline-row--grip .sm-outline-row__label{flex:1}
|
|
843
928
|
|
|
844
929
|
.sm-picker{
|
|
845
|
-
width:300px;background:var(--
|
|
930
|
+
width:300px;background:var(--menu-bg);border:var(--menu-border);border-radius:var(--radius-md);
|
|
846
931
|
padding:6px;box-shadow:var(--shadow-pop);
|
|
847
932
|
}
|
|
848
933
|
.sm-picker__item{
|
|
@@ -871,7 +956,7 @@ body:has(.sm-admin){margin:0}
|
|
|
871
956
|
.sm-refpicker__title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
872
957
|
.sm-refrow{
|
|
873
958
|
display:flex;align-items:center;gap:6px;height:var(--control-h-sm);padding:0 6px 0 10px;
|
|
874
|
-
border:1px solid var(--
|
|
959
|
+
border:1px solid var(--input-border);border-radius:var(--radius-md);background:var(--input-bg);min-width:0;
|
|
875
960
|
}
|
|
876
961
|
.sm-refrow:has(.sm-grip){padding-left:6px}
|
|
877
962
|
.sm-refrow:hover .sm-grip{opacity:1}
|
|
@@ -882,7 +967,7 @@ body:has(.sm-admin){margin:0}
|
|
|
882
967
|
.sm-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
|
|
883
968
|
.sm-tag{
|
|
884
969
|
display:inline-flex;align-items:center;gap:6px;height:var(--control-h-sm);padding:0 10px;border:0;
|
|
885
|
-
border-radius:var(--radius
|
|
970
|
+
border-radius:var(--tag-radius);background:var(--surface-inset);color:var(--text);font:inherit;font-size:var(--text-sm);white-space:nowrap;
|
|
886
971
|
transition:background .2s;
|
|
887
972
|
}
|
|
888
973
|
.sm-tag--flash{background:var(--accent-soft)}
|
|
@@ -894,6 +979,46 @@ body:has(.sm-admin){margin:0}
|
|
|
894
979
|
.sm-combo--tag .sm-input{height:var(--control-h-sm);padding-right:10px}
|
|
895
980
|
.sm-combo--tag .sm-combo__chevron{display:none}
|
|
896
981
|
.sm-combo--tag .sm-combo__list{right:auto;width:240px}
|
|
982
|
+
/* ── date and datetime pickers (spec 2026-09-25) ──────────────────────
|
|
983
|
+
The text box with a calendar button as its suffix; for datetime an hour
|
|
984
|
+
and a minute select beside it; the popover a month grid on the menu
|
|
985
|
+
surface, 7 × 32px cells in 252px, flipping upward when the room below
|
|
986
|
+
is short (opensUp, as the combobox). */
|
|
987
|
+
.sm-date{position:relative;display:flex;flex-direction:column;gap:8px;min-width:0}
|
|
988
|
+
.sm-date__row{display:flex;align-items:center;gap:8px;min-width:0}
|
|
989
|
+
.sm-inputwrap.sm-date__wrap{flex:1;min-width:0;padding-right:6px}
|
|
990
|
+
.sm-date__btn{
|
|
991
|
+
width:28px;height:28px;flex:none;display:grid;place-items:center;padding:0;
|
|
992
|
+
border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer;
|
|
993
|
+
}
|
|
994
|
+
.sm-date__btn:hover,.sm-date__btn[aria-expanded="true"]{background:var(--hover);color:var(--text)}
|
|
995
|
+
.sm-date__time{width:auto;flex:none;padding-right:30px}
|
|
996
|
+
.sm-date__colon{color:var(--text-muted);margin:0 -4px}
|
|
997
|
+
/* left is inline: the popover's right edge under the calendar button (2026-09-26; flush left before). */
|
|
998
|
+
.sm-cal{
|
|
999
|
+
position:absolute;top:calc(var(--control-h) + 4px);left:0;z-index:60;width:252px;padding:8px;
|
|
1000
|
+
background:var(--menu-bg);border:var(--menu-border);border-radius:var(--radius-md);box-shadow:var(--shadow-pop);
|
|
1001
|
+
}
|
|
1002
|
+
.sm-cal--up{top:auto;bottom:calc(100% + 4px)}
|
|
1003
|
+
.sm-cal__head{display:flex;align-items:center;gap:4px;height:28px;margin-bottom:4px}
|
|
1004
|
+
.sm-cal__month{flex:1;text-align:center;font-weight:600;font-size:var(--text-sm)}
|
|
1005
|
+
.sm-cal__nav{
|
|
1006
|
+
width:24px;height:24px;display:grid;place-items:center;padding:0;border:0;border-radius:var(--radius-sm);
|
|
1007
|
+
background:transparent;color:var(--text-muted);cursor:pointer;
|
|
1008
|
+
}
|
|
1009
|
+
.sm-cal__nav:hover{background:var(--hover);color:var(--text)}
|
|
1010
|
+
.sm-cal__grid{display:grid;grid-template-columns:repeat(7,32px);gap:2px}
|
|
1011
|
+
.sm-cal__wd{height:24px;display:grid;place-items:center;font-size:var(--text-xs);color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}
|
|
1012
|
+
.sm-cal__day{
|
|
1013
|
+
height:32px;padding:0;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text);
|
|
1014
|
+
font:inherit;font-size:var(--text-sm);cursor:pointer;
|
|
1015
|
+
}
|
|
1016
|
+
.sm-cal__day:hover{background:var(--nav-active-bg)}
|
|
1017
|
+
.sm-cal__day--out{color:var(--text-subtle)}
|
|
1018
|
+
.sm-cal__day--today{box-shadow:inset 0 0 0 1px var(--accent-line)}
|
|
1019
|
+
.sm-cal__day--focus{box-shadow:inset 0 0 0 2px var(--accent)}
|
|
1020
|
+
.sm-cal__day[aria-pressed="true"],.sm-cal__day[aria-pressed="true"]:hover{background:var(--accent);color:var(--on-accent)}
|
|
1021
|
+
.sm-cal__foot{display:flex;justify-content:flex-end;padding:6px 4px 0}
|
|
897
1022
|
.sm-dashed{
|
|
898
1023
|
border:1px dashed var(--line-dashed);border-radius:var(--radius-lg);
|
|
899
1024
|
display:flex;align-items:center;justify-content:center;gap:8px;color:var(--text-subtle);
|
|
@@ -903,13 +1028,15 @@ body:has(.sm-admin){margin:0}
|
|
|
903
1028
|
/* ── media ─────────────────────────────────────────────────────────── */
|
|
904
1029
|
/* The single track is minmax(0,1fr), not auto: an auto track grows to the panel's own width, so the
|
|
905
1030
|
panel's max-width:100% would cap at nothing and a 1200px History panel ran past a laptop viewport. */
|
|
906
|
-
.sm-modal{position:fixed;inset:0;z-index:70;background:
|
|
1031
|
+
.sm-modal{position:fixed;inset:0;z-index:70;background:var(--scrim);display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);place-items:center;padding:24px}
|
|
907
1032
|
.sm-modal__panel{
|
|
908
|
-
max-width:100%;max-height:100%;display:flex;flex-direction:column;background:var(--
|
|
909
|
-
border:var(--menu-border);border-radius:var(--radius-
|
|
1033
|
+
max-width:100%;max-height:100%;display:flex;flex-direction:column;background:var(--menu-bg);
|
|
1034
|
+
border:var(--menu-border);border-radius:var(--radius-modal);box-shadow:var(--shadow-modal);overflow:hidden;
|
|
910
1035
|
}
|
|
911
1036
|
.sm-modal__head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 10px;border-bottom:var(--card-divider)}
|
|
912
1037
|
.sm-modal__body{padding:12px 16px;overflow:auto;display:flex;flex-direction:column;gap:10px;min-height:0}
|
|
1038
|
+
/* Fields on the white modal panel take the tile tone, like the dialog's (2026-09-25). */
|
|
1039
|
+
.sm-modal__panel .sm-input,.sm-modal__panel .sm-textarea,.sm-modal__panel .sm-select{background:var(--surface)}
|
|
913
1040
|
.sm-modal__foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px 14px;border-top:var(--card-divider)}
|
|
914
1041
|
.sm-modal__body--flush{padding:0;gap:0;flex:1}
|
|
915
1042
|
/* ── history (spec 2026-09-13) ─────────────────────────────────── */
|
|
@@ -928,7 +1055,8 @@ body:has(.sm-admin){margin:0}
|
|
|
928
1055
|
border:1px dashed var(--line-dashed);border-radius:var(--radius-lg);background:var(--input-bg);color:var(--text-muted);
|
|
929
1056
|
display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:18px;text-align:center;
|
|
930
1057
|
}
|
|
931
|
-
|
|
1058
|
+
/* The picker's drop bar: tall enough to aim a drag at (2026-09-25). */
|
|
1059
|
+
.sm-dropzone--bar{padding:28px 10px;font-size:var(--text-sm)}
|
|
932
1060
|
.sm-mediagrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}
|
|
933
1061
|
.sm-mediacard{
|
|
934
1062
|
display:flex;flex-direction:column;gap:4px;padding:6px;background:transparent;border:1.5px solid transparent;
|
|
@@ -942,12 +1070,14 @@ body:has(.sm-admin){margin:0}
|
|
|
942
1070
|
.sm-mediacard__name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
943
1071
|
.sm-mediacard__meta{font-size:var(--text-sm);color:var(--text-muted)}
|
|
944
1072
|
.sm-media{display:flex;flex-direction:column;gap:6px}
|
|
945
|
-
/* The filled image field: a canvas (
|
|
946
|
-
|
|
947
|
-
|
|
1073
|
+
/* The filled image field: a canvas (a shade off its ground — a neutral
|
|
1074
|
+
grey in light mode, lighter in dark — up to 300px tall) with the cropped frame
|
|
1075
|
+
contained inside it; the frame keeps its aspect and is sized by the
|
|
1076
|
+
widget as min(300px tall, full width). The inset tone alone read as an
|
|
1077
|
+
empty field (2026-09-25). */
|
|
948
1078
|
.sm-media__canvas{
|
|
949
1079
|
display:flex;align-items:center;justify-content:center;max-height:300px;overflow:hidden;
|
|
950
|
-
border-radius:var(--radius-md);background:var(--
|
|
1080
|
+
border-radius:var(--radius-md);background:var(--canvas-ground);
|
|
951
1081
|
}
|
|
952
1082
|
.sm-media__thumb{position:relative;overflow:hidden;max-width:100%;max-height:300px;background:var(--surface-inset)}
|
|
953
1083
|
.sm-media__thumb>img,.sm-media__thumb>video{position:absolute;max-width:none;display:block}
|
|
@@ -978,8 +1108,11 @@ body:has(.sm-admin){margin:0}
|
|
|
978
1108
|
/* The Settings area (spec 2026-09-25 §5): a 200px nav card beside the
|
|
979
1109
|
page, both under the main column; the page keeps its own top bar. */
|
|
980
1110
|
.sm-settings{display:grid;grid-template-columns:200px 1fr;column-gap:var(--gutter);flex:1;min-height:0}
|
|
1111
|
+
/* The nav card starts under the page's top bar, so its top meets the page's
|
|
1112
|
+
grey card across the gutter; no heading (asked for 2026-09-26; an 18px
|
|
1113
|
+
title, then an overline, lived above the links earlier that day). */
|
|
981
1114
|
.sm-settings__nav{
|
|
982
|
-
display:flex;flex-direction:column;gap:2px;padding:var(--table-pad);overflow:auto;
|
|
1115
|
+
display:flex;flex-direction:column;gap:2px;padding:var(--table-pad);overflow:auto;margin-top:var(--topbar-h);
|
|
983
1116
|
background:var(--surface-form);border-radius:var(--radius-card-lg);
|
|
984
1117
|
}
|
|
985
1118
|
.sm-settings__link{
|
|
@@ -988,10 +1121,46 @@ body:has(.sm-admin){margin:0}
|
|
|
988
1121
|
.sm-settings__link:hover{background:var(--surface-inset)}
|
|
989
1122
|
.sm-settings__link[aria-current="page"],.sm-settings__link[aria-current="page"]:hover{background:var(--nav-active-bg);color:var(--nav-active-fg);font-weight:600}
|
|
990
1123
|
.sm-settings__page{display:flex;flex-direction:column;min-width:0;min-height:0}
|
|
1124
|
+
|
|
1125
|
+
/* ── dialog card (design_handoff_smoodly_neutral/components/ConfirmModal.html) ── */
|
|
1126
|
+
/* The scrim covers the whole admin, frame included, above every modal
|
|
1127
|
+
(a History restore asks from inside one). The card: 440px, the modal
|
|
1128
|
+
radius, 28/28/24 padding, sections 20px apart. The confirm question and
|
|
1129
|
+
the page form dialogs share it (ui/Dialog.tsx). */
|
|
1130
|
+
.sm-scrim{position:fixed;inset:0;z-index:80;background:var(--scrim);display:grid;place-items:center;padding:24px}
|
|
1131
|
+
.sm-dialog{
|
|
1132
|
+
width:440px;max-width:100%;display:flex;flex-direction:column;gap:20px;padding:28px 28px 24px;
|
|
1133
|
+
background:var(--menu-bg);border:var(--menu-border);border-radius:var(--radius-modal);box-shadow:var(--shadow-modal);
|
|
1134
|
+
color:var(--text);
|
|
1135
|
+
}
|
|
1136
|
+
.sm-dialog__head{display:flex;flex-direction:column;gap:8px}
|
|
1137
|
+
.sm-dialog__titlerow{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
|
|
1138
|
+
.sm-dialog__title{font:var(--title-weight) var(--title-size)/1.3 var(--title-font);letter-spacing:var(--title-tracking);margin:0}
|
|
1139
|
+
.sm-dialog__close{
|
|
1140
|
+
width:28px;height:28px;flex:none;margin:-4px -6px 0 0;display:grid;place-items:center;
|
|
1141
|
+
border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:14px;line-height:1;cursor:pointer;
|
|
1142
|
+
}
|
|
1143
|
+
.sm-dialog__close:hover{background:var(--hover);color:var(--text)}
|
|
1144
|
+
.sm-dialog__close:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
|
|
1145
|
+
/* The confirm's consequence sits right under the title, closer than the sections. */
|
|
1146
|
+
.sm-confirm .sm-dialog__body{margin:-12px 0 0}
|
|
1147
|
+
.sm-dialog__body{margin:0;color:var(--text-secondary);line-height:1.55}
|
|
1148
|
+
/* The context chip: the subject's name (truncates) and its path (never does). */
|
|
1149
|
+
.sm-dialog__context{
|
|
1150
|
+
display:flex;align-items:center;gap:10px;height:36px;padding:0 12px;
|
|
1151
|
+
background:var(--surface);border-radius:var(--radius-lg);color:var(--text-muted);font-size:var(--text-sm);white-space:nowrap;
|
|
1152
|
+
}
|
|
1153
|
+
.sm-dialog__context strong{font-weight:500;color:var(--text);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;font-size:var(--text-md)}
|
|
1154
|
+
.sm-dialog__context code{font-family:var(--font-mono);flex:none}
|
|
1155
|
+
/* A form dialog's fields: white fields on the white card get the tile tone instead. */
|
|
1156
|
+
.sm-dialog__form{display:flex;flex-direction:column;gap:14px}
|
|
1157
|
+
.sm-dialog__form .sm-input,.sm-dialog__form .sm-select,.sm-dialog__form .sm-inputwrap{background:var(--surface)}
|
|
1158
|
+
.sm-dialog__form .sm-inputwrap>.sm-input{background:transparent}
|
|
1159
|
+
.sm-dialog__actions{display:flex;justify-content:flex-end;gap:10px}
|
|
991
1160
|
`;
|
|
992
1161
|
/** Where the theme toggle's choice is remembered, browser-side only. */
|
|
993
1162
|
export const THEME_KEY = "smoodly-theme";
|
|
994
|
-
/**
|
|
1163
|
+
/** Which look the developer is comparing (see the warm block): "warm" applies it, anything else is the default. */
|
|
995
1164
|
export const LOOK_KEY = "smoodly-look";
|
|
996
1165
|
/** Applies a remembered choice before first paint, so a dark-mode editor never
|
|
997
1166
|
* gets a white flash, and the inspector never jumps to a dragged width. It
|
|
@@ -1004,7 +1173,7 @@ const THEME_BOOT = `(function(){try{var e=document.currentScript.parentElement,`
|
|
|
1004
1173
|
`l=localStorage.getItem(${JSON.stringify(LOOK_KEY)}),` +
|
|
1005
1174
|
`w=localStorage.getItem(${JSON.stringify(INSPECTOR_W_KEY)});` +
|
|
1006
1175
|
`if(t==="dark"||t==="light")e.setAttribute("data-theme",t);` +
|
|
1007
|
-
`if(l==="
|
|
1176
|
+
`if(l==="warm")e.setAttribute("data-look",l);` +
|
|
1008
1177
|
`if(w&&/^\\d+$/.test(w)&&+w>=${MIN_INSPECTOR_W})e.style.setProperty("--inspector-w",w+"px")}catch(e){}})()`;
|
|
1009
1178
|
/** One <style> element and the theme boot, rendered once by AdminLayout. */
|
|
1010
1179
|
export function AdminStyles() {
|