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.
Files changed (148) hide show
  1. package/README.md +214 -40
  2. package/bin/smoodly.js +6 -0
  3. package/dist/admin/client-ops.js +1 -0
  4. package/dist/admin/editor/EditorView.js +100 -22
  5. package/dist/admin/editor/InsertPicker.d.ts +14 -0
  6. package/dist/admin/editor/InsertPicker.js +37 -7
  7. package/dist/admin/editor/InspectorFields.js +1 -1
  8. package/dist/admin/editor/Outline.js +2 -2
  9. package/dist/admin/editor/PageSettings.js +1 -1
  10. package/dist/admin/editor/SeoSettings.js +1 -1
  11. package/dist/admin/editor/autosave.d.ts +4 -1
  12. package/dist/admin/editor/autosave.js +24 -1
  13. package/dist/admin/editor/global-edit.d.ts +5 -1
  14. package/dist/admin/editor/global-edit.js +15 -5
  15. package/dist/admin/editor/locale-url.d.ts +7 -4
  16. package/dist/admin/editor/locale-url.js +14 -7
  17. package/dist/admin/editor/useGlobalEdit.d.ts +1 -1
  18. package/dist/admin/editor/useGlobalEdit.js +1 -1
  19. package/dist/admin/editor/usePageLocale.js +9 -1
  20. package/dist/admin/forms/CropEditor.d.ts +4 -2
  21. package/dist/admin/forms/CropEditor.js +6 -3
  22. package/dist/admin/forms/DatePicker.d.ts +9 -0
  23. package/dist/admin/forms/DatePicker.js +133 -0
  24. package/dist/admin/forms/FieldWidget.js +11 -5
  25. package/dist/admin/forms/ImagePreview.d.ts +9 -0
  26. package/dist/admin/forms/ImagePreview.js +11 -0
  27. package/dist/admin/forms/MediaWidget.d.ts +8 -2
  28. package/dist/admin/forms/MediaWidget.js +13 -13
  29. package/dist/admin/forms/RichtextElementCard.js +1 -1
  30. package/dist/admin/forms/RichtextImageCard.js +14 -9
  31. package/dist/admin/forms/date-picker.d.ts +44 -0
  32. package/dist/admin/forms/date-picker.js +117 -0
  33. package/dist/admin/forms/elements-context.d.ts +3 -0
  34. package/dist/admin/forms/elements-context.js +7 -2
  35. package/dist/admin/forms/time-zone-context.d.ts +7 -0
  36. package/dist/admin/forms/time-zone-context.js +15 -0
  37. package/dist/admin/forms/useRichtextEditor.js +10 -1
  38. package/dist/admin/next/bridge.d.ts +2 -1
  39. package/dist/admin/next/bridge.js +35 -5
  40. package/dist/admin/next/create-admin.d.ts +4 -0
  41. package/dist/admin/next/create-admin.js +3 -1
  42. package/dist/admin/next/index.d.ts +1 -0
  43. package/dist/admin/ops-impl.js +74 -24
  44. package/dist/admin/ops.d.ts +31 -12
  45. package/dist/admin/serialize.d.ts +2 -0
  46. package/dist/admin/serialize.js +1 -0
  47. package/dist/admin/shell/AdminApp.d.ts +3 -1
  48. package/dist/admin/shell/AdminApp.js +42 -2
  49. package/dist/admin/shell/EntriesList.js +17 -22
  50. package/dist/admin/shell/EntryForm.js +91 -13
  51. package/dist/admin/shell/GlobalForm.js +68 -9
  52. package/dist/admin/shell/GlobalList.js +10 -20
  53. package/dist/admin/shell/IconRail.js +14 -5
  54. package/dist/admin/shell/InviteModal.js +9 -5
  55. package/dist/admin/shell/ListView.js +2 -2
  56. package/dist/admin/shell/MediaScreen.js +11 -1
  57. package/dist/admin/shell/MembersPage.js +33 -15
  58. package/dist/admin/shell/PageDialogs.d.ts +26 -0
  59. package/dist/admin/shell/PageDialogs.js +38 -0
  60. package/dist/admin/shell/PagesList.js +101 -74
  61. package/dist/admin/shell/RouteLink.js +1 -1
  62. package/dist/admin/shell/SchemaNotice.d.ts +4 -0
  63. package/dist/admin/shell/SchemaNotice.js +4 -0
  64. package/dist/admin/shell/SettingsView.js +11 -26
  65. package/dist/admin/shell/live-url.d.ts +4 -3
  66. package/dist/admin/shell/live-url.js +12 -3
  67. package/dist/admin/shell/locale-memory.d.ts +8 -0
  68. package/dist/admin/shell/locale-memory.js +23 -0
  69. package/dist/admin/shell/members-list.d.ts +2 -0
  70. package/dist/admin/shell/members-list.js +5 -0
  71. package/dist/admin/shell/page-dialogs.d.ts +9 -0
  72. package/dist/admin/shell/page-dialogs.js +19 -0
  73. package/dist/admin/shell/presence-context.d.ts +9 -0
  74. package/dist/admin/shell/presence-context.js +35 -0
  75. package/dist/admin/shell/presence-realtime.d.ts +3 -0
  76. package/dist/admin/shell/presence-realtime.js +22 -0
  77. package/dist/admin/shell/presence.d.ts +51 -0
  78. package/dist/admin/shell/presence.js +90 -0
  79. package/dist/admin/shell/router.d.ts +10 -7
  80. package/dist/admin/shell/router.js +18 -9
  81. package/dist/admin/shell/settings.d.ts +0 -6
  82. package/dist/admin/shell/settings.js +4 -5
  83. package/dist/admin/shell/stale.d.ts +28 -0
  84. package/dist/admin/shell/stale.js +17 -0
  85. package/dist/admin/tree-ops.js +3 -0
  86. package/dist/admin/ui/ActionMenu.js +26 -6
  87. package/dist/admin/ui/Combobox.d.ts +5 -0
  88. package/dist/admin/ui/Combobox.js +1 -1
  89. package/dist/admin/ui/ConfirmDialog.d.ts +8 -0
  90. package/dist/admin/ui/ConfirmDialog.js +30 -0
  91. package/dist/admin/ui/Dialog.d.ts +13 -0
  92. package/dist/admin/ui/Dialog.js +54 -0
  93. package/dist/admin/ui/HistoryModal.d.ts +2 -1
  94. package/dist/admin/ui/HistoryModal.js +7 -2
  95. package/dist/admin/ui/LockIcon.d.ts +4 -0
  96. package/dist/admin/ui/LockIcon.js +12 -0
  97. package/dist/admin/ui/PresenceLine.d.ts +6 -0
  98. package/dist/admin/ui/PresenceLine.js +11 -0
  99. package/dist/admin/ui/ResizeHandle.js +4 -4
  100. package/dist/admin/ui/StaleBanner.d.ts +5 -0
  101. package/dist/admin/ui/StaleBanner.js +9 -0
  102. package/dist/admin/ui/confirm.d.ts +35 -0
  103. package/dist/admin/ui/confirm.js +57 -0
  104. package/dist/admin/ui/primitives.d.ts +19 -4
  105. package/dist/admin/ui/primitives.js +12 -5
  106. package/dist/admin/ui/resize.d.ts +7 -4
  107. package/dist/admin/ui/resize.js +7 -4
  108. package/dist/admin/ui/theme.d.ts +1 -1
  109. package/dist/admin/ui/theme.js +373 -204
  110. package/dist/admin/validate.d.ts +4 -0
  111. package/dist/admin/validate.js +28 -0
  112. package/dist/cli/load-collections.d.ts +2 -0
  113. package/dist/cli/load-collections.js +26 -0
  114. package/dist/cli/main.d.ts +13 -0
  115. package/dist/cli/main.js +62 -0
  116. package/dist/cli/migrate.d.ts +23 -0
  117. package/dist/cli/migrate.js +64 -0
  118. package/dist/config.d.ts +4 -0
  119. package/dist/config.js +9 -0
  120. package/dist/draft-token.d.ts +31 -0
  121. package/dist/draft-token.js +41 -0
  122. package/dist/entry-store.d.ts +11 -8
  123. package/dist/entry-store.js +24 -10
  124. package/dist/env.d.ts +9 -0
  125. package/dist/env.js +19 -0
  126. package/dist/fields.d.ts +2 -0
  127. package/dist/fields.js +2 -0
  128. package/dist/index.d.ts +6 -3
  129. package/dist/index.js +4 -2
  130. package/dist/marks.d.ts +3 -0
  131. package/dist/marks.js +3 -0
  132. package/dist/migrations.d.ts +37 -0
  133. package/dist/migrations.js +73 -0
  134. package/dist/schema-version.d.ts +17 -0
  135. package/dist/schema-version.js +32 -0
  136. package/dist/sql-space.js +17 -0
  137. package/dist/sql.js +21 -0
  138. package/dist/store.d.ts +14 -8
  139. package/dist/store.js +30 -8
  140. package/dist/supabase-entry-store.d.ts +15 -5
  141. package/dist/supabase-entry-store.js +87 -22
  142. package/dist/supabase-store.d.ts +18 -5
  143. package/dist/supabase-store.js +83 -20
  144. package/dist/time-zone.d.ts +6 -0
  145. package/dist/time-zone.js +27 -0
  146. package/migrations/20260926120000_smoodly_v1.sql +535 -0
  147. package/migrations/20260926130000_smoodly_v2.sql +26 -0
  148. package/package.json +13 -3
