@acms-subir/core 0.1.0 → 0.3.0

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 (237) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/cli/common.mjs +35 -0
  3. package/cli/legacy.mjs +317 -0
  4. package/cli/main.mjs +66 -0
  5. package/cli/palette.mjs +4 -0
  6. package/cli/preview.mjs +50 -0
  7. package/cli/remote.mjs +55 -0
  8. package/cli/themes.mjs +127 -0
  9. package/cli.mjs +2 -315
  10. package/deploy/Caddyfile +8 -0
  11. package/deploy/Dockerfile +34 -0
  12. package/deploy/compose.https.yml +21 -0
  13. package/deploy/compose.yml +46 -0
  14. package/docs/theme-authoring.md +103 -0
  15. package/email-runner.mjs +32 -0
  16. package/integration.mjs +193 -2
  17. package/ops-check.mjs +27 -0
  18. package/package.json +35 -12
  19. package/src/actions/index.ts +744 -38
  20. package/src/components/AiCleaner.tsx +291 -0
  21. package/src/components/AiSettings.tsx +575 -0
  22. package/src/components/CommandPalette.tsx +200 -0
  23. package/src/components/ContentList.astro +246 -0
  24. package/src/components/DesignAccess.tsx +182 -0
  25. package/src/components/DesignManager.tsx +455 -47
  26. package/src/components/EmailSettings.tsx +521 -0
  27. package/src/components/EventPage.astro +178 -0
  28. package/src/components/LegalPage.astro +27 -0
  29. package/src/components/LinksManager.tsx +216 -97
  30. package/src/components/NavManager.tsx +83 -38
  31. package/src/components/ThemeScript.astro +50 -0
  32. package/src/components/ThemeSections.astro +57 -0
  33. package/src/components/ThemeSectionsEditor.tsx +513 -0
  34. package/src/components/booking/BookingFlow.astro +150 -0
  35. package/src/components/booking/HoursEditor.astro +63 -0
  36. package/src/components/builder/PageBuilder.tsx +10 -2
  37. package/src/components/editor/EventPanel.tsx +401 -0
  38. package/src/components/editor/FormatDock.tsx +81 -0
  39. package/src/components/editor/LivePane.tsx +122 -0
  40. package/src/components/editor/MobileToolbar.tsx +93 -0
  41. package/src/components/editor/PostEditor.tsx +826 -271
  42. package/src/components/editor/PreviewOverlay.tsx +242 -43
  43. package/src/components/editor/extensions/calendar.tsx +51 -7
  44. package/src/components/editor/extensions/cards.tsx +17 -1
  45. package/src/components/editor/extensions/codeBlock.tsx +1 -1
  46. package/src/components/editor/extensions/events.tsx +153 -0
  47. package/src/components/editor/extensions/infoCards.tsx +16 -1
  48. package/src/components/editor/extensions/mediaCards.tsx +36 -2
  49. package/src/components/editor/extensions/slash.tsx +77 -9
  50. package/src/components/editor/extensions/toc.tsx +89 -0
  51. package/src/components/editor/extensions/toggle.tsx +70 -0
  52. package/src/components/site/Pager.astro +24 -0
  53. package/src/components/site/PostCard.astro +64 -0
  54. package/src/components/site/TagLabel.astro +11 -0
  55. package/src/layouts/Admin.astro +289 -49
  56. package/src/layouts/Site.astro +331 -57
  57. package/src/lib/agent-api.ts +13 -0
  58. package/src/lib/agent-discovery.ts +40 -0
  59. package/src/lib/agent.ts +114 -0
  60. package/src/lib/ai-config.ts +58 -0
  61. package/src/lib/ai-schema.ts +22 -0
  62. package/src/lib/ai.ts +90 -0
  63. package/src/lib/analytics.ts +121 -0
  64. package/src/lib/api-keys.ts +65 -0
  65. package/src/lib/api.ts +52 -0
  66. package/src/lib/auth.ts +25 -5
  67. package/src/lib/backup/content.ts +36 -0
  68. package/src/lib/backup/unzip.ts +12 -1
  69. package/src/lib/backup/zip.ts +1 -1
  70. package/src/lib/booking/agent.ts +108 -0
  71. package/src/lib/booking/availability.ts +221 -0
  72. package/src/lib/booking/emails.ts +115 -0
  73. package/src/lib/booking/forms.ts +77 -0
  74. package/src/lib/booking/service.ts +277 -0
  75. package/src/lib/booking/view.ts +54 -0
  76. package/src/lib/calendar/agent-schema.ts +48 -0
  77. package/src/lib/calendar/agent.ts +136 -0
  78. package/src/lib/calendar/api.ts +81 -0
  79. package/src/lib/calendar/cards.ts +102 -0
  80. package/src/lib/calendar/config.ts +52 -0
  81. package/src/lib/calendar/data.ts +130 -0
  82. package/src/lib/calendar/events.ts +261 -0
  83. package/src/lib/calendar/feeds.ts +43 -0
  84. package/src/lib/calendar/hooks.ts +38 -0
  85. package/src/lib/calendar/http.ts +30 -0
  86. package/src/lib/calendar/ics-write.ts +120 -0
  87. package/src/lib/calendar/ics.ts +15 -5
  88. package/src/lib/calendar/import.ts +203 -0
  89. package/src/lib/calendar/render.ts +120 -37
  90. package/src/lib/calendar/rrule.ts +149 -0
  91. package/src/lib/calendar/seo.ts +48 -0
  92. package/src/lib/design-service.ts +58 -0
  93. package/src/lib/designDiff.ts +145 -0
  94. package/src/lib/designPreview.ts +112 -0
  95. package/src/lib/documents/cleanup.ts +31 -0
  96. package/src/lib/documents/extract.ts +154 -0
  97. package/src/lib/documents/vendor.d.ts +4 -0
  98. package/src/lib/drafts.ts +131 -0
  99. package/src/lib/dynamicBlocks.ts +79 -7
  100. package/src/lib/email/accounts.ts +55 -0
  101. package/src/lib/email/config.ts +86 -0
  102. package/src/lib/email/migration.ts +24 -0
  103. package/src/lib/email/providers.ts +89 -0
  104. package/src/lib/email/service.ts +78 -0
  105. package/src/lib/email/store.ts +167 -0
  106. package/src/lib/email/templates.ts +18 -0
  107. package/src/lib/email/types.ts +32 -0
  108. package/src/lib/email/webhooks.ts +87 -0
  109. package/src/lib/email.ts +15 -0
  110. package/src/lib/env.ts +1 -1
  111. package/src/lib/legal/index.ts +25 -0
  112. package/src/lib/mobile/bookings.ts +73 -0
  113. package/src/lib/mobile/calendar.ts +85 -0
  114. package/src/lib/mobile/content.ts +85 -0
  115. package/src/lib/mobile/http.ts +63 -0
  116. package/src/lib/mobile/route.ts +20 -0
  117. package/src/lib/ops.ts +8 -0
  118. package/src/lib/preview.ts +21 -1
  119. package/src/lib/repo/migrations.ts +254 -0
  120. package/src/lib/repo/sql.ts +956 -46
  121. package/src/lib/repo/types.ts +140 -3
  122. package/src/lib/scheduler.ts +25 -0
  123. package/src/lib/schema.ts +362 -0
  124. package/src/lib/search-i18n.ts +3 -0
  125. package/src/lib/socialIcons.ts +32 -0
  126. package/src/lib/tagColor.ts +11 -0
  127. package/src/lib/theme.ts +59 -40
  128. package/src/lib/themeTokens.ts +174 -0
  129. package/src/lib/umami.ts +108 -0
  130. package/src/lib/webhooks.ts +139 -0
  131. package/src/middleware.ts +36 -3
  132. package/src/pages/404.astro +23 -0
  133. package/src/pages/[...slug].astro +10 -5
  134. package/src/pages/account/[action].astro +53 -0
  135. package/src/pages/admin/ai.astro +12 -0
  136. package/src/pages/admin/c/[collection]/[id].astro +14 -4
  137. package/src/pages/admin/c/[collection]/index.astro +127 -91
  138. package/src/pages/admin/calendar/bookings.astro +400 -0
  139. package/src/pages/admin/calendar/calendars.astro +265 -0
  140. package/src/pages/admin/calendar/events/[id].astro +56 -0
  141. package/src/pages/admin/calendar/events/index.astro +408 -0
  142. package/src/pages/admin/calendar/index.ts +4 -0
  143. package/src/pages/admin/calendar/integrations.astro +221 -0
  144. package/src/pages/admin/calendar/resources/[id].astro +180 -0
  145. package/src/pages/admin/calendar/resources/index.astro +106 -0
  146. package/src/pages/admin/calendar/resources/link.astro +196 -0
  147. package/src/pages/admin/design.astro +16 -4
  148. package/src/pages/admin/email.astro +13 -0
  149. package/src/pages/admin/index.astro +237 -87
  150. package/src/pages/admin/links.astro +3 -3
  151. package/src/pages/admin/login.astro +14 -10
  152. package/src/pages/admin/navigation.astro +8 -2
  153. package/src/pages/admin/pages/[id].astro +14 -3
  154. package/src/pages/admin/pages/index.astro +41 -47
  155. package/src/pages/admin/settings.astro +475 -276
  156. package/src/pages/admin/tags.astro +4 -4
  157. package/src/pages/admin/users.astro +38 -28
  158. package/src/pages/api/agent/docs.ts +33 -0
  159. package/src/pages/api/agent/index.ts +21 -0
  160. package/src/pages/api/ai/clean.ts +13 -0
  161. package/src/pages/api/ai/draft.ts +14 -0
  162. package/src/pages/api/ai/settings.ts +53 -0
  163. package/src/pages/api/ai/test.ts +12 -0
  164. package/src/pages/api/backup.ts +8 -21
  165. package/src/pages/api/calendar/availability.ts +35 -0
  166. package/src/pages/api/calendar/bookings/[id].ts +49 -0
  167. package/src/pages/api/calendar/bookings/index.ts +73 -0
  168. package/src/pages/api/calendar/calendars.ts +35 -0
  169. package/src/pages/api/calendar/docs.ts +64 -0
  170. package/src/pages/api/calendar/events/[id].ts +63 -0
  171. package/src/pages/api/calendar/events/index.ts +112 -0
  172. package/src/pages/api/calendar/resources.ts +34 -0
  173. package/src/pages/api/design/capabilities.ts +10 -0
  174. package/src/pages/api/design/index.ts +58 -0
  175. package/src/pages/api/design/keys.ts +24 -0
  176. package/src/pages/api/design/media.ts +32 -0
  177. package/src/pages/api/email/run.ts +11 -0
  178. package/src/pages/api/email/settings.ts +61 -0
  179. package/src/pages/api/email/webhooks/[provider].ts +4 -0
  180. package/src/pages/api/mcp.ts +59 -0
  181. package/src/pages/api/media/upload.ts +2 -2
  182. package/src/pages/api/ops/status.ts +39 -0
  183. package/src/pages/api/restore.ts +27 -37
  184. package/src/pages/api/search.ts +18 -4
  185. package/src/pages/api/v1/availability.ts +7 -0
  186. package/src/pages/api/v1/bookings.ts +17 -0
  187. package/src/pages/api/v1/calendars.ts +7 -0
  188. package/src/pages/api/v1/content/[id].ts +7 -0
  189. package/src/pages/api/v1/content/index.ts +7 -0
  190. package/src/pages/api/v1/events.ts +7 -0
  191. package/src/pages/api/v1/resources.ts +7 -0
  192. package/src/pages/author/[slug].astro +43 -35
  193. package/src/pages/blog/[slug].astro +140 -66
  194. package/src/pages/blog/index.astro +95 -30
  195. package/src/pages/blog/tag/[slug].astro +45 -40
  196. package/src/pages/book/[resource]/[link].astro +70 -0
  197. package/src/pages/book/[resource]/index.astro +63 -0
  198. package/src/pages/book/[resource].ics.ts +38 -0
  199. package/src/pages/book/index.astro +47 -0
  200. package/src/pages/book/manage/[token].astro +108 -0
  201. package/src/pages/calendar/[slug].ics.ts +27 -0
  202. package/src/pages/calendar/feed.ics.ts +15 -0
  203. package/src/pages/calendar/index.astro +191 -0
  204. package/src/pages/embed/book/[resource]/[link].astro +33 -0
  205. package/src/pages/embed/calendar/[slug].astro +43 -0
  206. package/src/pages/events/[slug].astro +74 -0
  207. package/src/pages/events/[slug].ics.ts +25 -0
  208. package/src/pages/index.astro +9 -3
  209. package/src/pages/legal/privacy.astro +4 -0
  210. package/src/pages/legal/terms.astro +4 -0
  211. package/src/pages/links.astro +33 -7
  212. package/src/pages/llms.txt.ts +4 -0
  213. package/src/pages/preview/[type]/[id].astro +34 -8
  214. package/src/pages/search.astro +40 -20
  215. package/src/pages/sitemap.xml.ts +16 -1
  216. package/src/styles/admin.css +928 -105
  217. package/src/styles/cards.css +101 -60
  218. package/src/styles/editor.css +532 -102
  219. package/src/styles/email-settings.css +117 -0
  220. package/src/styles/sections.css +12 -0
  221. package/src/styles/site.css +938 -278
  222. package/src/styles/theme-editor.css +135 -0
  223. package/src/theme-sdk/contract.d.mts +619 -0
  224. package/src/theme-sdk/contract.mjs +80 -0
  225. package/src/theme-sdk/index.ts +15 -0
  226. package/src/theme-sdk/tokens.d.mts +148 -0
  227. package/src/theme-sdk/tokens.mjs +52 -0
  228. package/src/themes/editorial/templates/home.astro +4 -4
  229. package/src/themes/editorial/templates/post-minimal.astro +2 -2
  230. package/src/themes/editorial/theme.css +22 -37
  231. package/src/themes/editorial/theme.json +23 -3
  232. package/src/themes/field/theme.json +26 -9
  233. package/src/themes/ink/theme.json +30 -12
  234. package/src/themes/night/theme.css +4 -7
  235. package/src/themes/night/theme.json +27 -10
  236. package/src/virtual.d.ts +14 -0
  237. package/src/worker.ts +5 -1