@@ -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 design_handoff_smoodly_warm/tokens/*.css (the warm
11
- // look: Spruce accent, cream ground, cards instead of hairlines, pills).
12
- // Every rule below reads its colours, radii, sizes and letter case from
13
- // tokens, so the previous look survives as a token block alone — see the
14
- // TEMPORARY `technical` block further down. Hover/focus/disabled live here
15
- // rather than in inline styles, which is the whole reason for the stylesheet.
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:#B42318; --red-50:#FDECEC; --red-300:#F5A5A0;
23
+ --red-700:#C4372E; --red-50:#FBE9E7; --red-300:#F5A5A0;
22
24
 
23
- --bg:#F4F1EB; --canvas:#ECE8DF; --surface:#FFFFFF; --surface-form:#FDFCFA; --surface-inset:#F4F1EB;
24
- --input-bg:#FFFFFF; --input-hover-bg:#FFFFFF; --input-focus-bg:#FFFFFF; --input-border:var(--line);
25
- --line:#E8E3DA; --line-dashed:#D8D1C4; --line-soft:#EFEBE3;
26
- --text:#1F1D1A; --text-secondary:#4E4942; --text-muted:#7A746A; --text-subtle:#A39C90; --text-disabled:#C4BDB1;
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(31,29,26,.05); --press:rgba(31,29,26,.09); --control-hover:#F8F6F1;
30
- --btn-secondary-bg:var(--surface); --btn-secondary-hover:#F8F6F1; --tile-hover:var(--surface);
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
- --tabs-bg:var(--surface-inset); --tab-active-bg:var(--surface); --tab-active-fg:var(--text); --tab-active-shadow:var(--shadow-seg);
34
- --seg-bg:var(--canvas);
35
- --toolbar-bg:#1F1D1A; --toolbar-fg:#F4F1EB;
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(--surface-inset);
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:#1F1D1A;
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(40,30,10,.08);
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(0,0,0,.14);
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:#0B1F18;
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
- --bg:#1C1A17; --canvas:#141210; --surface:#27241F; --surface-form:#27241F; --surface-inset:#1C1A17;
68
- --input-bg:#211E1A; --input-hover-bg:#211E1A; --input-focus-bg:#211E1A;
69
- --line:#3A3630; --line-dashed:#4A453D; --line-soft:#3A3630;
70
- --text:#F1EDE6; --text-secondary:#C9C2B7; --text-muted:#9A9388; --text-subtle:#7C7568; --text-disabled:#5A5449;
71
- --hover:rgba(241,237,230,.05); --press:rgba(241,237,230,.09); --control-hover:#2E2A25;
72
- --btn-secondary-bg:var(--surface); --btn-secondary-hover:#2E2A25;
73
- --toolbar-bg:#0F0E0C; --toolbar-fg:#F1EDE6;
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:'Source Serif 4',Georgia,'Times New Roman',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:var(--radius-round); --blocktag-shift:translate(16px,-50%); --blocktag-shift-inside:translate(16px,8px);
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:8px; --radius-md:10px; --radius-lg:12px;
103
- --radius-card:14px; --radius-card-lg:16px; --radius-btn:999px; --radius-round:999px;
104
- --page-radius:4px 4px 0 0; --selection-radius:4px;
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; --frame-pad:24px;
109
- --rail-pad:22px 6px 16px; --rail-logo:none; --topbar-pad:0; --back-size:32px; --back-bg:var(--surface);
110
- --table-pad:8px 12px; --table-top:80px; --canvas-pad:24px 40px 0; --card-pad:16px 18px; --card-gap:12px; --form-pad:32px 40px;
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
- /* ── TEMPORARY: the original look, kept for side-by-side comparison while
116
- the warm restyle lands. Frozen copies of the three strings above as they
117
- were at tag `look-technical`; applied under `.sm-admin[data-look="technical"]`.
118
- Switch from the console: localStorage.setItem("smoodly-look","technical")
119
- and reload; removeItem to go back. Delete this block, the TECHNICAL_SHAPE /
120
- _EXTRA strings after it, `cascade`'s second call and the boot script's look
121
- branch once the look is decided. */
122
- const TECHNICAL_LIGHT = `
123
- --brand-600:#0038B1; --brand-500:#2554D6; --brand-300:#6E96FF;
124
- --brand-200:#A9C0FF; --brand-100:#DCE4F9; --brand-50:#E3EAFA;
125
- --gray-0:#FFFFFF; --gray-50:#F1F2F6; --gray-100:#E1E4EC; --gray-300:#C9D0E2;
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:var(--gray-50); --surface:var(--gray-0); --surface-inset:var(--gray-50);
132
- --input-bg:var(--gray-0); --line:var(--gray-100); --line-dashed:var(--gray-300);
133
- --text:var(--gray-900); --text-muted:var(--gray-600); --text-subtle:var(--gray-500);
134
- --accent:var(--brand-600); --on-accent:#FFFFFF; --accent-soft:var(--brand-50);
135
- --selection:var(--brand-600); --nav-active-bg:var(--brand-100); --nav-active-fg:var(--brand-600);
136
- --selection-global:#D2610A;
137
- --hover:rgba(15,20,32,.045); --press:rgba(15,20,32,.08);
138
- --control-hover:var(--gray-100);
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:var(--gray-900);
149
- --shadow-page:0 1px 2px rgba(0,0,0,.08), 0 8px 24px rgba(0,0,0,.06);
150
- --shadow-float:0 2px 8px rgba(0,0,0,.25);
151
- --shadow-seg:0 1px 2px rgba(0,0,0,.08);
152
- --focus-ring:0 0 0 3px var(--accent-soft);
153
- --shadow-pop:0 8px 32px rgba(0,0,0,.18);
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 TECHNICAL_DARK = `
161
- --bg:#0D0F14; --surface:#15181F; --surface-inset:#0D0F14; --input-bg:#1B1F28;
162
- --line:#2A2F3B; --line-dashed:#2A2F3B;
163
- --text:#EEF0F5; --text-muted:#8C94A8; --text-subtle:#6B7386;
164
- --accent:var(--brand-300); --on-accent:#06122F; --accent-soft:rgba(110,150,255,.16);
165
- --selection-global:#F2A35F;
166
- --nav-active-bg:rgba(110,150,255,.14); --nav-active-fg:var(--brand-200);
167
- --hover:rgba(238,240,245,.05); --press:rgba(238,240,245,.09);
168
- --control-hover:var(--input-bg);
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 8px 24px rgba(0,0,0,.35);
177
- --shadow-pop:0 8px 32px rgba(0,0,0,.5);
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 TECHNICAL_SCALE = `
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:9px; --text-xs:10px; --text-sm:11px; --text-md:12px;
185
- --text-lg:13px; --text-xl:14px; --text-2xl:15px; --text-3xl:20px; --text-4xl:30px;
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:1px; --radius-sm:3px; --radius-md:4px; --radius-round:999px;
189
- --control-h:28px; --control-h-lg:36px; --row-h:38px; --topbar-h:48px;
190
- --nav-w:72px; --inspector-w:380px;
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:1.5px solid var(--selection);
193
- --outline-selection-global:1.5px solid var(--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
- const TECHNICAL_DARK_EXTRA = `
231
- --input-focus-bg:#1B1F28; --text-secondary:#B8BFCF; --text-disabled:#4A5165;
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="technical"]', TECHNICAL_SCALE + TECHNICAL_SHAPE, TECHNICAL_LIGHT + TECHNICAL_LIGHT_EXTRA, TECHNICAL_DARK + TECHNICAL_DARK_EXTRA)}
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, with the warm look's gutter and frame padding (both 0 in
275
- the technical look, whose columns touch). The main column stacks the
276
- top bar over one card-shaped region: list, form or editor. */
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(--gutter);
279
- padding:0 var(--frame-pad) var(--frame-pad) 0;height:100vh;height:100dvh;overflow:hidden;background:var(--bg);
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 (design_handoff_smoodly_warm/components/IconRail.html): a
284
- 72px rail with 18px Lucide icons over a 10px label and a 42×34 active
285
- tile, sitting directly on the ground. The technical look gives it a
286
- surface, a hairline and the app icon on top — all tokens. */
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(--text);
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
- .sm-rail__logo{width:28px;height:28px;display:var(--rail-logo);flex:none}
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(--accent);outline-offset:-2px;box-shadow:none}
301
- .sm-rail__tile{position:relative;width:42px;height:34px;border-radius:var(--radius-md);display:grid;place-items:center;transition:background .12s}
302
- .sm-rail__btn:hover .sm-rail__tile{background:var(--tile-hover)}
303
- .sm-rail__btn[aria-current="page"],.sm-rail__btn[aria-expanded="true"]{color:var(--nav-active-fg);font-weight:600}
304
- .sm-rail__btn[aria-current="page"]:hover,.sm-rail__btn[aria-expanded="true"]:hover{color:var(--nav-active-fg)}
305
- .sm-rail__btn[aria-current="page"] .sm-rail__tile,.sm-rail__btn[aria-expanded="true"] .sm-rail__tile{background:var(--nav-active-bg)}
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(--accent);outline-offset:1px;box-shadow:none}
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(--surface);border:var(--menu-border);border-radius:var(--radius-md);box-shadow:var(--shadow-pop);
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(--surface-inset);color:inherit;outline:0;box-shadow:none}
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: serif at the doc-title size (sans and small in the technical look). */
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--mono{font-family:var(--font-mono);font-size:var(--text-sm)}
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
- .sm-inputwrap>.sm-input{height:auto;padding:0;background:transparent;border:0;box-shadow:none}
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(--input-border);border-radius:var(--radius-md);
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
- .sm-richtext__content:focus{background:var(--input-focus-bg);border-color:var(--selection);box-shadow:var(--focus-ring)}
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(--surface);border:var(--menu-border);border-radius:var(--radius-md);box-shadow:var(--shadow-pop);
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
- .sm-rtcard{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--surface);min-width:0}
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-rtcard__file{font-size:var(--text-sm);color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
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(--surface);border-radius:var(--radius-md);box-shadow:var(--shadow-pop);pointer-events:auto;
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(--line);border-radius:var(--radius-md);background:var(--surface);min-width:0}
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
- .sm-spanbar{display:flex;gap:2px;height:32px;background:var(--seg-bg);border-radius:var(--radius-md);padding:3px;user-select:none}
557
- .sm-spanbar__col{position:relative;display:flex;align-items:center;justify-content:center;min-width:0;background:var(--surface);border-radius:6px;font-size:var(--text-sm);color:var(--text-muted)}
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(--line);border-radius:var(--radius-md);background:var(--surface);min-width:0}
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:1px solid var(--line);font-family:var(--meta-font);font-weight:500;
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 are ruled: a hairline under the header and under every row
592
- (2026-09-09); the hover fill is square so it meets the rules. */
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:0;background:transparent;
596
- border:0;border-bottom:1px solid var(--line-soft);font:inherit;color:inherit;text-align:left;width:100%;
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
- .sm-picker--menu{position:absolute;top:calc(100% + 6px);right:0;width:220px;z-index:60}
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 in the warm look (none in the technical). */
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 a segmented pill in the warm look and as underlined tabs in
656
- the technical one; the difference is the track background and the
657
- active option's shadow (an inset 2px line draws the underline). */
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-btn);
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-btn);font:inherit;font-weight:500;
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(--surface);color:var(--text);font-weight:600;box-shadow:var(--shadow-seg)}
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(--seg-bg);cursor:pointer;display:inline-flex;align-items:center;flex:none}
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
- .sm-sectionlabel--mono>.sm-label{
716
- font-family:var(--font-mono);font-weight:400;letter-spacing:var(--tracking-tag);
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; the technical look draws them flush with a hairline between. */
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
- technical look, whose gutter is 0). The 50% is the half-row maximum the
761
- drag maths (ui/resize.ts) also applies, so a window that shrinks after a
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),50%)}
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 mono tag tucked in the corner in the technical one. */
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-btn);
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
- hidden in the technical look, leaving the 24px circle). */
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-round);border:0;background:var(--plus-bg);color:var(--plus-fg);
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-md);padding:0 6px 0 12px;
825
- color:var(--text);font-weight:500;background:transparent;
826
- border:1px solid var(--line);
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(--surface-inset)}
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(--surface);border:var(--menu-border);border-radius:var(--radius-md);
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(--line);border-radius:var(--radius-md);background:var(--surface);min-width:0;
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-sm);background:var(--surface-inset);color:var(--text);font:inherit;font-size:var(--text-sm);white-space:nowrap;
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:rgba(0,0,0,.45);display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);place-items:center;padding:24px}
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(--surface);
909
- border:var(--menu-border);border-radius:var(--radius-card);box-shadow:var(--shadow-pop);overflow:hidden;
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
- .sm-dropzone--bar{padding:10px;font-size:var(--text-sm)}
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 (inset ground, up to 300px tall) with
946
- the cropped frame contained inside it — the frame keeps its aspect and
947
- is sized by the widget as min(300px tall, full width). */
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(--surface-inset);
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
- /** TEMPORARY, see the technical block: which look the developer is comparing. */
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==="technical")e.setAttribute("data-look",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() {