@@ -1,51 +1,55 @@
1
- /* Two-Tone Studio — dark slate chrome, light canvas, signal-orange accent.
2
- All admin surfaces read only these tokens; island namespaces (.ml- .lm- .dm- .nm-)
3
- share the same kit primitives below. */
1
+ /* Inset Paper — warm stone shell, one rounded paper panel, signal-orange accent.
2
+ Light and Night themes share one token set, switched by html[data-theme].
3
+ Every admin surface and island reads only these tokens. Selection is a
4
+ tinted fill, never an accent edge stripe. Orange is reserved for actions,
5
+ focus, the active nav icon and charts. */
4
6
  *, *::before, *::after { box-sizing: border-box; }
5
7
  :root {
6
- /* canvas (light) */
7
- --bg: #eef0f4;
8
- --panel: #ffffff;
9
- --panel-2: #f4f5f8;
10
- --line: #e3e5ec;
11
- --line-strong: #cfd3dc;
12
- --text: #1a1d25;
13
- --muted: #666d7c;
14
- --faint: #8f95a3;
15
-
16
- /* sidebar chrome (dark slate) */
17
- --side-bg: #22252e;
18
- --side-line: #32363f;
19
- --side-text: #f0f2f7;
20
- --side-muted: #9aa0af;
21
- --side-faint: #6e7482;
22
- --side-hover: rgb(255 255 255 / 5%);
23
- --side-active: #3a332c;
24
- --side-accent: #ff8a4c;
8
+ /* surfaces */
9
+ --shell: #e8e6e1; /* app background behind the panel */
10
+ --bg: #fbfaf8; /* the paper panel / page canvas */
11
+ --panel: #fdfcfb; /* raised cards, inputs, popovers */
12
+ --panel-2: #f4f1ec; /* subtle fills, table heads */
13
+ --hover: rgb(60 52 40 / 5%);
14
+ --sel: #efebe4; /* selected row / nav / segment track */
15
+ --line: #ece8e1;
16
+ --line-strong: #dcd8d0;
17
+
18
+ /* text */
19
+ --text: #24211c;
20
+ --text-2: #4c4841;
21
+ --muted: #7d776e;
22
+ --faint: #a19b91;
25
23
 
26
24
  /* accent — signal orange */
27
25
  --accent: #ee5d20;
28
26
  --accent-strong: #d94f15;
29
27
  --accent-soft: rgb(238 93 32 / 10%);
30
- --accent-ring: rgb(238 93 32 / 18%);
31
- --accent-deep: #c2410c;
28
+ --accent-ring: rgb(238 93 32 / 22%);
29
+ --accent-deep: #c2410c; /* accent as text (links, draft status) */
30
+ --on-accent: #fff;
32
31
 
33
32
  /* status */
34
33
  --green: #127442;
35
34
  --green-soft: #ddf4e7;
35
+ --blue: #2f5fb3;
36
+ --blue-soft: rgb(47 95 179 / 11%);
36
37
  --amber: #93660c;
37
38
  --amber-soft: #faeed2;
38
- --red: #d24545;
39
- --red-soft: rgb(210 69 69 / 10%);
39
+ --red: #c03b3b;
40
+ --red-soft: rgb(192 59 59 / 10%);
41
+
42
+ /* code islands stay dark in both themes */
43
+ --code-bg: #1f1d1a;
44
+ --code-text: #e9e5de;
40
45
 
41
- /* dark code islands (stay dark on the light canvas) */
42
- --code-bg: #1f232c;
43
- --code-text: #e6e9f0;
46
+ --dim: rgb(60 52 40 / 28%);
47
+ --chart-fill: rgb(238 93 32 / 8%);
44
48
 
45
49
  /* radius scale */
46
50
  --r-sm: 8px;
47
51
  --r-md: 10px;
48
- --r-lg: 16px;
52
+ --r-lg: 14px;
49
53
  --r-xl: 20px;
50
54
  --r-full: 999px;
51
55
  --radius: var(--r-lg);
@@ -55,14 +59,56 @@
55
59
  --s-5: 20px; --s-6: 24px; --s-8: 32px; --s-10: 40px;
56
60
 
57
61
  /* elevation */
58
- --shadow-sm: 0 1px 2px rgb(26 29 37 / 6%);
59
- --shadow-card: 0 1px 2px rgb(26 29 37 / 5%), 0 6px 18px rgb(26 29 37 / 6%);
60
- --shadow-pop: 0 4px 10px rgb(26 29 37 / 8%), 0 16px 40px rgb(26 29 37 / 16%);
62
+ --shadow-sm: 0 1px 2px rgb(60 52 40 / 6%);
63
+ --shadow-card: 0 1px 2px rgb(60 52 40 / 4%);
64
+ --shadow-pop: 0 4px 10px rgb(60 52 40 / 8%), 0 18px 44px rgb(60 52 40 / 18%);
65
+
66
+ --tabbar-h: 0px;
67
+ color-scheme: light;
68
+ }
69
+ :root[data-theme='dark'] {
70
+ --shell: #141311;
71
+ --bg: #1c1b19;
72
+ --panel: #22211e;
73
+ --panel-2: #262421;
74
+ --hover: rgb(255 248 235 / 5%);
75
+ --sel: #2e2b27;
76
+ --line: #2b2926;
77
+ --line-strong: #3a3733;
78
+
79
+ --text: #ece8e1;
80
+ --text-2: #c7c1b8;
81
+ --muted: #8f887e;
82
+ --faint: #767067;
83
+
84
+ --accent: #f06a30;
85
+ --accent-strong: #ff7a40;
86
+ --accent-soft: rgb(240 106 48 / 14%);
87
+ --accent-ring: rgb(240 106 48 / 30%);
88
+ --accent-deep: #ff9b6b;
89
+
90
+ --green: #5cc98e;
91
+ --green-soft: rgb(92 201 142 / 14%);
92
+ --blue: #8fb4ff;
93
+ --blue-soft: rgb(143 180 255 / 13%);
94
+ --amber: #e3b456;
95
+ --amber-soft: rgb(227 180 86 / 14%);
96
+ --red: #f07b7b;
97
+ --red-soft: rgb(240 123 123 / 13%);
98
+
99
+ --code-bg: #121110;
100
+
101
+ --dim: rgb(0 0 0 / 50%);
102
+ --chart-fill: rgb(240 106 48 / 12%);
103
+
104
+ --shadow-sm: 0 1px 2px rgb(0 0 0 / 30%);
105
+ --shadow-card: 0 1px 2px rgb(0 0 0 / 25%);
106
+ --shadow-pop: 0 4px 12px rgb(0 0 0 / 30%), 0 20px 50px rgb(0 0 0 / 50%);
107
+ color-scheme: dark;
61
108
  }
62
- html { color-scheme: light; }
63
109
  body {
64
110
  margin: 0;
65
- background: var(--bg);
111
+ background: var(--shell);
66
112
  color: var(--text);
67
113
  font-family: 'Inter', system-ui, -apple-system, sans-serif;
68
114
  font-size: 13.5px;
@@ -70,65 +116,218 @@ body {
70
116
  -webkit-font-smoothing: antialiased;
71
117
  }
72
118
  a { color: var(--accent-deep); text-decoration: none; }
119
+ .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
120
+ kbd {
121
+ font: 600 10.5px/1 Inter, system-ui, sans-serif; color: var(--faint);
122
+ border: 1px solid var(--line-strong); border-radius: 4px; padding: 2px 5px;
123
+ }
73
124
 
74
- /* shell */
125
+ /* ---- shell: sidebar on the stone, content on one inset paper panel ---- */
75
126
  .shell { display: flex; min-height: 100vh; }
76
127
  .sidebar {
77
128
  width: 232px; flex: 0 0 232px;
78
- background: var(--side-bg);
79
- border-right: 1px solid var(--side-line);
80
- padding: 18px 12px;
81
- display: flex; flex-direction: column; gap: 4px;
129
+ padding: 10px 10px 8px;
130
+ display: flex; flex-direction: column; gap: 2px;
82
131
  position: sticky; top: 0; height: 100vh;
83
132
  }
84
- .brand { display: flex; align-items: center; gap: 10px; padding: 2px 8px 14px; }
85
- .brand-name { font-weight: 700; font-size: 14.5px; letter-spacing: -0.01em; color: var(--side-text); }
86
- .brand-sub { font-size: 11px; color: var(--side-faint); margin-top: -2px; }
133
+ .brand { display: flex; align-items: center; gap: 9px; padding: 6px 8px 12px; min-width: 0; }
134
+ .brand-name { font-weight: 700; font-size: 13.5px; letter-spacing: -0.01em; color: var(--text); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
135
+ .brand-sub { font-size: 11px; color: var(--faint); margin-top: -2px; }
136
+ .icon-btn {
137
+ display: inline-grid; place-items: center; width: 28px; height: 28px; flex: 0 0 auto;
138
+ border: 0; background: none; color: var(--muted); border-radius: var(--r-sm); cursor: pointer; padding: 0;
139
+ }
140
+ .icon-btn:hover { background: var(--hover); color: var(--text); }
141
+ .icon-btn svg { width: 16px; height: 16px; }
142
+ .side-search {
143
+ display: flex; align-items: center; gap: 8px; width: 100%;
144
+ padding: 6px 9px; margin-bottom: 4px; border-radius: 9px;
145
+ background: rgb(255 255 255 / 45%); border: 1px solid var(--line-strong);
146
+ color: var(--muted); font: inherit; cursor: pointer; text-align: left;
147
+ }
148
+ :root[data-theme='dark'] .side-search { background: var(--hover); }
149
+ .side-search:hover { color: var(--text); }
150
+ .side-search svg { width: 15px; height: 15px; }
151
+ .side-search span { flex: 1; }
152
+ .nav-scroll { flex: 1; overflow-y: auto; margin: 4px -4px 0; padding: 0 4px; }
87
153
  .nav-item {
88
154
  display: flex; align-items: center; gap: 9px;
89
- padding: 7px 10px; border-radius: var(--r-md);
90
- color: var(--side-muted); font-weight: 500;
155
+ padding: 6px 9px; border-radius: var(--r-sm);
156
+ color: var(--text-2); font-weight: 500; white-space: nowrap;
91
157
  }
92
158
  .nav-item svg { width: 15px; height: 15px; flex: 0 0 auto; }
93
- .nav-item:hover { color: var(--side-text); background: var(--side-hover); }
94
- .nav-item.active { color: #fff; background: var(--side-active); font-weight: 600; }
95
- .nav-item.active svg { color: var(--side-accent); }
96
- .nav-item .count { margin-left: auto; font-size: 11px; color: var(--side-faint); }
97
- .nav-item.active .count { color: var(--side-muted); }
98
- .nav-sep { height: 1px; background: var(--side-line); margin: 10px 8px; }
99
- .sidebar-foot { margin-top: auto; padding: 10px 9px 0; font-size: 11.5px; color: var(--side-faint); border-top: 1px solid var(--side-line); }
100
- .sidebar-foot a { color: var(--side-muted); }
101
-
102
- /* main */
103
- .main { flex: 1; min-width: 0; }
159
+ .nav-item:hover { background: rgb(255 255 255 / 45%); color: var(--text); }
160
+ :root[data-theme='dark'] .nav-item:hover { background: var(--hover); }
161
+ .nav-item.active { background: var(--bg); color: var(--text); font-weight: 600; box-shadow: var(--shadow-sm), 0 0 0 1px var(--line); }
162
+ :root[data-theme='dark'] .nav-item.active { background: var(--sel); box-shadow: none; }
163
+ .nav-item.active svg { color: var(--accent); }
164
+ .nav-item .count { margin-left: auto; font-size: 11px; color: var(--faint); font-variant-numeric: tabular-nums; }
165
+ .nav-group > summary {
166
+ list-style: none; display: flex; align-items: center; gap: 4px; cursor: pointer; user-select: none;
167
+ font-size: 11px; font-weight: 600; color: var(--muted); padding: 12px 6px 4px;
168
+ }
169
+ .nav-group > summary::-webkit-details-marker { display: none; }
170
+ .nav-group > summary svg { width: 12px; height: 12px; transition: transform 0.15s; }
171
+ .nav-group:not([open]) > summary svg { transform: rotate(-90deg); }
172
+ .nav-group > summary:hover { color: var(--text); }
173
+ .sidebar-foot { position: relative; margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--line-strong); }
174
+ .account {
175
+ display: flex; align-items: center; gap: 9px; width: 100%;
176
+ padding: 6px; border: 0; border-radius: var(--r-md); background: none;
177
+ font: inherit; color: var(--text); text-align: left; cursor: pointer;
178
+ }
179
+ .account:hover { background: rgb(255 255 255 / 45%); }
180
+ :root[data-theme='dark'] .account:hover { background: var(--hover); }
181
+ .account .who { flex: 1; min-width: 0; line-height: 1.25; }
182
+ .account .who b { display: block; font-size: 12.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
183
+ .account .who small { color: var(--muted); font-size: 11px; }
184
+ .account > svg { width: 15px; height: 15px; color: var(--muted); }
185
+ .avatar {
186
+ width: 26px; height: 26px; border-radius: 50%; flex: 0 0 auto; overflow: hidden;
187
+ display: grid; place-items: center; font-size: 10px; font-weight: 700;
188
+ background: var(--sel); color: var(--text-2);
189
+ }
190
+ .avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
191
+ .menu-pop {
192
+ position: absolute; left: 0; right: 0; bottom: calc(100% + 6px); z-index: 40;
193
+ background: var(--panel); border: 1px solid var(--line-strong); border-radius: var(--r-lg);
194
+ box-shadow: var(--shadow-pop); padding: 6px;
195
+ }
196
+ .menu-pop[hidden] { display: none; }
197
+ .menu-label { font-size: 10.5px; font-weight: 600; color: var(--muted); padding: 4px 8px 6px; text-transform: uppercase; letter-spacing: 0.06em; }
198
+ .menu-item {
199
+ display: flex; align-items: center; gap: 9px; width: 100%;
200
+ padding: 7px 8px; border: 0; background: none; border-radius: var(--r-sm);
201
+ font: inherit; color: var(--text-2); cursor: pointer; text-align: left;
202
+ }
203
+ .menu-item:hover { background: var(--hover); color: var(--text); }
204
+ .menu-item svg { width: 15px; height: 15px; }
205
+ .menu-sep { height: 1px; background: var(--line); margin: 4px 2px; }
206
+
207
+ /* segmented control (kit primitive) */
208
+ .seg { display: inline-flex; gap: 1px; padding: 2px; border-radius: 9px; background: var(--sel); }
209
+ .seg > * {
210
+ display: inline-flex; align-items: center; justify-content: center; gap: 5px;
211
+ border: 0; background: none; font: inherit; font-size: 12px; font-weight: 600; color: var(--muted);
212
+ padding: 4px 10px; border-radius: 7px; cursor: pointer; white-space: nowrap;
213
+ }
214
+ .seg > *:hover { color: var(--text); }
215
+ .seg > .on, .seg > [aria-pressed='true'], .seg > [aria-selected='true'] { background: var(--bg); color: var(--text); box-shadow: var(--shadow-sm); }
216
+ :root[data-theme='dark'] .seg > .on, :root[data-theme='dark'] .seg > [aria-pressed='true'], :root[data-theme='dark'] .seg > [aria-selected='true'] { background: #3a3632; }
217
+ .seg svg { width: 13px; height: 13px; }
218
+ .seg.block { display: flex; margin: 0 4px 6px; }
219
+ .seg.block > * { flex: 1; }
220
+
221
+ /* collapsed rail (sidebar toggle, and the editor) */
222
+ .shell.is-rail .sidebar { width: 60px; flex-basis: 60px; align-items: center; }
223
+ .shell.is-rail .brand-name, .shell.is-rail .side-search span, .shell.is-rail .side-search kbd,
224
+ .shell.is-rail .nav-item span, .shell.is-rail .nav-item .count, .shell.is-rail .nav-group > summary,
225
+ .shell.is-rail .account .who, .shell.is-rail .account > svg { display: none; }
226
+ .shell.is-rail .brand { padding: 6px 0 12px; flex-direction: column; }
227
+ .shell.is-rail .side-search { width: auto; padding: 7px; }
228
+ .shell.is-rail .nav-item { justify-content: center; padding: 8px; }
229
+ .shell.is-rail .nav-scroll { margin: 4px 0 0; padding: 0; }
230
+ .shell.is-rail .menu-pop { right: auto; width: 220px; }
231
+
232
+ /* main panel */
233
+ .main { flex: 1; min-width: 0; padding: 8px 8px 8px 0; }
234
+ .panel {
235
+ height: calc(100vh - 16px); overflow-y: auto; position: relative;
236
+ background: var(--bg); border: 1px solid var(--line-strong); border-radius: var(--r-lg);
237
+ box-shadow: var(--shadow-sm);
238
+ }
104
239
  .topbar {
105
240
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
106
- padding: 12px 24px; border-bottom: 1px solid var(--line);
107
- position: sticky; top: 0; background: rgb(238 240 244 / 88%); backdrop-filter: blur(8px); z-index: 5;
241
+ padding: 9px 16px; min-height: 47px; border-bottom: 1px solid var(--line);
242
+ position: sticky; top: 0; z-index: 20;
243
+ background: color-mix(in srgb, var(--bg) 88%, transparent); backdrop-filter: blur(8px);
108
244
  }
109
- .crumb { color: var(--muted); font-size: 12.5px; }
245
+ .crumb { color: var(--muted); font-size: 12.5px; display: flex; align-items: center; gap: 6px; min-width: 0; }
110
246
  .crumb b { color: var(--text); font-weight: 600; }
111
- .content { padding: clamp(20px, 3vw, 40px); max-width: 1360px; margin-inline: auto; }
247
+ .crumb .sl { color: var(--line-strong); }
248
+ .topbar-actions { display: flex; align-items: center; gap: 6px; }
249
+ .content { padding: clamp(20px, 3vw, 36px); max-width: 1180px; margin-inline: auto; }
112
250
  .content-wide { max-width: none; }
251
+ .content-narrow { max-width: 900px; }
113
252
  .page-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; }
114
- .page-head h1 { font-size: 20px; margin: 0; letter-spacing: -0.01em; }
253
+ .page-head h1 { font-size: 24px; margin: 0; letter-spacing: -0.02em; }
254
+ .page-head .sub { color: var(--muted); margin: 2px 0 0; font-size: 13.5px; }
255
+ .page-actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
256
+
257
+ /* mobile chrome — bottom tab bar + More sheet (hidden on desktop) */
258
+ .tabbar { display: none; }
259
+ .sheet {
260
+ border: 0; padding: 0; margin: auto auto 0; width: 100%; max-width: 560px; max-height: 88vh;
261
+ background: var(--bg); color: var(--text);
262
+ border-radius: var(--r-xl) var(--r-xl) 0 0; box-shadow: var(--shadow-pop);
263
+ }
264
+ .sheet::backdrop { background: var(--dim); }
265
+ .sheet[open] { animation: sheet-in 0.2s ease-out; }
266
+ @keyframes sheet-in { from { transform: translateY(24px); opacity: 0.6; } }
267
+ .sheet-grab { width: 36px; height: 4px; border-radius: 9px; background: var(--line-strong); margin: 8px auto 6px; }
268
+ .sheet-body { padding: 4px 16px calc(20px + env(safe-area-inset-bottom)); overflow-y: auto; max-height: calc(88vh - 20px); }
269
+ .sheet-title { font-size: 20px; font-weight: 700; letter-spacing: -0.02em; margin: 4px 0 12px; }
270
+ .glist { border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--panel); overflow: hidden; margin-bottom: 12px; }
271
+ .glist > a, .glist > button, .glist > .glist-row {
272
+ display: flex; align-items: center; gap: 11px; width: 100%; min-height: 46px;
273
+ padding: 10px 14px; border: 0; border-bottom: 1px solid var(--line); background: none;
274
+ font: inherit; font-size: 14px; color: var(--text); text-align: left; cursor: pointer;
275
+ }
276
+ .glist > :last-child { border-bottom: 0; }
277
+ .glist svg { width: 17px; height: 17px; color: var(--text-2); flex: 0 0 auto; }
278
+ .glist .grow { flex: 1; min-width: 0; }
279
+ .glist .count { color: var(--muted); font-size: 12.5px; }
280
+ .glist .chev { width: 14px; height: 14px; color: var(--faint); }
281
+ .glist .danger, .glist .danger svg { color: var(--red); }
282
+ .sheet-label { font-size: 11px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.07em; margin: 14px 2px 6px; }
283
+
284
+ @media (max-width: 767px) {
285
+ :root { --tabbar-h: calc(58px + env(safe-area-inset-bottom)); }
286
+ body { background: var(--bg); }
287
+ .sidebar { display: none; }
288
+ .main { padding: 0; }
289
+ .panel { height: auto; min-height: 100vh; overflow: visible; border: 0; border-radius: 0; box-shadow: none; padding-bottom: var(--tabbar-h); }
290
+ .topbar { display: none; }
291
+ .content { padding: calc(14px + env(safe-area-inset-top)) 16px 24px; }
292
+ .page-head { margin-bottom: 14px; }
293
+ .page-head h1 { font-size: 24px; }
294
+ .tabbar {
295
+ display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 50;
296
+ padding: 6px 4px env(safe-area-inset-bottom);
297
+ background: color-mix(in srgb, var(--bg) 92%, transparent); backdrop-filter: blur(12px);
298
+ border-top: 1px solid var(--line);
299
+ }
300
+ .tabbar > * {
301
+ flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px;
302
+ min-height: 48px; padding: 4px 0; border: 0; background: none; font: inherit;
303
+ font-size: 10.5px; font-weight: 500; color: var(--muted); cursor: pointer;
304
+ }
305
+ .tabbar svg { width: 21px; height: 21px; }
306
+ .tabbar .active { color: var(--text); font-weight: 600; }
307
+ .tabbar .active svg { color: var(--accent); }
308
+ /* comfortable touch targets */
309
+ .btn { min-height: 36px; }
310
+ input[type='text'], input[type='password'], input[type='email'], input[type='url'], input[type='number'], input[type='search'], input[type='datetime-local'], textarea, select { font-size: 16px; }
311
+ }
115
312
 
116
313
  /* cards & stats */
117
314
  .card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: var(--shadow-card); }
118
315
  .card + .card { margin-top: 16px; }
119
316
  .card-pad { padding: 18px 20px; }
120
- .card-title { font-size: 12px; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); margin: 0 0 12px; font-weight: 600; }
317
+ .card-title { font-size: 12px; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); margin: 0 0 12px; font-weight: 600; }
121
318
  .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; margin-bottom: 16px; }
122
319
  .stat { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: var(--shadow-card); padding: 14px 16px; }
123
320
  .stat .label { font-size: 12px; color: var(--muted); }
124
321
  .stat .value { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; margin-top: 2px; font-variant-numeric: tabular-nums; }
322
+ .notice { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 12px 16px; margin-bottom: 14px; }
323
+ .notice.warn { background: var(--amber-soft); border-color: transparent; }
125
324
 
126
325
  /* table */
127
326
  table.list { width: 100%; border-collapse: collapse; }
128
- .list th { text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); font-weight: 600; padding: 10px 18px; border-bottom: 1px solid var(--line); }
327
+ .list th { text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); font-weight: 600; padding: 10px 18px; border-bottom: 1px solid var(--line); }
129
328
  .list td { padding: 12px 18px; border-bottom: 1px solid var(--line); vertical-align: middle; }
130
329
  .list tr:last-child td { border-bottom: none; }
131
- .list tr:hover td { background: rgb(26 29 37 / 2.5%); }
330
+ .list tr:hover td { background: var(--hover); }
132
331
  .list .t-title { font-weight: 600; color: var(--text); }
133
332
  .list .t-sub { color: var(--faint); font-size: 12px; }
134
333
  .list td.num { text-align: right; font-variant-numeric: tabular-nums; color: var(--muted); }
@@ -136,11 +335,21 @@ table.list { width: 100%; border-collapse: collapse; }
136
335
  /* pills */
137
336
  .pill { display: inline-block; font-size: 11px; font-weight: 600; padding: 2px 9px; border-radius: var(--r-full); }
138
337
  .pill.published { background: var(--green-soft); color: var(--green); }
139
- .pill.draft { background: var(--amber-soft); color: var(--amber); }
140
- .pill.scheduled { background: #fde5d8; color: var(--accent-deep); }
141
- .pill.archived { background: rgb(102 109 124 / 12%); color: var(--muted); }
142
- .pill.home { background: #fde5d8; color: var(--accent-deep); }
338
+ .pill.draft { background: var(--accent-soft); color: var(--accent-deep); }
339
+ .pill.scheduled { background: var(--blue-soft); color: var(--blue); }
340
+ .pill.archived { background: var(--sel); color: var(--muted); }
341
+ .pill.home { background: var(--sel); color: var(--text-2); }
342
+ /* live doc with staged edits awaiting Update */
343
+ .pill.edited { background: var(--amber-soft); color: var(--amber); margin-left: 4px; }
143
344
  .pill.lang { background: var(--panel-2); color: var(--muted); border: 1px solid var(--line); }
345
+ /* status as colored text (content rows) */
346
+ .status { font-size: 12px; font-weight: 600; }
347
+ .status.published { color: var(--green); }
348
+ .status.draft { color: var(--accent-deep); }
349
+ .status.scheduled { color: var(--blue); }
350
+ .status.archived { color: var(--muted); }
351
+ .status .edited { color: var(--muted); font-weight: 500; }
352
+
144
353
 
145
354
  /* buttons & forms */
146
355
  .btn {
@@ -152,12 +361,12 @@ table.list { width: 100%; border-collapse: collapse; }
152
361
  box-shadow: var(--shadow-sm);
153
362
  }
154
363
  .btn:hover { border-color: var(--faint); }
155
- .btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
364
+ .btn.primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
156
365
  .btn.primary:hover { background: var(--accent-strong); border-color: var(--accent-strong); }
157
366
  .btn.danger { color: var(--red); }
158
367
  .btn.sm { padding: 3px 9px; font-size: 12px; }
159
368
  .btn.ghost { background: transparent; border-color: transparent; color: var(--muted); box-shadow: none; }
160
- .btn.ghost:hover { color: var(--text); background: rgb(26 29 37 / 5%); }
369
+ .btn.ghost:hover { color: var(--text); background: var(--hover); }
161
370
  input[type='text'], input[type='password'], input[type='email'], input[type='url'], input[type='number'], input[type='search'], input[type='datetime-local'], textarea, select {
162
371
  width: 100%; background: var(--panel); color: var(--text);
163
372
  border: 1px solid var(--line-strong); border-radius: var(--r-md);
@@ -180,7 +389,7 @@ label.field > span { display: block; font-size: 12px; color: var(--muted); margi
180
389
  /* editable row lists (links, tags) */
181
390
  .rowlist .row { display: flex; align-items: center; gap: 6px; padding: 7px 12px 7px 6px; border-bottom: 1px solid var(--line); }
182
391
  .rowlist .row:last-child { border-bottom: none; }
183
- .rowlist .row:hover { background: rgb(26 29 37 / 2.5%); }
392
+ .rowlist .row:hover { background: var(--hover); }
184
393
  .rowlist .empty { padding: 22px 18px; }
185
394
  .row-edit { display: flex; flex: 1; align-items: center; gap: 6px; min-width: 0; }
186
395
  input.bare { background: transparent; border-color: transparent; box-shadow: none; }
@@ -258,25 +467,60 @@ input.bare.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12
258
467
  }
259
468
 
260
469
  /* links manager: drag rows + live phone preview */
261
- .lm-layout { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 20px; align-items: start; }
262
- @media (max-width: 1100px) { .lm-layout { grid-template-columns: 1fr; } .lm-preview { display: none; } }
263
- .lm-item { border-bottom: 1px solid var(--line); background: var(--panel); }
264
- .lm-item:last-child { border-bottom: none; }
470
+ .lm-layout { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 28px; align-items: start; }
471
+ .lm-editor { min-width: 0; max-width: 640px; width: 100%; justify-self: center; }
472
+ .lm-views, .lm-insights { display: none; }
473
+ @media (max-width: 1100px) {
474
+ .lm-layout { grid-template-columns: 1fr; gap: 14px; }
475
+ .lm-views { display: flex; }
476
+ .lm-views > * { flex: 1; padding: 7px 10px; }
477
+ .lm-layout.view-edit .lm-preview, .lm-layout.view-edit .lm-insights,
478
+ .lm-layout.view-preview .lm-editor, .lm-layout.view-preview .lm-insights,
479
+ .lm-layout.view-insights .lm-editor, .lm-layout.view-insights .lm-preview { display: none; }
480
+ .lm-layout.view-insights .lm-insights { display: block; }
481
+ .lm-preview { position: static; justify-self: center; width: min(360px, 100%); }
482
+ }
483
+ .lm-list { display: flex; flex-direction: column; gap: 8px; }
484
+ .lm-empty { padding: 20px 4px; }
485
+ .lm-item { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; }
486
+ .lm-item .row { border-radius: 12px; }
487
+ .lm-item.is-hidden .row > :not(.lm-switch):not(.reveal):not(.lm-handle) { opacity: 0.5; }
488
+ .lm-switch { width: 30px; height: 18px; border-radius: 99px; border: 0; padding: 0; background: var(--line-strong); position: relative; flex: 0 0 auto; cursor: pointer; margin: 0 4px; }
489
+ .lm-switch i { position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgb(0 0 0 / 25%); transition: left 0.15s; }
490
+ .lm-switch.on { background: var(--green); }
491
+ .lm-switch.on i { left: 14px; }
492
+ .lm-addwrap { position: relative; margin-bottom: 12px; }
493
+ .lm-addbtn { display: flex; align-items: center; justify-content: center; gap: 7px; width: 100%; padding: 10px; border: 1.5px dashed var(--line-strong); border-radius: 12px; background: none; color: var(--text-2); font: 600 13.5px Inter, system-ui, sans-serif; cursor: pointer; }
494
+ .lm-addbtn svg { width: 15px; height: 15px; }
495
+ .lm-addbtn:hover, .lm-addbtn.is-open { background: var(--hover); color: var(--text); border-color: var(--muted); }
496
+ .lm-picker { margin-top: 8px; background: var(--panel); border: 1px solid var(--line-strong); border-radius: var(--r-lg); box-shadow: var(--shadow-pop); padding: 4px 14px 14px; }
497
+ .lm-picker .lm-picker-head { padding-top: 10px; }
498
+ .lm-savebar {
499
+ position: fixed; left: 50%; bottom: calc(22px + var(--tabbar-h)); transform: translateX(-50%); z-index: 60;
500
+ display: flex; align-items: center; gap: 8px; padding: 7px 8px 7px 16px;
501
+ background: var(--text); color: var(--bg); border-radius: var(--r-lg); box-shadow: var(--shadow-pop); white-space: nowrap;
502
+ }
503
+ .lm-savebar span { margin-right: 8px; font-weight: 600; font-size: 13px; }
504
+ .lm-savebar .btn:not(.primary) { background: transparent; color: var(--bg); border-color: color-mix(in srgb, var(--bg) 30%, transparent); box-shadow: none; }
505
+ .lm-url { flex: 1; min-width: 0; background: var(--panel); border: 1px solid var(--line-strong); border-radius: var(--r-sm); padding: 4px 10px; font-size: 12px; color: var(--text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
506
+ .lm-stat { text-align: center; color: var(--muted); font-size: 12px; margin: 10px 0 0; }
507
+ .lm-stat b { color: var(--text); }
508
+ .lm-insights { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 14px 16px; }
265
509
  .lm-item .row { border-bottom: none; }
266
510
  .lm-item .row.is-open { border-bottom: 1px dashed var(--line); }
267
511
  .lm-item.is-dragging { position: relative; z-index: 5; background: var(--panel); box-shadow: var(--shadow-pop); border-radius: var(--r-md); }
268
512
  .lm-badge {
269
513
  flex: 0 0 auto; font-size: 10px; font-weight: 700; letter-spacing: 0.06em;
270
- color: var(--accent-deep); background: var(--accent-soft); border-radius: 5px; padding: 2px 7px;
514
+ color: var(--text-2); background: var(--sel); border-radius: 5px; padding: 2px 7px;
271
515
  }
272
516
 
273
517
  /* profile card — reads like the links page header, edits in place */
274
- .lm-profile { display: flex; gap: 14px; align-items: flex-start; }
275
- .lm-avatarwrap { position: relative; flex: 0 0 48px; }
518
+ .lm-profile { display: flex; gap: 14px; align-items: center; margin-bottom: 16px; }
519
+ .lm-avatarwrap { position: relative; flex: 0 0 64px; }
276
520
  .lm-avatar {
277
- width: 48px; height: 48px; border-radius: 50%; border: none; padding: 0;
278
- display: grid; place-items: center; font-size: 20px; font-weight: 700; color: #fff;
279
- background: linear-gradient(135deg, #f97a3a, var(--accent-strong));
521
+ width: 64px; height: 64px; border-radius: 50%; border: none; padding: 0;
522
+ display: grid; place-items: center; font-size: 20px; font-weight: 700; color: var(--text-2);
523
+ background: var(--sel);
280
524
  user-select: none; cursor: pointer; position: relative; overflow: hidden; font-family: inherit;
281
525
  }
282
526
  .lm-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
@@ -295,7 +539,7 @@ input.bare.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12
295
539
  .lm-avatarwrap:hover .lm-avatar-remove { opacity: 1; }
296
540
  .lm-avatar-remove:hover { color: var(--red); border-color: var(--red); }
297
541
  .lm-profile-fields { flex: 1; min-width: 0; }
298
- .lm-profile-name {
542
+ input.lm-profile-name {
299
543
  display: block; width: 100%; background: none; border: 1px solid transparent; border-radius: var(--r-md);
300
544
  color: var(--text); font-family: inherit; font-size: 17px; font-weight: 700; letter-spacing: -0.01em;
301
545
  padding: 3px 8px; margin-left: -8px; outline: none;
@@ -306,8 +550,8 @@ input.bare.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12
306
550
  padding: 3px 8px; margin: 1px 0 0 -8px; outline: none; resize: none; overflow: hidden;
307
551
  }
308
552
  .lm-profile-name::placeholder, .lm-profile-bio::placeholder { color: var(--faint); }
309
- .lm-profile-name:hover, .lm-profile-bio:hover { border-color: var(--line); }
310
- .lm-profile-name:focus, .lm-profile-bio:focus { border-color: var(--accent); background: var(--panel); }
553
+ input.lm-profile-name:hover, .lm-profile-bio:hover { border-color: var(--line); }
554
+ input.lm-profile-name:focus, .lm-profile-bio:focus { border-color: var(--accent); background: var(--panel); }
311
555
 
312
556
  /* add-block picker */
313
557
  .lm-picker-head { display: flex; align-items: center; gap: 8px; }
@@ -323,13 +567,13 @@ input.bare.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12
323
567
  padding: 9px 11px; cursor: pointer; font-family: inherit; color: var(--text);
324
568
  transition: border-color 0.12s, background 0.12s;
325
569
  }
326
- .lm-tile:hover { border-color: var(--accent); background: var(--accent-soft); }
570
+ .lm-tile:hover { border-color: var(--line-strong); background: var(--hover); }
327
571
  .lm-tile-ico {
328
572
  flex: 0 0 34px; width: 34px; height: 34px; display: grid; place-items: center;
329
- background: var(--accent-soft); color: var(--accent-deep); border-radius: 9px;
573
+ background: var(--sel); color: var(--text-2); border-radius: 9px;
330
574
  transition: background 0.12s, color 0.12s;
331
575
  }
332
- .lm-tile:hover .lm-tile-ico { background: var(--accent); color: #fff; }
576
+ .lm-tile:hover .lm-tile-ico { color: var(--text); }
333
577
  .lm-tile-ico svg { width: 18px; height: 18px; }
334
578
  .lm-tile-body { min-width: 0; }
335
579
  .lm-tile-body b { display: block; font-size: 12.5px; line-height: 1.3; }
@@ -437,15 +681,17 @@ input.bare.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12
437
681
  }
438
682
  .lm-handle:hover { color: var(--text); }
439
683
  .lm-row.is-dragging .lm-handle { cursor: grabbing; }
440
- .lm-preview { position: sticky; top: 70px; }
684
+ .lm-preview { position: sticky; top: 64px; }
441
685
  .lm-preview-bar { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
442
686
  .lm-preview-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); }
443
687
  .lm-savestate { font-size: 11.5px; color: var(--faint); margin-left: auto; }
444
688
  .lm-savestate.saving { color: var(--muted); }
445
689
  .lm-savestate.error { color: var(--red); }
690
+ /* local edits awaiting an explicit "Save changes" */
691
+ .lm-savestate.dirty { color: var(--amber); font-weight: 600; }
446
692
  .lm-phone {
447
- border: 1px solid var(--line); border-radius: var(--r-xl); overflow: hidden;
448
- background: #fff; height: min(640px, calc(100vh - 140px)); box-shadow: var(--shadow-pop);
693
+ border: 7px solid #1a1917; border-radius: 34px; overflow: hidden;
694
+ background: #fff; height: min(640px, calc(100vh - 170px)); box-shadow: var(--shadow-pop);
449
695
  }
450
696
  .lm-phone iframe { width: 100%; height: 100%; border: 0; display: block; }
451
697
 
@@ -469,7 +715,7 @@ dialog.modal {
469
715
  background: var(--panel); color: var(--text);
470
716
  border-radius: var(--r-lg); box-shadow: var(--shadow-pop);
471
717
  }
472
- dialog.modal::backdrop { background: rgb(20 22 28 / 40%); backdrop-filter: blur(2px); }
718
+ dialog.modal::backdrop { background: var(--dim); backdrop-filter: blur(2px); }
473
719
  dialog.modal[open] { animation: modal-in 0.16s ease-out; }
474
720
  @keyframes modal-in { from { opacity: 0; transform: translateY(6px) scale(0.98); } }
475
721
  .modal-head {
@@ -480,7 +726,7 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
480
726
  background: none; border: none; color: var(--faint); cursor: pointer;
481
727
  font-size: 13px; padding: 4px 6px; border-radius: var(--r-sm);
482
728
  }
483
- .modal-x:hover { color: var(--text); background: rgb(26 29 37 / 5%); }
729
+ .modal-x:hover { color: var(--text); background: var(--hover); }
484
730
  .modal-body { padding: 14px 20px 20px; }
485
731
  .modal-foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; }
486
732
 
@@ -506,7 +752,10 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
506
752
  .login-wrap { min-height: 100vh; display: grid; place-items: center; padding: 20px; }
507
753
  .login-card { width: 100%; max-width: 360px; }
508
754
  .login-card .brand { justify-content: center; padding-bottom: 20px; }
509
- .login-card .brand-name { color: var(--text); }
755
+ .login-card .brand-name { color: var(--text); flex: none; }
756
+ .login-wrap { background: var(--bg); }
757
+ .btn.block { width: 100%; justify-content: center; min-height: 38px; }
758
+ .login-note { margin-top: 14px; }
510
759
 
511
760
  /* recent list on dashboard */
512
761
  .recent { list-style: none; margin: 0; padding: 0; }
@@ -514,10 +763,7 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
514
763
  .recent li:last-child { border-bottom: none; }
515
764
  .recent .when { margin-left: auto; color: var(--faint); font-size: 12px; white-space: nowrap; }
516
765
  .dash-grid { display: grid; grid-template-columns: 1.6fr 1fr; gap: 16px; align-items: start; }
517
- @media (max-width: 900px) {
518
- .dash-grid { grid-template-columns: 1fr; }
519
- .sidebar { display: none; }
520
- }
766
+ @media (max-width: 900px) { .dash-grid { grid-template-columns: 1fr; } }
521
767
 
522
768
  /* ---- design screen (DesignManager) ---- */
523
769
  /* controls cap out; the preview column absorbs all remaining width on large displays */
@@ -540,7 +786,7 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
540
786
  transition: border-color 0.12s ease, box-shadow 0.12s ease;
541
787
  }
542
788
  .dm-theme:hover { border-color: var(--line-strong); }
543
- .dm-theme.active { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
789
+ .dm-theme.active { border-color: var(--text); box-shadow: 0 0 0 1px var(--text); background: var(--panel-2); }
544
790
  .dm-swatch {
545
791
  position: relative; width: 100%; height: 56px; border-radius: var(--r-sm); border: 1px solid;
546
792
  display: flex; align-items: center; justify-content: center; font-size: 22px; font-weight: 600;
@@ -554,7 +800,7 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
554
800
  }
555
801
  .dm-chip {
556
802
  font-size: 9.5px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;
557
- background: var(--accent-soft); color: var(--accent-deep); border-radius: var(--r-full); padding: 2px 8px; margin-top: 5px;
803
+ background: var(--sel); color: var(--text-2); border-radius: var(--r-full); padding: 2px 8px; margin-top: 5px;
558
804
  }
559
805
  .dm-row {
560
806
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
@@ -567,7 +813,7 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
567
813
  .dm-lab small code { font-family: ui-monospace, 'SF Mono', monospace; font-size: 11.5px; }
568
814
  .dm-ovr {
569
815
  font-style: normal; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em;
570
- background: var(--accent-soft); color: var(--accent-deep); border-radius: var(--r-full); padding: 1px 7px;
816
+ background: var(--amber-soft); color: var(--amber); border-radius: var(--r-full); padding: 1px 7px;
571
817
  }
572
818
  .dm-resetlink {
573
819
  background: none; border: none; padding: 0; margin: 0; cursor: pointer;
@@ -595,17 +841,17 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
595
841
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
596
842
  padding: 7px 12px; border-bottom: 1px solid var(--line); background: var(--panel);
597
843
  }
598
- .dm-preview-actions { display: flex; align-items: center; gap: 6px; margin-left: auto; }
844
+ .dm-preview-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 6px; margin-left: auto; }
599
845
  .dm-ptabs {
600
846
  display: flex; gap: 2px;
601
- background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-md); padding: 2px;
847
+ background: var(--sel); border: 0; border-radius: var(--r-md); padding: 2px;
602
848
  }
603
849
  .dm-ptabs button {
604
850
  border: none; background: transparent; color: var(--muted); border-radius: calc(var(--r-md) - 3px);
605
851
  padding: 3px 12px; font-size: 12px; font-weight: 600; cursor: pointer; font-family: inherit;
606
852
  }
607
853
  .dm-ptabs button:hover { color: var(--text); }
608
- .dm-ptabs button.active { background: var(--accent); color: #fff; }
854
+ .dm-ptabs button.active { background: var(--bg); color: var(--text); box-shadow: var(--shadow-sm); }
609
855
  .dm-ptabs .dm-devbtn { display: grid; place-items: center; padding: 3px 8px; }
610
856
  .dm-ptabs .dm-devbtn svg { width: 15px; height: 15px; display: block; }
611
857
  .dm-frame { height: calc(100vh - 160px); min-height: 480px; overflow: hidden; background: #fff; }
@@ -614,7 +860,8 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
614
860
  .dm-frame iframe { border: 0; display: block; background: #fff; transform-origin: 0 0; margin: 0 auto; }
615
861
 
616
862
  /* ---- navigation screen (NavManager) ---- */
617
- .nm-head { display: flex; justify-content: flex-end; margin-bottom: 8px; }
863
+ .nm-head { display: flex; justify-content: flex-end; align-items: center; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
864
+ .nm-intro { margin: -6px 0 14px; }
618
865
  .nm-group { margin-bottom: 16px; padding-bottom: 8px; }
619
866
  .nm-group-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 16px 18px 12px; }
620
867
  .nm-group-head .card-title { margin: 0; }
@@ -634,7 +881,7 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
634
881
  font-size: 12px; font-weight: 500; color: var(--muted); cursor: pointer; font-family: inherit;
635
882
  }
636
883
  .dm-width-chip:hover { border-color: var(--faint); color: var(--text); }
637
- .dm-width-chip.active { background: var(--accent); border-color: var(--accent); color: #fff; }
884
+ .dm-width-chip.active { background: var(--text); border-color: var(--text); color: var(--bg); }
638
885
  .dm-width input[type='number'] {
639
886
  width: 68px; padding: 5px 8px;
640
887
  font-size: 13px; font-family: ui-monospace, 'SF Mono', monospace;
@@ -650,3 +897,579 @@ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
650
897
  border-radius: inherit;
651
898
  }
652
899
  .ml-filetile.big { min-height: 180px; font-size: 20px; }
900
+
901
+ /* ---- ⌘K command palette ---- */
902
+ .cmdk-root { position: fixed; inset: 0; z-index: 100; }
903
+ .cmdk-dim { position: absolute; inset: 0; background: var(--dim); animation: cmdk-fade 0.12s ease-out; }
904
+ @keyframes cmdk-fade { from { opacity: 0; } }
905
+ .cmdk {
906
+ position: absolute; left: 50%; top: 12vh; transform: translateX(-50%);
907
+ width: min(600px, calc(100vw - 32px)); max-height: 70vh; display: flex; flex-direction: column;
908
+ background: var(--bg); border: 1px solid var(--line-strong); border-radius: 16px; box-shadow: var(--shadow-pop);
909
+ overflow: hidden; animation: modal-in 0.14s ease-out;
910
+ }
911
+ .cmdk-in { display: flex; align-items: center; gap: 10px; padding: 12px 16px; border-bottom: 1px solid var(--line); color: var(--muted); }
912
+ .cmdk-in svg { width: 17px; height: 17px; flex: 0 0 auto; }
913
+ .cmdk-in input { flex: 1; border: 0; outline: 0; background: transparent; box-shadow: none; padding: 2px 0; font: 500 15px Inter, system-ui, sans-serif; color: var(--text); }
914
+ .cmdk-in input:focus { box-shadow: none; }
915
+ .cmdk-esc { border: 1px solid var(--line-strong); background: none; color: var(--faint); border-radius: 5px; font: 600 10.5px Inter, sans-serif; padding: 2px 6px; cursor: pointer; }
916
+ .cmdk-list { overflow-y: auto; padding: 6px; }
917
+ .cmdk-g { font-size: 10.5px; font-weight: 600; letter-spacing: 0.07em; text-transform: uppercase; color: var(--muted); padding: 10px 10px 4px; }
918
+ .cmdk-it { display: flex; align-items: center; gap: 10px; padding: 7px 10px; border-radius: 9px; cursor: pointer; color: var(--text-2); min-height: 38px; }
919
+ .cmdk-it[aria-selected='true'] { background: var(--sel); color: var(--text); }
920
+ .cmdk-ico { width: 24px; height: 24px; display: grid; place-items: center; color: var(--muted); flex: 0 0 auto; }
921
+ .cmdk-ico svg { width: 15px; height: 15px; }
922
+ .cmdk-it[aria-selected='true'] .cmdk-ico { color: var(--text); }
923
+ .cmdk-thumb { width: 24px; height: 18px; object-fit: cover; border-radius: 4px; flex: 0 0 auto; }
924
+ .cmdk-label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
925
+ .cmdk-label small { color: var(--faint); margin-left: 8px; font-size: 11.5px; }
926
+ .cmdk-kind { font-size: 11px; color: var(--faint); }
927
+ .cmdk-it .status { text-transform: capitalize; font-size: 11px; }
928
+ .cmdk-empty { padding: 26px; text-align: center; color: var(--muted); }
929
+ .cmdk-foot { display: flex; gap: 16px; padding: 8px 14px; border-top: 1px solid var(--line); font-size: 11px; color: var(--muted); }
930
+ @media (max-width: 767px) {
931
+ .cmdk { top: 0; left: 0; transform: none; width: 100%; height: 100%; max-height: none; border: 0; border-radius: 0; padding-top: env(safe-area-inset-top); }
932
+ .cmdk-in { padding: 14px 16px; }
933
+ .cmdk-in input { font-size: 17px; }
934
+ .cmdk-it { min-height: 46px; }
935
+ .cmdk-label small { display: block; margin: 0; }
936
+ .cmdk-foot { display: none; }
937
+ }
938
+
939
+ /* ---- content rows (collections, pages) ---- */
940
+ .list-tools { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 4px; flex-wrap: wrap; }
941
+ .fmenus { display: flex; gap: 2px; flex-wrap: wrap; }
942
+ .fmenu { position: relative; }
943
+ .fmenu > summary {
944
+ list-style: none; display: inline-flex; align-items: center; gap: 4px; cursor: pointer; user-select: none;
945
+ padding: 5px 9px; border-radius: var(--r-sm); color: var(--text-2); font-weight: 500;
946
+ }
947
+ .fmenu > summary::-webkit-details-marker { display: none; }
948
+ .fmenu > summary:hover, .fmenu[open] > summary { background: var(--hover); color: var(--text); }
949
+ .fmenu > summary svg { width: 12px; height: 12px; color: var(--muted); }
950
+ .fmenu.is-set > summary { color: var(--text); font-weight: 600; }
951
+ .fmenu-pop, .rmenu-pop {
952
+ position: absolute; right: 0; top: calc(100% + 4px); z-index: 30; min-width: 180px; max-height: 320px; overflow-y: auto;
953
+ background: var(--panel); border: 1px solid var(--line-strong); border-radius: var(--r-md); box-shadow: var(--shadow-pop); padding: 5px;
954
+ display: flex; flex-direction: column;
955
+ }
956
+ .fmenu-pop a { padding: 6px 9px; border-radius: 7px; color: var(--text-2); white-space: nowrap; display: flex; justify-content: space-between; gap: 14px; }
957
+ .fmenu-pop a:hover { background: var(--hover); color: var(--text); }
958
+ .fmenu-pop a.on { background: var(--sel); color: var(--text); font-weight: 600; }
959
+ .fmenu-pop a small { color: var(--faint); font-weight: 500; }
960
+ .list-search { position: relative; }
961
+ .list-search svg { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); width: 14px; height: 14px; color: var(--faint); pointer-events: none; }
962
+ .list-search input[type='search'] { width: 220px; border-radius: var(--r-full); padding: 5px 12px 5px 30px; font-size: 13px; }
963
+ .chips { display: none; }
964
+
965
+ .clist { margin-top: 6px; }
966
+ .cgroup-title { font-size: 11px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.07em; margin: 18px 0 4px 8px; }
967
+ .crow { position: relative; display: flex; align-items: center; gap: 4px; border-bottom: 1px solid var(--line); border-radius: var(--r-md); }
968
+ .crow:hover, .crow.is-selected { background: var(--hover); }
969
+ .crow.is-selected { background: var(--sel); }
970
+ .crow-check { flex: 0 0 28px; display: grid; place-items: center; align-self: stretch; cursor: pointer; opacity: 0; transition: opacity 0.12s; }
971
+ .crow:hover .crow-check, .clist.selecting .crow-check, .crow-check:focus-within { opacity: 1; }
972
+ .crow-check input { width: 15px; height: 15px; accent-color: var(--accent); margin: 0; }
973
+ .crow-main { flex: 1; min-width: 0; display: flex; align-items: center; gap: 14px; padding: 11px 4px; color: inherit; background: inherit; border-radius: inherit; position: relative; z-index: 1; transition: transform 0.2s ease; }
974
+ .crow-thumb { width: 64px; height: 44px; flex: 0 0 auto; border-radius: 7px; overflow: hidden; background: var(--panel-2); color: var(--faint); display: grid; place-items: center; border: 1px solid var(--line); }
975
+ .crow-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
976
+ .crow-thumb svg { width: 18px; height: 18px; }
977
+ :root[data-theme='dark'] .crow-thumb img { filter: brightness(0.85); }
978
+ .crow-text { min-width: 0; display: flex; flex-direction: column; }
979
+ .crow-text b { font-size: 13.5px; font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
980
+ .crow-text small { color: var(--muted); font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
981
+ .crow-path { color: var(--faint); }
982
+ .crow-text .status { margin-top: 1px; font-size: 11.5px; display: flex; align-items: center; gap: 6px; }
983
+ .crow-text .pill { font-size: 10px; padding: 0 6px; }
984
+ .crow-star { color: #d9962b; }
985
+ .crow-actions { display: flex; align-items: center; gap: 2px; padding-right: 8px; opacity: 0; transition: opacity 0.12s; }
986
+ .crow:hover .crow-actions, .crow:focus-within .crow-actions, .crow-actions:has(details[open]) { opacity: 1; }
987
+ .rmenu { position: relative; }
988
+ .rmenu > summary { list-style: none; }
989
+ .rmenu > summary::-webkit-details-marker { display: none; }
990
+ .rmenu-pop { min-width: 170px; }
991
+ .menu-item.danger { color: var(--red); }
992
+ .crow-swipe { display: none; }
993
+ .clist-none { padding: 24px 8px; }
994
+ .bulkbar {
995
+ position: fixed; left: 50%; bottom: calc(22px + var(--tabbar-h)); transform: translateX(-50%); z-index: 60;
996
+ display: flex; align-items: center; gap: 8px; padding: 7px 8px 7px 16px;
997
+ background: var(--text); color: var(--bg); border-radius: var(--r-lg); box-shadow: var(--shadow-pop);
998
+ }
999
+ .bulkbar[hidden] { display: none; }
1000
+ .bulkbar b { margin-right: 8px; font-size: 13px; }
1001
+ .bulkbar .btn { background: transparent; color: var(--bg); border-color: color-mix(in srgb, var(--bg) 30%, transparent); box-shadow: none; }
1002
+ .bulkbar .btn:hover { background: color-mix(in srgb, var(--bg) 12%, transparent); }
1003
+ .bulkbar .btn.danger { color: #ff9c9c; }
1004
+ :root[data-theme='dark'] .bulkbar .btn.danger { color: #b42323; }
1005
+ .bulkbar .icon-btn { color: var(--bg); opacity: 0.7; }
1006
+ .bulkbar .icon-btn:hover { background: transparent; color: var(--bg); opacity: 1; }
1007
+
1008
+ @media (max-width: 767px) {
1009
+ .list-tools .fmenu[data-kind='status'], .list-search { display: none; }
1010
+ .chips { display: flex; gap: 6px; overflow-x: auto; margin: 0 -16px 6px; padding: 0 16px 4px; scrollbar-width: none; }
1011
+ .chips a { flex: 0 0 auto; border: 1px solid var(--line-strong); border-radius: var(--r-full); padding: 5px 12px; color: var(--text-2); font-weight: 500; white-space: nowrap; }
1012
+ .chips a.on { background: var(--text); border-color: var(--text); color: var(--bg); }
1013
+ .chips a small { opacity: 0.6; margin-left: 4px; }
1014
+ .cgroup-title { margin-left: 0; }
1015
+ .crow { border-radius: 0; margin: 0 -16px; padding: 0; overflow: hidden; }
1016
+ .crow:hover { background: none; }
1017
+ .crow-check { display: none; }
1018
+ .clist.selecting .crow-check { display: grid; opacity: 1; }
1019
+ .crow-main { padding: 10px 16px; background: var(--bg); gap: 12px; }
1020
+ .crow.is-selected .crow-main { background: var(--sel); }
1021
+ .crow-thumb { width: 50px; height: 38px; }
1022
+ .crow-path { display: none; }
1023
+ .crow-actions { display: none; }
1024
+ .crow-swipe { display: flex; position: absolute; right: 0; top: 0; bottom: 0; }
1025
+ .crow-swipe button { width: 74px; border: 0; color: #fff; font: 600 11px Inter, sans-serif; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; }
1026
+ .crow-swipe svg { width: 18px; height: 18px; }
1027
+ .sw-archive { background: #8a857c; }
1028
+ .sw-delete { background: #c03b3b; }
1029
+ .crow.swiped .crow-main { transform: translateX(-148px); }
1030
+ }
1031
+
1032
+ /* ---- overview dashboard ---- */
1033
+ .dash { max-width: 920px; margin: 0 auto; }
1034
+ .notice[hidden] { display: none; }
1035
+ .kpis { display: grid; grid-template-columns: repeat(4, 1fr); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); margin-bottom: 18px; }
1036
+ .kpi { padding: 12px 16px; border-left: 1px solid var(--line); min-width: 0; }
1037
+ .kpi:first-child { border-left: 0; padding-left: 0; }
1038
+ .kpi small { display: block; color: var(--muted); font-size: 12px; }
1039
+ .kpi b { font-size: 22px; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
1040
+ .kpi .delta { font-size: 11.5px; font-weight: 600; color: var(--green); margin-left: 7px; letter-spacing: 0; }
1041
+ .kpi .delta.down { color: var(--red); }
1042
+ .spark { display: block; width: 100%; height: 26px; margin-top: 4px; }
1043
+ .spark path { fill: none; stroke: var(--accent); stroke-width: 1.6; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
1044
+ .card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
1045
+ .chart-card { margin-bottom: 18px; }
1046
+ .chart { display: block; width: 100%; height: 150px; }
1047
+ .chart .fill { fill: var(--chart-fill); }
1048
+ .chart .line { fill: none; stroke: var(--accent); stroke-width: 1.8; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
1049
+ .chart-axis { display: flex; justify-content: space-between; color: var(--faint); font-size: 11px; margin-top: 4px; }
1050
+ .dash-hint { margin: -6px 0 18px; }
1051
+ .dash-two { display: grid; grid-template-columns: 1.1fr 1fr; gap: 20px; margin-bottom: 22px; align-items: start; }
1052
+ .section-title { font-weight: 600; margin: 0 0 10px; }
1053
+ .tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
1054
+ .tile { display: flex; flex-direction: column; gap: 1px; padding: 12px; border: 1px solid var(--line); border-radius: 12px; background: var(--panel); color: var(--text); }
1055
+ .tile:hover { border-color: var(--line-strong); background: var(--panel-2); }
1056
+ .tile svg { width: 17px; height: 17px; color: var(--text-2); margin-bottom: 7px; }
1057
+ .tile small { color: var(--muted); font-size: 12px; line-height: 1.35; }
1058
+ .progress { height: 5px; background: var(--line); border-radius: 99px; margin-bottom: 8px; }
1059
+ .progress i { display: block; height: 100%; background: var(--green); border-radius: 99px; }
1060
+ .step { display: flex; align-items: center; gap: 9px; padding: 6px 0; color: var(--text); }
1061
+ .step-dot { width: 17px; height: 17px; border-radius: 50%; border: 1.5px solid var(--line-strong); display: grid; place-items: center; flex: 0 0 auto; }
1062
+ .step-dot svg { width: 10px; height: 10px; }
1063
+ .step.done { color: var(--muted); }
1064
+ .step.done .step-dot { background: var(--green); border-color: var(--green); color: #fff; }
1065
+ .step em { margin-left: auto; font-style: normal; font-weight: 600; font-size: 12px; color: var(--accent-deep); }
1066
+ .kv-row { display: flex; justify-content: space-between; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--line); }
1067
+ .kv-row:last-child { border-bottom: 0; }
1068
+ .mini-rows { margin-bottom: 22px; }
1069
+ .mini-row { position: relative; display: flex; align-items: center; gap: 12px; padding: 9px 6px; border-bottom: 1px solid var(--line); color: var(--text); border-radius: var(--r-sm); }
1070
+ a.mini-row:hover { background: var(--hover); }
1071
+ .mini-row .grow { flex: 1; min-width: 0; display: flex; flex-direction: column; }
1072
+ .mini-row .grow b, .mini-row .grow { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1073
+ .mini-row small { color: var(--muted); font-size: 12px; }
1074
+ .mini-row .crow-thumb { width: 42px; height: 30px; }
1075
+ .mini-row b { font-variant-numeric: tabular-nums; }
1076
+ .bar-row > i { position: absolute; left: 0; top: 4px; bottom: 4px; background: var(--accent-soft); border-radius: 6px; z-index: 0; }
1077
+ .bar-row > * { position: relative; }
1078
+ @media (max-width: 767px) {
1079
+ .kpis { grid-template-columns: 1fr 1fr; border: 0; gap: 8px; }
1080
+ .kpi, .kpi:first-child { border: 1px solid var(--line); border-radius: 12px; padding: 10px 12px; background: var(--panel); }
1081
+ .kpi b { font-size: 19px; }
1082
+ .dash-two { grid-template-columns: 1fr; }
1083
+ }
1084
+ .dash-two > * { min-width: 0; }
1085
+
1086
+ /* ---- settings: sticky index + read-mode cards ---- */
1087
+ .settings { display: grid; grid-template-columns: 210px minmax(0, 1fr); gap: 36px; max-width: 1000px; margin: 0 auto; align-items: start; }
1088
+ .set-index { position: sticky; top: 72px; }
1089
+ .set-search { position: relative; margin-bottom: 8px; }
1090
+ .set-search svg { position: absolute; left: 9px; top: 50%; transform: translateY(-50%); width: 14px; height: 14px; color: var(--faint); pointer-events: none; }
1091
+ .set-search input[type='search'] { padding: 5px 10px 5px 29px; font-size: 13px; border-radius: var(--r-full); }
1092
+ .set-group-title { font-size: 10.5px; font-weight: 600; letter-spacing: 0.07em; text-transform: uppercase; color: var(--muted); margin: 16px 8px 4px; }
1093
+ .set-cards > .set-group-title { margin: 26px 0 8px; }
1094
+ .set-cards > .set-group-title:first-of-type { margin-top: 8px; }
1095
+ .set-index a { display: flex; align-items: center; justify-content: space-between; padding: 5px 8px; border-radius: 7px; color: var(--text-2); }
1096
+ .set-index a:hover { background: var(--hover); color: var(--text); }
1097
+ .set-index a.on { background: var(--sel); color: var(--text); font-weight: 600; }
1098
+ .set-index a[hidden] { display: none; }
1099
+ .set-index .chev { display: none; width: 14px; height: 14px; color: var(--faint); }
1100
+ .set-head { margin-bottom: 8px; }
1101
+ .scard { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 16px 18px; margin-bottom: 12px; scroll-margin-top: 72px; transition: box-shadow 0.15s, border-color 0.15s; }
1102
+ .scard.editing { border-color: var(--line-strong); box-shadow: var(--shadow-pop); }
1103
+ .scard-head { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 12px; }
1104
+ .scard-head .grow { flex: 1; min-width: 0; }
1105
+ .scard-head h2 { font-size: 14.5px; margin: 0; letter-spacing: -0.01em; }
1106
+ .scard-head p { margin: 2px 0 0; color: var(--muted); font-size: 13px; }
1107
+ .scard-back { display: none; }
1108
+ .scard-actions { display: flex; gap: 6px; flex: 0 0 auto; }
1109
+ .scard[data-editable] [data-cancel], .scard[data-editable] [type='submit'] { display: none; }
1110
+ .scard.editing [data-edit] { display: none; }
1111
+ .scard.editing [data-cancel], .scard.editing [type='submit'] { display: inline-flex; }
1112
+ .scard-view { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 24px; margin: 0; }
1113
+ .scard-view dt { font-size: 10.5px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); }
1114
+ .scard-view dd { margin: 1px 0 0; overflow-wrap: anywhere; white-space: pre-line; }
1115
+ .scard-form { display: none; }
1116
+ .scard.editing .scard-view { display: none; }
1117
+ .scard.editing .scard-form { display: block; }
1118
+ .scard-sub { border-top: 1px solid var(--line); margin-top: 14px; padding-top: 12px; }
1119
+ .scard-sub.first { border-top: 0; margin-top: 0; padding-top: 0; }
1120
+ .scard-sub h3 { font-size: 13px; margin: 0 0 4px; }
1121
+ .scard-sub .hint, .scard .hint { margin: 0 0 8px; }
1122
+ .subpanel { margin: 10px 0 0 24px; padding: 12px 14px; background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-md); }
1123
+ .check-row { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; cursor: pointer; }
1124
+ .check-row input { accent-color: var(--accent); width: 15px; height: 15px; margin: 0; }
1125
+ .field-row.three { grid-template-columns: repeat(3, 1fr); }
1126
+ .field.narrow { max-width: 320px; }
1127
+ label.field > small.hint { display: block; margin: 5px 0 0; }
1128
+ input.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12.5px; }
1129
+ .serp-preview { display: flex; flex-direction: column; background: var(--panel-2); border-radius: var(--r-md); padding: 10px 12px; }
1130
+ .serp-preview small { font-size: 10.5px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); margin-bottom: 4px; }
1131
+ .serp-url { font-size: 12px; color: var(--muted); }
1132
+ .serp-title { font-size: 16px; color: #1a0dab; }
1133
+ :root[data-theme='dark'] .serp-title { color: #8ab4f8; }
1134
+ .serp-desc { font-size: 13px; color: var(--text-2); }
1135
+
1136
+ @media (max-width: 900px) {
1137
+ .settings { grid-template-columns: 1fr; gap: 0; }
1138
+ .field-row, .field-row.three, .scard-view { grid-template-columns: 1fr; }
1139
+ /* phones: the index is the first screen; a card opens as its own screen via #hash */
1140
+ .set-index { position: static; }
1141
+ .set-index .set-group-title { margin: 14px 2px 6px; }
1142
+ .set-index a { border-radius: 0; padding: 12px 14px; border: 1px solid var(--line); border-top: 0; font-size: 14px; background: var(--panel); }
1143
+ .set-index .set-group-title + a { border-top: 1px solid var(--line); border-radius: var(--r-lg) var(--r-lg) 0 0; }
1144
+ .set-index a:last-child { border-radius: 0 0 var(--r-lg) var(--r-lg); }
1145
+ .set-index .set-group-title + a:last-child { border-radius: var(--r-lg); }
1146
+ .set-index a.on { background: none; font-weight: 500; }
1147
+ .set-index .chev { display: block; }
1148
+ .set-cards > .set-group-title, .set-cards .scard { display: none; }
1149
+ .set-cards .set-head { display: none; }
1150
+ .settings:has(.scard:target) .set-index { display: none; }
1151
+ .settings:has(.scard:target) .scard:target { display: block; border: 0; box-shadow: none; background: none; padding: 0; }
1152
+ .scard-back { display: grid; place-items: center; width: 34px; height: 34px; margin: -4px 0 0 -8px; color: var(--text); border-radius: 50%; }
1153
+ .scard-back svg { width: 20px; height: 20px; }
1154
+ .scard-head h2 { font-size: 20px; }
1155
+ .scard[data-editable].editing .scard-actions {
1156
+ position: fixed; left: 0; right: 0; bottom: var(--tabbar-h); z-index: 55; padding: 10px 16px;
1157
+ background: var(--bg); border-top: 1px solid var(--line);
1158
+ }
1159
+ .scard.editing .scard-actions .btn { flex: 1; justify-content: center; min-height: 42px; }
1160
+ .subpanel { margin-left: 0; }
1161
+ }
1162
+ @media (max-width: 767px) {
1163
+ .settings::before { content: 'Settings'; font-size: 24px; font-weight: 700; letter-spacing: -0.02em; display: block; }
1164
+ .settings:has(.scard:target)::before { display: none; }
1165
+ }
1166
+ .settings::before { margin-bottom: 10px; }
1167
+
1168
+ @media (max-width: 767px) {
1169
+ /* link rows wrap: handle · icon · label · switch, then the URL line */
1170
+ .lm-row { flex-wrap: wrap; row-gap: 2px; padding: 8px 8px 8px 4px; }
1171
+ .lm-row > input.bare[type='url'], .lm-row > input.bare[type='email'], .lm-row > input.bare[type='tel'] { order: 10; flex: 1 1 100% !important; margin-left: 30px; font-size: 14px; }
1172
+ .lm-row > input.bare.strong { flex: 1 1 0 !important; min-width: 0; font-size: 15px; }
1173
+ .lm-row .meta { order: 11; margin-left: 38px; padding: 0; }
1174
+ .lm-row .reveal { opacity: 1; order: 12; margin-left: auto; }
1175
+ .lm-handle { padding: 8px 6px; font-size: 16px; }
1176
+ .lm-switch { width: 38px; height: 22px; }
1177
+ .lm-switch i { width: 18px; height: 18px; }
1178
+ .lm-switch.on i { left: 18px; }
1179
+ }
1180
+
1181
+ @media (max-width: 767px) {
1182
+ /* media: search drops under the title */
1183
+ .ml .page-head { flex-wrap: wrap; }
1184
+ .ml-tools { flex: 1 1 100%; }
1185
+ .ml-grid { grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 8px; }
1186
+ /* tags / generic inline-edit rows: name + slug on one line, description below */
1187
+ .rowlist .row { flex-wrap: wrap; row-gap: 0; }
1188
+ .rowlist .row .row-edit { flex-wrap: wrap; }
1189
+ .rowlist .row .row-edit input.bare { min-width: 0; }
1190
+ .rowlist .row .reveal { opacity: 1; }
1191
+ .card .list { display: block; overflow-x: auto; }
1192
+ }
1193
+ .row-edit .col-name { flex: 0 1 180px; }
1194
+ .row-edit .col-slug { flex: 0 1 160px; }
1195
+ .row-edit .col-desc { flex: 1; }
1196
+ .modal-note { margin: 12px 0 0; }
1197
+ @media (max-width: 767px) {
1198
+ .row-edit .col-name, .row-edit .col-slug { flex: 1 1 40%; }
1199
+ .row-edit .col-desc { flex: 1 1 100%; }
1200
+ }
1201
+ .grow-text { flex: 1; min-width: 220px; }
1202
+ .grow-text .hint { margin-left: 6px; }
1203
+ .hint.tight { margin: 2px 0 0; }
1204
+ .user-form { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
1205
+ .user-form-row { display: flex; gap: 8px; flex-wrap: wrap; width: 100%; align-items: center; }
1206
+ .user-form .w-name { width: 150px; }
1207
+ .user-form .w-role { width: 100px; }
1208
+ .user-form .w-pass { width: 180px; }
1209
+ .user-form .w-slug { width: 140px; }
1210
+ .user-form .w-grow { flex: 1; min-width: 220px; }
1211
+ .user-form .w-full { width: 100%; }
1212
+ .user-email { min-width: 180px; }
1213
+ .td-actions { text-align: right; width: 80px; }
1214
+ @media (max-width: 767px) {
1215
+ .user-form .w-name, .user-form .w-role, .user-form .w-pass, .user-form .w-slug, .user-form .w-grow { width: 100%; min-width: 0; flex: 1 1 100%; }
1216
+ }
1217
+ .sheet:focus, .sheet:focus-visible { outline: none; }
1218
+
1219
+ /* ---- calendar module (events list, calendars) --------------------------- */
1220
+ input[type='date'], input[type='time'] {
1221
+ width: 100%; background: var(--panel); color: var(--text);
1222
+ border: 1px solid var(--line-strong); border-radius: var(--r-md);
1223
+ padding: 6px 10px; font-size: 13.5px; font-family: inherit;
1224
+ }
1225
+ :root[data-theme='dark'] input[type='date'], :root[data-theme='dark'] input[type='time'] { color-scheme: dark; }
1226
+ input[type='color'] {
1227
+ width: 100%; height: 34px; padding: 3px; background: var(--panel);
1228
+ border: 1px solid var(--line-strong); border-radius: var(--r-md); cursor: pointer;
1229
+ }
1230
+ input[type='file'] { font: inherit; font-size: 13px; color: var(--text-2); }
1231
+ label.field > span em.hint { font-style: normal; margin-left: 4px; }
1232
+ .list-lead { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
1233
+ .ev-scope > a { text-decoration: none; }
1234
+ .empty-actions { display: flex; gap: 8px; justify-content: center; }
1235
+ .status.feed { color: var(--muted); }
1236
+ .crow.is-readonly .crow-thumb { opacity: 0.7; }
1237
+ .crow-action { display: inline-flex; }
1238
+ .cal-dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; margin-right: 7px; vertical-align: 0; flex: 0 0 auto; }
1239
+ .cal-dot.lg { width: 12px; height: 12px; margin: 5px 0 0; }
1240
+ .fmenu-pop a > span { display: inline-flex; align-items: center; }
1241
+ .modal-foot .spacer { flex: 1; }
1242
+ .ev-import-tabs { margin-bottom: 14px; }
1243
+ .ev-import-tabs + form .hint, #import-events form > .hint { margin: 0 0 12px; line-height: 1.5; }
1244
+
1245
+ .cal-allfeed { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 14px 16px; margin-bottom: 18px; flex-wrap: wrap; }
1246
+ .cal-allfeed b { display: block; font-size: 13.5px; }
1247
+ .cal-allfeed small { color: var(--muted); font-size: 12px; }
1248
+ .cal-allfeed .cal-feed { flex: 1 1 360px; max-width: 520px; margin: 0; }
1249
+ .cal-list { display: flex; flex-direction: column; }
1250
+ .cal-row { display: grid; grid-template-columns: 12px 1fr auto; gap: 14px; align-items: start; padding: 14px 8px; border-top: 1px solid var(--line); }
1251
+ .cal-row:first-child { border-top: 0; }
1252
+ .cal-main { min-width: 0; }
1253
+ .cal-title { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
1254
+ .cal-title b { font-size: 14px; }
1255
+ .cal-main > small { display: block; color: var(--muted); font-size: 12px; margin-top: 2px; }
1256
+ .cal-vis { font-size: 11.5px; font-weight: 600; color: var(--muted); }
1257
+ .cal-vis.is-public { color: var(--green); }
1258
+ .cal-vis.is-private { color: var(--text-2); }
1259
+ .cal-feed { display: flex; gap: 6px; align-items: center; margin-top: 9px; max-width: 560px; }
1260
+ .cal-feed input { flex: 1 1 auto; min-width: 0; font-family: ui-monospace, 'SF Mono', monospace; font-size: 12px; padding: 5px 9px; color: var(--text-2); background: var(--panel-2); }
1261
+ .cal-feed form { display: inline-flex; }
1262
+ .cal-actions { display: flex; align-items: center; gap: 6px; }
1263
+ .cal-move { display: inline-flex; gap: 2px; }
1264
+ .cal-move .icon-btn:disabled { opacity: 0.3; cursor: default; }
1265
+ @media (max-width: 767px) {
1266
+ .cal-row { grid-template-columns: 12px 1fr; }
1267
+ .cal-actions { grid-column: 2; }
1268
+ .list-lead .ev-scope { display: none; }
1269
+ }
1270
+
1271
+ /* ---- bookings admin ------------------------------------------------------ */
1272
+ .res-list { display: flex; flex-direction: column; }
1273
+ .res-row { display: grid; grid-template-columns: 64px minmax(0, 1fr) auto; gap: 14px; align-items: center; padding: 12px 6px; border-top: 1px solid var(--line); }
1274
+ .res-row:first-child { border-top: 0; }
1275
+ .res-thumb { width: 64px; height: 46px; border-radius: var(--r-sm); background: var(--panel-2); display: grid; place-items: center; color: var(--faint); overflow: hidden; }
1276
+ .res-thumb img { width: 100%; height: 100%; object-fit: cover; }
1277
+ .res-thumb svg { width: 22px; height: 22px; }
1278
+ .res-main { min-width: 0; color: inherit; text-decoration: none; }
1279
+ .res-main b { display: flex; align-items: center; gap: 6px; font-size: 14px; }
1280
+ .res-main small { display: block; color: var(--muted); font-size: 12px; margin-top: 1px; }
1281
+ .res-links { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 5px; font-size: 12px; color: var(--text-2); }
1282
+ .res-link.is-off { color: var(--faint); text-decoration: line-through; }
1283
+ .res-link em, .res-linkrow em { font-style: normal; font-weight: 600; }
1284
+ em.auto { color: var(--green); }
1285
+ em.manual { color: var(--amber); }
1286
+ .res-grid { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 16px; align-items: start; }
1287
+ .res-grid > div > .card + .card, .res-side > .card + .card { margin-top: 16px; }
1288
+ .res-side { display: flex; flex-direction: column; gap: 0; }
1289
+ .res-side > .btn { margin-top: 14px; align-self: flex-start; }
1290
+ .card-pad { padding: 16px 18px; }
1291
+ .card-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; margin-bottom: 12px; }
1292
+ .card-head b { font-size: 14.5px; }
1293
+ .res-linklist { display: flex; flex-direction: column; margin: 0 -8px; }
1294
+ .res-linkrow { display: grid; gap: 2px; padding: 10px 8px; border-radius: var(--r-md); color: inherit; text-decoration: none; }
1295
+ .res-linkrow:hover { background: var(--hover); }
1296
+ .res-linkrow > span { display: flex; align-items: center; gap: 6px; font-size: 13.5px; }
1297
+ .res-linkrow small { color: var(--muted); font-size: 12px; }
1298
+ .res-linkrow code { font-size: 11.5px; color: var(--faint); }
1299
+ .res-newlink { display: flex; gap: 8px; margin-top: 10px; }
1300
+ .res-newlink input { flex: 1; }
1301
+ .check-row { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; color: var(--text-2); margin: 6px 0 10px; cursor: pointer; }
1302
+ .check-row input { margin-top: 2px; accent-color: var(--accent); }
1303
+ .field-row.three { grid-template-columns: repeat(3, 1fr); }
1304
+ .mode-fields [hidden] { display: none; }
1305
+
1306
+ /* weekly hours rows */
1307
+ .hours-row { display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 7px 0; border-top: 1px solid var(--line); }
1308
+ .hours-row:first-child { border-top: 0; }
1309
+ .hours-day { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; cursor: pointer; }
1310
+ .hours-ranges { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: center; font-size: 12px; color: var(--faint); }
1311
+ .hours-range { display: inline-flex; align-items: center; gap: 5px; }
1312
+ .hours-range input { width: 108px; padding: 4px 8px; font-size: 12.5px; }
1313
+ .hours-second.is-empty, .hours-closed { display: none; }
1314
+ .hours-row.is-off .hours-range { display: none; }
1315
+ .hours-row.is-off .hours-closed { display: inline; color: var(--faint); font-size: 12.5px; }
1316
+ .hours-row.is-off .hours-tools { visibility: hidden; }
1317
+ .hours-tools { display: flex; gap: 2px; }
1318
+ .hours-tools .icon-btn { width: 26px; height: 26px; font-size: 13px; color: var(--muted); }
1319
+ input.sw { -webkit-appearance: none; appearance: none; width: 30px; height: 18px; border-radius: var(--r-full); background: var(--line-strong); position: relative; cursor: pointer; margin: 0; flex: 0 0 auto; transition: background-color 0.15s; }
1320
+ input.sw::after { content: ''; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: var(--shadow-sm); transition: transform 0.15s; }
1321
+ input.sw:checked { background: var(--green); }
1322
+ input.sw:checked::after { transform: translateX(12px); }
1323
+ input.sw:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--accent-ring); }
1324
+ .hours-week { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; margin-top: 12px; }
1325
+ .hours-week div { text-align: center; }
1326
+ .hours-week small { font-size: 10.5px; color: var(--muted); }
1327
+ .hours-week i { display: block; position: relative; height: 54px; border-radius: 5px; background: var(--panel-2); margin-top: 3px; overflow: hidden; }
1328
+ .hours-week u { position: absolute; left: 0; right: 0; background: var(--blue-soft); }
1329
+ .hours-week b { position: absolute; left: 2px; right: 2px; background: var(--green-soft); border: 1px solid rgb(18 116 66 / 25%); border-radius: 3px; }
1330
+
1331
+ /* overrides + questions */
1332
+ .ov-list { display: flex; flex-direction: column; gap: 6px; }
1333
+ .ov-row { display: grid; grid-template-columns: 140px 140px auto 100px 100px minmax(0, 1fr); gap: 6px; align-items: center; }
1334
+ .ov-row input { padding: 5px 8px; font-size: 12.5px; }
1335
+ .ov-closed { font-size: 12.5px; color: var(--text-2); display: flex; gap: 5px; align-items: center; white-space: nowrap; }
1336
+ .q-list { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; }
1337
+ .q-row { display: grid; grid-template-columns: minmax(0, 1fr) 120px auto; gap: 6px 8px; align-items: center; padding: 8px; border: 1px solid var(--line); border-radius: var(--r-md); background: var(--bg); }
1338
+ .q-row.is-blank { border-style: dashed; }
1339
+ .q-row .q-opts { grid-column: 1 / -1; font-size: 12.5px; }
1340
+ .q-row select { padding: 5px 8px; font-size: 12.5px; }
1341
+ .q-req { font-size: 12px; color: var(--text-2); display: flex; gap: 5px; align-items: center; white-space: nowrap; }
1342
+
1343
+ /* auto-confirm switch card + mode segmented control */
1344
+ .confirm-card { transition: background-color 0.15s; }
1345
+ .confirm-card.is-auto { background: color-mix(in srgb, var(--green-soft) 60%, var(--panel)); }
1346
+ .confirm-switch { display: flex; gap: 14px; align-items: flex-start; cursor: pointer; }
1347
+ .confirm-switch b { display: block; font-size: 14.5px; }
1348
+ .confirm-switch small { display: block; color: var(--muted); font-size: 12.5px; line-height: 1.45; margin-top: 2px; }
1349
+ .confirm-switch input.sw { margin-top: 2px; transform: scale(1.15); }
1350
+ .mode-seg { margin-bottom: 14px; }
1351
+ .mode-seg label { flex: 1; cursor: pointer; }
1352
+ .mode-seg input { position: absolute; opacity: 0; pointer-events: none; }
1353
+
1354
+ /* bookings screen */
1355
+ .bk-kpis { margin-bottom: 16px; }
1356
+ .bk-layout { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; align-items: start; }
1357
+ .bk-layout.has-panel { grid-template-columns: minmax(0, 1fr) 340px; }
1358
+ .bk-group { padding: 4px 14px; margin-bottom: 14px; }
1359
+ .bk-dayh { display: flex; justify-content: space-between; padding: 11px 0 6px; font-size: 13px; }
1360
+ .bk-dayh span { color: var(--muted); }
1361
+ .bk-row { display: grid; grid-template-columns: 150px minmax(0, 1fr) auto auto; gap: 12px; align-items: center; padding: 9px 6px; margin: 0 -6px; border-top: 1px solid var(--line); border-radius: var(--r-sm); color: inherit; text-decoration: none; }
1362
+ a.bk-row:hover, .bk-row.is-sel { background: var(--hover); }
1363
+ .bk-row.is-sel { background: var(--sel); }
1364
+ .bk-when { font-size: 12.5px; color: var(--text-2); font-variant-numeric: tabular-nums; color: inherit; text-decoration: none; }
1365
+ .bk-when small { display: block; color: var(--muted); }
1366
+ .bk-who { min-width: 0; color: inherit; text-decoration: none; }
1367
+ .bk-who b { display: block; font-size: 13.5px; }
1368
+ .bk-who small { display: block; color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1369
+ .bk-res { font-size: 11.5px; color: var(--muted); background: var(--panel-2); padding: 2px 8px; border-radius: var(--r-full); white-space: nowrap; }
1370
+ .bk-acts { display: flex; gap: 6px; }
1371
+ .bk-st { font-size: 12px; font-weight: 600; white-space: nowrap; }
1372
+ .bk-st.is-confirmed { color: var(--green); }
1373
+ .bk-st.is-pending { color: var(--amber); }
1374
+ .bk-st.is-cancelled, .bk-st.is-declined, .bk-st.is-block { color: var(--muted); }
1375
+ .bk-panel { padding: 16px 18px; position: sticky; top: 64px; }
1376
+ .bk-panel-head { display: flex; justify-content: space-between; align-items: center; }
1377
+ .bk-panel h2 { font-size: 18px; margin: 6px 0 2px; }
1378
+ .bk-panel-when { color: var(--muted); font-size: 13px; margin: 0 0 12px; }
1379
+ .bk-dl { margin: 0 0 14px; }
1380
+ .bk-dl div { display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: 8px; padding: 6px 0; border-top: 1px solid var(--line); font-size: 13px; }
1381
+ .bk-dl dt { color: var(--muted); }
1382
+ .bk-dl dd { margin: 0; overflow-wrap: anywhere; }
1383
+ .bk-notes { margin-bottom: 12px; }
1384
+ .bk-panel-acts { margin: 8px 0 12px; }
1385
+ .bk-panel-acts > div { display: flex; gap: 6px; justify-content: flex-end; }
1386
+ .bk-resched { margin: 0 0 10px; font-size: 13px; }
1387
+ .bk-resched summary { cursor: pointer; font-weight: 600; color: var(--text-2); padding: 4px 0; }
1388
+ .bk-resched form { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; }
1389
+ .bk-day { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; }
1390
+ .bk-day-head { display: grid; grid-template-columns: 54px repeat(var(--cols), minmax(120px, 1fr)); border-bottom: 1px solid var(--line); font-size: 12.5px; }
1391
+ .bk-day-head b { padding: 9px 10px; border-left: 1px solid var(--line); }
1392
+ .bk-day-body { display: grid; grid-template-columns: 54px repeat(var(--cols), minmax(120px, 1fr)); height: 720px; position: relative; overflow-x: auto; }
1393
+ .bk-day-hours { display: grid; grid-template-rows: repeat(15, 1fr); font-size: 10.5px; color: var(--faint); text-align: right; padding-right: 6px; }
1394
+ .bk-day-hours span { border-top: 1px solid var(--line); padding-top: 2px; }
1395
+ .bk-day-col { position: relative; border-left: 1px solid var(--line); background-image: linear-gradient(to bottom, var(--line) 1px, transparent 1px); background-size: 100% calc(100% / 15); }
1396
+ .bk-blk { position: absolute; left: 4px; right: 4px; border-radius: 6px; padding: 4px 7px; overflow: hidden; font-size: 11.5px; color: var(--text); text-decoration: none; background: var(--green-soft); border: 1px solid rgb(18 116 66 / 22%); }
1397
+ .bk-blk b { display: block; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1398
+ .bk-blk small { color: var(--muted); }
1399
+ .bk-blk.is-pending { background: var(--amber-soft); border-color: rgb(147 102 12 / 25%); }
1400
+ .bk-blk.is-block { background: repeating-linear-gradient(45deg, var(--panel-2) 0 6px, var(--bg) 6px 12px); border-color: var(--line-strong); }
1401
+
1402
+ /* integrations */
1403
+ .int-row { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 12px; align-items: center; padding: 9px 0; border-top: 1px solid var(--line); font-size: 13px; }
1404
+ .card-head + .int-row, .int-hook:first-of-type .int-row { border-top: 0; }
1405
+ .int-row code { font-size: 11.5px; color: var(--muted); }
1406
+ .int-scopes { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
1407
+ .int-status { font-size: 11.5px; font-weight: 600; color: var(--muted); white-space: nowrap; }
1408
+ .int-status.ok { color: var(--green); }
1409
+ .int-status.bad { color: var(--red); }
1410
+ .int-acts { display: flex; gap: 4px; }
1411
+ .int-log { font-size: 12px; margin: 0 0 8px; }
1412
+ .int-log summary { cursor: pointer; color: var(--muted); }
1413
+ .int-log div { padding: 3px 0; }
1414
+ .int-feed { margin-bottom: 10px; font-size: 12.5px; }
1415
+ .int-feed .cal-feed { margin-top: 4px; }
1416
+ .int-code { background: var(--code-bg); color: var(--code-text); border-radius: var(--r-md); padding: 12px; font-size: 11.5px; overflow-x: auto; margin: 0; white-space: pre; }
1417
+ .notice.reveal { flex-direction: column; align-items: stretch; gap: 6px; background: var(--green-soft); }
1418
+ .notice.reveal .cal-feed { max-width: none; margin: 0; }
1419
+ .nav-item .count.is-attention { background: var(--amber-soft); color: var(--amber); font-weight: 700; border-radius: var(--r-full); padding: 0 6px; }
1420
+
1421
+ @media (max-width: 1080px) {
1422
+ .res-grid, .bk-layout.has-panel { grid-template-columns: 1fr; }
1423
+ .bk-panel { position: static; }
1424
+ }
1425
+ @media (max-width: 767px) {
1426
+ .bk-row { grid-template-columns: 1fr auto; }
1427
+ .bk-row .bk-res { display: none; }
1428
+ .bk-row .bk-when { grid-column: 1 / -1; }
1429
+ .res-row { grid-template-columns: 48px minmax(0, 1fr); }
1430
+ .res-row .cal-actions { display: none; }
1431
+ .ov-row { grid-template-columns: 1fr 1fr; }
1432
+ .field-row.three { grid-template-columns: 1fr 1fr; }
1433
+ .hours-row { grid-template-columns: 80px minmax(0, 1fr); }
1434
+ .hours-tools { display: none; }
1435
+ .int-row { grid-template-columns: 1fr; }
1436
+ }
1437
+
1438
+ /* Design screen: draft status, "What changes", share + history dialogs */
1439
+ .dm-status { margin: 14px 0 4px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 12px; background: var(--panel-2); }
1440
+ .dm-status-line { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 13px; }
1441
+ .dm-st { font-weight: 650; }
1442
+ .dm-st.is-draft { color: var(--accent-deep); }
1443
+ .dm-st.is-live { color: var(--green); }
1444
+ .dm-st-sub { color: var(--muted); }
1445
+ .dm-status-actions { margin-left: auto; display: flex; gap: 6px; }
1446
+ .dm-changes { list-style: none; margin: 10px 0 0; padding: 0; border-top: 1px solid var(--line); }
1447
+ .dm-changes li { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 10px; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--line); font-size: 13px; }
1448
+ .dm-ch-label { color: var(--text-2); }
1449
+ .dm-ch-val { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); font-size: 12.5px; text-align: right; }
1450
+ .dm-ch-val b { color: var(--text); font-weight: 600; }
1451
+ .dm-ch-sw { width: 14px; height: 14px; border-radius: 4px; display: inline-block; border: 1px solid var(--line-strong); }
1452
+ .dm-ch-undo { border: 0; background: none; color: var(--muted); font: inherit; font-size: 12.5px; padding: 3px 6px; border-radius: 6px; cursor: pointer; }
1453
+ .dm-ch-undo:hover { background: var(--hover); color: var(--text); }
1454
+ .dm-status-links { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 12px; }
1455
+ .dm-status-links .btn svg { margin-right: 2px; }
1456
+ .dm-dialog { width: min(520px, 94vw); }
1457
+ .dm-dialog-sub { color: var(--muted); font-size: 13px; margin: 0 0 14px; }
1458
+ .dm-dialog-msg { color: var(--muted); font-size: 13px; margin: 12px 0 0; }
1459
+ .dm-share-row { display: flex; align-items: flex-end; justify-content: space-between; gap: 10px; }
1460
+ .dm-share-row label { display: flex; flex-direction: column; gap: 4px; font-size: 12.5px; color: var(--muted); }
1461
+ .dm-share-row select { width: auto; }
1462
+ .dm-share-url { display: flex; gap: 6px; }
1463
+ .dm-share-url input { flex: 1; min-width: 0; font: 12.5px var(--mono, ui-monospace, monospace); }
1464
+ .dm-share-foot { display: flex; justify-content: flex-end; margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--line); }
1465
+ .dm-danger { color: var(--red); }
1466
+ .dm-hist { list-style: none; margin: 0; padding: 0; }
1467
+ .dm-hist li { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--line); }
1468
+ .dm-hist li:last-child { border-bottom: 0; }
1469
+ .dm-hist b { display: block; font-size: 13px; font-weight: 600; color: var(--text); }
1470
+ .dm-hist small { color: var(--muted); font-size: 12px; }
1471
+ .dm-hist-actions { display: flex; gap: 6px; flex: none; }
1472
+ @media (max-width: 720px) {
1473
+ .dm-hist li { flex-direction: column; align-items: flex-start; }
1474
+ .dm-status-actions { margin-left: 0; width: 100%; }
1475
+ }