@firedrill-tools/notion 0.1.1

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 (65) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +402 -0
  3. package/firedrill/agent.target.json +17 -0
  4. package/firedrill/baseline.scenario.json +5 -0
  5. package/firedrill/bounded.scenario.json +19 -0
  6. package/firedrill/conformance.suite.json +23 -0
  7. package/firedrill/notion-bounded.drill.json +318 -0
  8. package/firedrill/notion-byte-budget.drill.json +116 -0
  9. package/firedrill/notion-mcp-aliases.drill.json +150 -0
  10. package/firedrill/notion-page-authoring.drill.json +254 -0
  11. package/firedrill/notion-rate-limited.drill.json +118 -0
  12. package/firedrill/notion-schema-growth.drill.json +88 -0
  13. package/firedrill/notion-scope-agent-only.drill.json +131 -0
  14. package/firedrill/notion-scope-auditor.drill.json +86 -0
  15. package/firedrill/notion-scope-board-bot.drill.json +128 -0
  16. package/firedrill/notion-scope-notes-bot.drill.json +303 -0
  17. package/firedrill/notion-scope-stranger.drill.json +773 -0
  18. package/firedrill/notion-task-triage.drill.json +277 -0
  19. package/firedrill/notion-trash-and-restore.drill.json +186 -0
  20. package/firedrill/notion-update-lost.drill.json +88 -0
  21. package/firedrill/notion-workspace-read.drill.json +258 -0
  22. package/firedrill/notion-write-unavailable.drill.json +161 -0
  23. package/firedrill/rate-limited.scenario.json +11 -0
  24. package/firedrill/tools/notion/app/assets/ATTRIBUTION.md +35 -0
  25. package/firedrill/tools/notion/app/assets/fonts/OFL.txt +93 -0
  26. package/firedrill/tools/notion/app/assets/fonts/inter-latin.woff2 +0 -0
  27. package/firedrill/tools/notion/app/assets/notion-wordmark.svg +1 -0
  28. package/firedrill/tools/notion/app/assets/notion.svg +1 -0
  29. package/firedrill/tools/notion/app/site/app.js +797 -0
  30. package/firedrill/tools/notion/app/site/assets/fonts/inter-latin.woff2 +0 -0
  31. package/firedrill/tools/notion/app/site/assets/notion-wordmark.svg +1 -0
  32. package/firedrill/tools/notion/app/site/assets/notion.svg +1 -0
  33. package/firedrill/tools/notion/app/site/chrome.js +104 -0
  34. package/firedrill/tools/notion/app/site/cover-picker.js +83 -0
  35. package/firedrill/tools/notion/app/site/database.js +648 -0
  36. package/firedrill/tools/notion/app/site/editors.js +320 -0
  37. package/firedrill/tools/notion/app/site/format-bar.js +97 -0
  38. package/firedrill/tools/notion/app/site/icons.js +131 -0
  39. package/firedrill/tools/notion/app/site/index.html +125 -0
  40. package/firedrill/tools/notion/app/site/page.js +826 -0
  41. package/firedrill/tools/notion/app/site/rich.js +159 -0
  42. package/firedrill/tools/notion/app/site/state.js +170 -0
  43. package/firedrill/tools/notion/app/site/styles.css +826 -0
  44. package/firedrill/tools/notion/app/site/ui.js +418 -0
  45. package/firedrill/tools/notion/behavior.mjs +1123 -0
  46. package/firedrill/tools/notion/lib/blocks.mjs +371 -0
  47. package/firedrill/tools/notion/lib/identity.mjs +123 -0
  48. package/firedrill/tools/notion/lib/ids.mjs +63 -0
  49. package/firedrill/tools/notion/lib/json-depth.mjs +26 -0
  50. package/firedrill/tools/notion/lib/markdown.mjs +381 -0
  51. package/firedrill/tools/notion/lib/properties.mjs +513 -0
  52. package/firedrill/tools/notion/lib/query.mjs +272 -0
  53. package/firedrill/tools/notion/lib/render.mjs +137 -0
  54. package/firedrill/tools/notion/lib/rich-text.mjs +134 -0
  55. package/firedrill/tools/notion/lib/size.mjs +44 -0
  56. package/firedrill/tools/notion/lib/state.mjs +192 -0
  57. package/firedrill/tools/notion/lib/wire.mjs +89 -0
  58. package/firedrill/tools/notion/notion.tool.json +9837 -0
  59. package/firedrill/update-lost.scenario.json +11 -0
  60. package/firedrill/world.json +7039 -0
  61. package/firedrill/write-unavailable.scenario.json +11 -0
  62. package/firedrill.json +5 -0
  63. package/package.json +63 -0
  64. package/starter.json +6482 -0
  65. package/test/conformance.mjs +1186 -0
@@ -0,0 +1,826 @@
1
+ /* Notion Tool app — the product's light theme: white canvas, warm-grey sidebar, ink text, blue accent. */
2
+ @font-face {
3
+ font-family: "Inter";
4
+ font-style: normal;
5
+ font-weight: 100 900;
6
+ font-display: swap;
7
+ src: url("./assets/fonts/inter-latin.woff2") format("woff2");
8
+ }
9
+
10
+ :root {
11
+ --font: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, "Apple Color Emoji", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
12
+ --mono: "SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace;
13
+ --ink: rgb(55, 53, 47);
14
+ --ink-strong: rgb(50, 48, 44);
15
+ --ink-2: rgba(55, 53, 47, 0.65);
16
+ --ink-3: rgba(55, 53, 47, 0.5);
17
+ --ink-4: rgba(55, 53, 47, 0.35);
18
+ --canvas: #ffffff;
19
+ --sidebar: #f7f7f5;
20
+ --hover: rgba(55, 53, 47, 0.08);
21
+ --hover-strong: rgba(55, 53, 47, 0.16);
22
+ --selected: rgba(0, 0, 0, 0.045);
23
+ --line: rgba(55, 53, 47, 0.09);
24
+ --line-strong: rgba(55, 53, 47, 0.16);
25
+ --accent: #2383e2;
26
+ --accent-hover: #0077d4;
27
+ --accent-soft: rgba(35, 131, 226, 0.14);
28
+ --red: #eb5757;
29
+ --red-soft: rgba(235, 87, 87, 0.1);
30
+ --callout: rgb(241, 241, 239);
31
+ --code: rgb(247, 246, 243);
32
+ --shadow: rgba(15, 15, 15, 0.05) 0 0 0 1px, rgba(15, 15, 15, 0.1) 0 3px 6px, rgba(15, 15, 15, 0.2) 0 9px 24px;
33
+ --shadow-card: rgba(15, 15, 15, 0.1) 0 0 0 1px, rgba(15, 15, 15, 0.1) 0 2px 4px;
34
+ --sidebar-width: 240px;
35
+ --topbar-height: 44px;
36
+ --radius: 6px;
37
+ }
38
+
39
+ * { box-sizing: border-box; }
40
+ html, body { height: 100%; margin: 0; }
41
+ body {
42
+ font-family: var(--font);
43
+ font-size: 14px;
44
+ line-height: 1.5;
45
+ color: var(--ink);
46
+ background: var(--canvas);
47
+ -webkit-font-smoothing: antialiased;
48
+ overflow: hidden;
49
+ }
50
+ button, input, textarea, select { font: inherit; color: inherit; }
51
+ button { cursor: pointer; background: none; border: 0; padding: 0; }
52
+ button:disabled { cursor: default; }
53
+ a { color: inherit; text-decoration: none; }
54
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
55
+ kbd { font-family: var(--font); font-size: 11px; color: var(--ink-3); background: rgba(55, 53, 47, 0.06); border-radius: 3px; padding: 1px 5px; margin: 0 2px; }
56
+ .icon { display: inline-block; flex-shrink: 0; vertical-align: middle; }
57
+ [hidden] { display: none !important; }
58
+ html[data-busy] .btn.primary, html[data-busy] .new-btn { opacity: 0.6; }
59
+
60
+ /* ------------------------------------------------------------------ layout */
61
+ .notion-app { display: flex; height: 100vh; width: 100vw; }
62
+ .sidebar {
63
+ width: var(--sidebar-width);
64
+ flex-shrink: 0;
65
+ background: var(--sidebar);
66
+ box-shadow: rgba(0, 0, 0, 0.024) -1px 0 0 0 inset;
67
+ display: flex;
68
+ flex-direction: column;
69
+ padding: 6px 0 0;
70
+ overflow: hidden;
71
+ transition: width 0.2s ease, margin 0.2s ease;
72
+ }
73
+ body.sidebar-collapsed .sidebar { margin-left: calc(-1 * var(--sidebar-width)); }
74
+ body.sidebar-collapsed .topbar .topbar-menu { display: inline-flex; }
75
+ .sidebar-scrim { display: none; }
76
+ .workspace { flex: 1; min-width: 0; display: flex; flex-direction: column; position: relative; }
77
+ .topbar {
78
+ height: var(--topbar-height);
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: space-between;
82
+ padding: 0 12px 0 10px;
83
+ flex-shrink: 0;
84
+ gap: 8px;
85
+ }
86
+ .topbar-start { display: flex; align-items: center; min-width: 0; gap: 4px; }
87
+ .topbar .topbar-menu { display: none; }
88
+ .topbar-end { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }
89
+ .topbar-edited { color: var(--ink-3); font-size: 14px; margin-right: 6px; white-space: nowrap; }
90
+ .btn.share { color: var(--ink); padding: 0 8px; height: 28px; }
91
+ .main { flex: 1; overflow-y: auto; overflow-x: hidden; position: relative; }
92
+ .main:focus { outline: none; }
93
+ body.has-side-panel .workspace { padding-right: 0; }
94
+ .side-panel {
95
+ position: absolute; top: var(--topbar-height); right: 0; bottom: 0; width: 360px; max-width: 100%;
96
+ background: var(--canvas); border-left: 1px solid var(--line); display: flex; flex-direction: column; z-index: 20;
97
+ box-shadow: rgba(15, 15, 15, 0.04) -4px 0 12px;
98
+ }
99
+ .panel-head { display: flex; align-items: center; justify-content: space-between; padding: 10px 8px 10px 16px; border-bottom: 1px solid var(--line); }
100
+ .panel-head.plain { border: 0; padding: 12px 16px 4px; }
101
+ .panel-title { font-weight: 600; font-size: 14px; }
102
+ .panel-body { overflow-y: auto; padding: 8px 16px 24px; flex: 1; }
103
+ .panel-tabs { display: flex; gap: 4px; margin: 4px 0 12px; }
104
+ .panel-tabs.inline { margin: 0; }
105
+ .panel-tab { font-size: 13px; color: var(--ink-3); padding: 2px 8px; border-radius: 4px; }
106
+ .panel-tab.active { color: var(--ink); background: var(--hover); font-weight: 500; }
107
+ .panel-tab:disabled { opacity: 0.6; }
108
+ .panel-empty { color: var(--ink-3); text-align: center; padding: 28px 12px; }
109
+ .panel-empty p { margin: 4px 0; }
110
+ .panel-empty-icon { width: 28px; height: 28px; color: var(--ink-4); margin-bottom: 6px; }
111
+ .panel-note { color: var(--ink-3); font-size: 12px; line-height: 1.4; margin: 10px 0 0; }
112
+ .panel-loading { color: var(--ink-3); padding: 12px 0; }
113
+ .panel-actions { display: flex; gap: 8px; margin-top: 12px; }
114
+ .panel-context { display: flex; gap: 8px; align-items: center; background: var(--callout); border-radius: 4px; padding: 8px 10px; margin-bottom: 12px; font-size: 13px; color: var(--ink-2); }
115
+ .panel-context-icon { color: var(--ink-3); }
116
+
117
+ /* ------------------------------------------------------------------ sidebar */
118
+ .sidebar-top { display: flex; align-items: center; padding: 0 8px 0 10px; gap: 2px; height: 40px; position: relative; }
119
+ .sidebar-top .icon-btn { position: absolute; top: 6px; }
120
+ .sidebar-collapse { right: 32px; }
121
+ .sidebar-new { right: 6px; }
122
+ .sidebar-top .icon-btn { width: 26px; height: 26px; top: 7px; }
123
+ .sidebar:hover .switcher { padding-right: 52px; }
124
+ .switcher { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1; height: 32px; padding: 0 6px; border-radius: var(--radius); }
125
+ .switcher:hover, .switcher[aria-expanded="true"] { background: var(--hover); }
126
+ .switcher-icon { width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; font-size: 16px; border-radius: 4px; flex-shrink: 0; }
127
+ .switcher-icon.letter { background: var(--ink); color: #fff; font-size: 12px; font-weight: 600; }
128
+ .switcher-name { font-weight: 500; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 14px; }
129
+ .switcher-chevron { width: 12px; height: 12px; color: var(--ink-3); flex-shrink: 0; }
130
+ .sidebar-collapse, .sidebar-new { color: var(--ink-3); opacity: 0; }
131
+ .sidebar:hover .sidebar-collapse, .sidebar:hover .sidebar-new, .sidebar-new:focus-visible { opacity: 1; }
132
+ .sidebar-list { list-style: none; margin: 0; padding: 0 8px; }
133
+ .sidebar-main { padding-top: 2px; }
134
+ .sidebar-bottom { margin-top: 6px; padding-bottom: 4px; }
135
+ .side-item {
136
+ display: flex; align-items: center; gap: 8px; width: 100%; height: 28px; padding: 0 8px; border-radius: var(--radius);
137
+ color: var(--ink-2); font-weight: 500; font-size: 14px; text-align: left; white-space: nowrap;
138
+ }
139
+ .side-item:hover, .side-item[aria-expanded="true"] { background: var(--hover); color: var(--ink-strong); }
140
+ .side-item.selected { background: var(--selected); color: var(--ink-strong); }
141
+ .side-icon { width: 20px; height: 20px; color: var(--ink-2); flex-shrink: 0; }
142
+ .side-badge { margin-left: auto; font-size: 11px; background: var(--ink); color: #fff; border-radius: 10px; padding: 0 6px; }
143
+ .sidebar-section { flex: 1; min-height: 0; display: flex; flex-direction: column; margin-top: 10px; }
144
+ .section-head { display: flex; align-items: center; justify-content: space-between; padding: 0 12px 0 16px; height: 26px; }
145
+ .section-title { font-size: 12px; font-weight: 600; color: var(--ink-3); }
146
+ .section-head .icon-btn { opacity: 0; }
147
+ .section-head:hover .icon-btn, .sidebar-section:hover .section-head .icon-btn { opacity: 1; }
148
+ .tree { overflow-y: auto; padding: 0 8px 8px; }
149
+ .tree-loading, .tree-empty { color: var(--ink-4); font-size: 14px; padding: 4px 8px; }
150
+ .tree-row {
151
+ display: flex; align-items: center; gap: 6px; height: 28px; padding-right: 4px; border-radius: var(--radius);
152
+ color: var(--ink-2); font-weight: 500; position: relative; user-select: none;
153
+ }
154
+ .tree-row:hover { background: var(--hover); color: var(--ink-strong); }
155
+ .tree-row.selected { background: var(--selected); color: var(--ink-strong); }
156
+ .tree-icon-slot { width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center; position: relative; flex-shrink: 0; }
157
+ .tree-icon { width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; font-size: 16px; line-height: 1; }
158
+ .tree-icon.glyph { color: var(--ink-3); width: 18px; height: 18px; }
159
+ .tree-toggle { position: absolute; inset: 0; display: none; align-items: center; justify-content: center; border-radius: 4px; color: var(--ink-3); }
160
+ .tree-toggle .icon { width: 16px; height: 16px; transition: transform 0.15s ease; }
161
+ .tree-toggle.open .icon { transform: rotate(90deg); }
162
+ .tree-toggle:hover { background: var(--hover-strong); }
163
+ .tree-row:hover .tree-toggle:not(.none), .tree-row:focus-within .tree-toggle:not(.none) { display: inline-flex; }
164
+ .tree-row:hover .tree-toggle:not(.none) + .tree-icon, .tree-row:focus-within .tree-toggle:not(.none) + .tree-icon { visibility: hidden; }
165
+ .tree-title { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 14px; }
166
+ .tree-actions { display: none; gap: 2px; }
167
+ .tree-row:hover .tree-actions, .tree-row:focus-within .tree-actions { display: inline-flex; }
168
+ .sidebar-footer { padding: 4px 8px 10px; border-top: 1px solid var(--line); margin-top: auto; }
169
+
170
+ /* ------------------------------------------------------------------ buttons */
171
+ .icon-btn {
172
+ display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 4px; color: var(--ink-2); flex-shrink: 0;
173
+ }
174
+ .icon-btn:hover:not(:disabled), .icon-btn[aria-expanded="true"] { background: var(--hover); color: var(--ink-strong); }
175
+ .icon-btn.small { width: 24px; height: 24px; }
176
+ .icon-btn.small .icon { width: 16px; height: 16px; }
177
+ .icon-btn.tiny { width: 20px; height: 20px; }
178
+ .icon-btn.tiny .icon { width: 14px; height: 14px; }
179
+ .icon-btn.active { color: var(--accent); }
180
+ .btn {
181
+ display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 10px; border-radius: var(--radius);
182
+ font-size: 14px; font-weight: 500; color: var(--ink); white-space: nowrap; line-height: 1;
183
+ }
184
+ .btn:hover:not(:disabled) { background: var(--hover); }
185
+ .btn .icon { width: 16px; height: 16px; }
186
+ .btn.primary { background: var(--accent); color: #fff; }
187
+ .btn.primary:hover:not(:disabled) { background: var(--accent-hover); }
188
+ .btn.danger, .confirm-ok.danger { background: var(--red); color: #fff; }
189
+ .btn.danger:hover:not(:disabled) { background: #d94b4b; }
190
+ .btn.ghost { color: var(--ink-3); font-weight: 400; }
191
+ .btn.ghost.small { height: 24px; font-size: 13px; padding: 0 6px; }
192
+ .btn.ghost.danger { background: none; color: var(--red); }
193
+ .btn.link { color: var(--accent); padding: 0; height: auto; }
194
+ .btn.link:hover { background: none; text-decoration: underline; }
195
+ .btn.on-red { background: #fff; color: var(--red); border: 1px solid rgba(255, 255, 255, 0.6); }
196
+ .btn.load-more { color: var(--ink-3); font-weight: 400; margin: 6px 0; }
197
+ .btn:disabled { opacity: 0.45; }
198
+ .toolbar-btn { color: var(--ink-2); font-weight: 400; padding: 0 8px; }
199
+ .toolbar-btn.active { color: var(--accent); }
200
+
201
+ /* ------------------------------------------------------------------ breadcrumb */
202
+ .breadcrumb { display: flex; align-items: center; gap: 2px; min-width: 0; overflow: hidden; }
203
+ .crumb { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 6px; border-radius: 4px; color: var(--ink); white-space: nowrap; max-width: 260px; overflow: hidden; }
204
+ a.crumb:hover { background: var(--hover); }
205
+ .crumb-icon { width: 18px; height: 18px; font-size: 15px; display: inline-flex; align-items: center; justify-content: center; }
206
+ .crumb-icon.glyph { color: var(--ink-3); }
207
+ .crumb-title { overflow: hidden; text-overflow: ellipsis; }
208
+ .crumb-sep { color: var(--ink-4); margin: 0 2px; }
209
+ .crumb.ellipsis { padding: 0 4px; color: var(--ink-3); }
210
+
211
+ /* ------------------------------------------------------------------ page */
212
+ .page-shell { min-height: 100%; padding-bottom: 30vh; }
213
+ .page-shell.database-page { padding-bottom: 20vh; }
214
+ .page-cover { height: 30vh; min-height: 180px; background: linear-gradient(135deg, #d7e8f3, #c3d9ea); position: relative; }
215
+ .page-cover[data-seed="1"] { background: linear-gradient(135deg, #f3e2d4, #e8cbb0); }
216
+ .page-cover[data-seed="2"] { background: linear-gradient(135deg, #dcefdc, #bfdfc2); }
217
+ .page-cover[data-seed="3"] { background: linear-gradient(135deg, #ece3f3, #d7c4e8); }
218
+ .page-cover[data-seed="4"] { background: linear-gradient(135deg, #fbe4e4, #f2c6c6); }
219
+ .page-cover[data-seed="5"] { background: linear-gradient(135deg, #f6efd6, #ecdfae); }
220
+ .cover-note { position: absolute; right: 12px; bottom: 8px; font-size: 11px; color: rgba(55, 53, 47, 0.45); }
221
+ .page-content { max-width: 708px; margin: 0 auto; padding: 0 96px; box-sizing: content-box; }
222
+ .page-content.wide { max-width: none; padding: 0 96px; }
223
+ .page-shell.inline .page-content { padding: 0; }
224
+ .page-header { padding-top: 88px; position: relative; }
225
+ .page-shell.has-cover .page-header { padding-top: 0; margin-top: -36px; }
226
+ .page-icon { display: inline-flex; align-items: center; justify-content: center; width: 78px; height: 78px; border-radius: 6px; margin-left: -4px; }
227
+ .page-icon:hover:not(:disabled) { background: var(--hover); }
228
+ .page-emoji { font-size: 78px; line-height: 1; }
229
+ .page-icon-glyph { width: 60px; height: 60px; color: var(--ink-4); }
230
+ .page-controls { display: flex; gap: 2px; height: 28px; margin: 6px 0 -4px; opacity: 0; transition: opacity 0.15s; }
231
+ .page-header:hover .page-controls, .page-controls:focus-within { opacity: 1; }
232
+ .page-title {
233
+ font-size: 40px; font-weight: 700; line-height: 1.2; margin: 6px 0 0; padding: 3px 2px; color: var(--ink);
234
+ word-break: break-word; outline: none; border-radius: 3px; letter-spacing: -0.01em;
235
+ }
236
+ .page-title.empty::before, .page-title:empty::before { content: attr(data-placeholder); color: var(--ink-4); }
237
+ .page-title[contenteditable]:focus { background: none; }
238
+ .trash-banner { display: flex; align-items: center; gap: 12px; justify-content: center; background: var(--red); color: #fff; padding: 8px 12px; border-radius: 0 0 6px 6px; margin: 0 -96px; font-weight: 500; }
239
+ .trash-note { font-weight: 400; font-size: 12px; opacity: 0.85; }
240
+
241
+ /* property panel */
242
+ .property-panel { margin-top: 10px; border-bottom: 1px solid var(--line); padding-bottom: 6px; }
243
+ .property-row { display: flex; align-items: flex-start; min-height: 34px; }
244
+ .property-name { width: 160px; flex-shrink: 0; display: flex; align-items: center; gap: 6px; height: 34px; padding: 0 6px; color: var(--ink-2); border-radius: 4px; font-size: 14px; }
245
+ .property-icon { width: 16px; height: 16px; color: var(--ink-3); }
246
+ .property-value { flex: 1; min-width: 0; min-height: 34px; padding: 6px 8px; border-radius: 4px; text-align: left; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
247
+ .property-value:hover:not(:disabled), .property-value[aria-expanded="true"] { background: var(--hover); }
248
+ .property-value.empty::before { content: attr(data-placeholder); color: var(--ink-4); }
249
+ .property-value.readonly { color: var(--ink); }
250
+ .property-row:hover .property-name { background: var(--hover); }
251
+ .add-property { margin: 2px 0 0 -2px; color: var(--ink-3); }
252
+ .prop-value { display: inline-flex; flex-wrap: wrap; gap: 4px; align-items: center; min-width: 0; }
253
+ .prop-value.type-rich_text, .prop-value.type-title { display: inline; }
254
+
255
+ /* comments strip */
256
+ .comments-strip { margin: 10px 0 4px; }
257
+ .discussion { padding: 8px 0; border-bottom: 1px solid var(--line); }
258
+ .comment { display: flex; gap: 10px; padding: 4px 0; }
259
+ .comment-body { flex: 1; min-width: 0; }
260
+ .comment-meta { display: flex; align-items: baseline; gap: 8px; font-size: 13px; }
261
+ .comment-author { font-weight: 500; }
262
+ .comment-time { color: var(--ink-3); font-size: 12px; }
263
+ .comment-bot { font-size: 11px; color: var(--ink-3); background: var(--hover); border-radius: 3px; padding: 0 4px; }
264
+ .comment-text { margin-top: 2px; }
265
+ .comment-composer { display: flex; align-items: center; gap: 8px; padding: 8px 0; }
266
+ .comment-composer.compact { padding: 4px 0 0 30px; }
267
+ .comment-composer input { flex: 1; border: 0; background: none; padding: 6px 0; outline: none; font-size: 14px; }
268
+ .comment-composer input::placeholder { color: var(--ink-4); }
269
+ .send-btn { color: var(--accent); width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border-radius: 4px; }
270
+ .send-btn:disabled { color: var(--ink-4); }
271
+ .comments-error { color: var(--red); font-size: 13px; }
272
+
273
+ /* blocks */
274
+ .blocks { margin-top: 8px; font-size: 16px; line-height: 1.5; }
275
+ .block { position: relative; display: flex; flex-direction: column; margin: 1px 0; padding-left: 0; }
276
+ .block-body { min-width: 0; }
277
+ .block-row { display: flex; align-items: flex-start; gap: 4px; padding: 3px 2px; min-height: 30px; }
278
+ .block-text { flex: 1; min-width: 0; outline: none; white-space: pre-wrap; word-break: break-word; caret-color: var(--ink); }
279
+ .block-text.empty[contenteditable]:not(:focus)::before { content: ""; }
280
+ .block-text.empty:hover::before, .block-text:focus:empty::before { content: attr(data-placeholder); color: var(--ink-4); pointer-events: none; }
281
+ .block-paragraph .block-text.empty:focus::before { content: attr(data-placeholder); color: var(--ink-4); }
282
+ .block-heading_1 .block-row { margin-top: 32px; }
283
+ .block-heading_1 .block-text { font-size: 30px; font-weight: 700; line-height: 1.3; }
284
+ .block-heading_2 .block-row { margin-top: 22px; }
285
+ .block-heading_2 .block-text { font-size: 24px; font-weight: 600; line-height: 1.3; }
286
+ .block-heading_3 .block-row { margin-top: 16px; }
287
+ .block-heading_3 .block-text { font-size: 20px; font-weight: 600; line-height: 1.3; }
288
+ .block:first-child .block-row { margin-top: 0; }
289
+ .marker { width: 24px; flex-shrink: 0; text-align: center; color: var(--ink); line-height: 1.5; font-size: 16px; }
290
+ .marker.bullet { font-size: 22px; line-height: 1.1; }
291
+ .marker.number { font-size: 16px; }
292
+ .block-to_do .checkbox { margin: 5px 6px 0 2px; }
293
+ .block-text.checked { text-decoration: line-through; color: var(--ink-4); }
294
+ .toggle-chevron { width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center; border-radius: 3px; color: var(--ink); flex-shrink: 0; }
295
+ .toggle-chevron:hover { background: var(--hover); }
296
+ .toggle-chevron .icon { transition: transform 0.15s; }
297
+ .toggle-chevron.open .icon { transform: rotate(90deg); }
298
+ .block-quote .block-row { border-left: 3px solid var(--ink); padding: 2px 14px; margin: 4px 0; }
299
+ .block-callout .block-row { background: var(--callout); border-radius: 4px; padding: 16px 16px 16px 12px; gap: 10px; margin: 4px 0; }
300
+ .callout-icon { font-size: 22px; line-height: 1; width: 24px; flex-shrink: 0; margin-top: -1px; }
301
+ .block-code .block-row { background: var(--code); border-radius: 4px; padding: 34px 16px 32px; position: relative; margin: 4px 0; }
302
+ .block-code .block-text { font-family: var(--mono); font-size: 85%; line-height: 1.5; tab-size: 2; }
303
+ .code-language { position: absolute; top: 8px; left: 10px; font-size: 12px; color: var(--ink-3); }
304
+ .block-children { margin-left: 24px; }
305
+ .block-toggle .block-children { margin-left: 28px; }
306
+ .block-loading { color: var(--ink-4); font-size: 14px; padding: 2px 0; }
307
+ .divider { border: 0; border-top: 1px solid var(--line-strong); margin: 13px 0; height: 0; }
308
+ .child-page { display: flex; align-items: center; gap: 6px; padding: 3px 2px; border-radius: 4px; }
309
+ .child-page:hover { background: var(--hover); }
310
+ .child-icon { width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center; font-size: 18px; }
311
+ .child-icon.glyph { color: var(--ink-3); }
312
+ .child-title { font-weight: 500; border-bottom: 1px solid var(--line-strong); }
313
+ .bookmark { display: flex; border: 1px solid var(--line-strong); border-radius: 4px; overflow: hidden; margin: 4px 0; }
314
+ .bookmark:hover { background: var(--hover); }
315
+ .bookmark-main { flex: 1; padding: 12px 14px; min-width: 0; }
316
+ .bookmark-title { font-size: 14px; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
317
+ .bookmark-url { font-size: 12px; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 4px; }
318
+ .bookmark-side { width: 100px; background: var(--callout); display: flex; align-items: center; justify-content: center; color: var(--ink-3); }
319
+ .image-block { margin: 4px 0; }
320
+ .image-frame { display: flex; align-items: center; gap: 8px; justify-content: center; height: 160px; background: var(--callout); border-radius: 4px; color: var(--ink-3); font-size: 14px; }
321
+ .image-glyph { color: var(--ink-4); }
322
+ .image-caption { font-size: 14px; color: var(--ink-3); padding: 6px 2px; }
323
+ .inline-database { margin: 6px 0 12px; }
324
+ .blocks-empty { color: var(--ink-4); padding: 3px 2px; }
325
+ .blocks-empty-btn { color: var(--ink-4); text-align: left; padding: 3px 2px; border-radius: 4px; font-size: 16px; }
326
+ .blocks-empty-btn:hover { background: var(--hover); }
327
+ .blocks-tail { height: 120px; cursor: text; }
328
+ .gutter { position: absolute; left: -46px; top: 2px; display: flex; gap: 0; opacity: 0; transition: opacity 0.15s; }
329
+ .block:hover > .gutter, .gutter:focus-within { opacity: 1; }
330
+ .gutter-btn { width: 24px; height: 24px; color: var(--ink-4); border-radius: 3px; }
331
+ .gutter-btn:hover { background: var(--hover); color: var(--ink-2); }
332
+ .gutter-btn.handle { width: 18px; cursor: grab; }
333
+ .gutter-btn .icon { width: 18px; height: 18px; }
334
+ .block-heading_1 > .gutter { top: 34px; }
335
+ .block-heading_2 > .gutter { top: 24px; }
336
+ .block-heading_3 > .gutter { top: 18px; }
337
+ .block-callout > .gutter { top: 18px; }
338
+ .block-code > .gutter { top: 36px; }
339
+ .block-quote > .gutter { top: 6px; }
340
+ .block[data-depth="1"] > .gutter { left: -46px; }
341
+
342
+ /* rich text */
343
+ .rich .b { font-weight: 600; }
344
+ .rich .i { font-style: italic; }
345
+ .rich .s { text-decoration: line-through; }
346
+ .rich .u { text-decoration: underline; }
347
+ .rich .code, .comment-text .code { font-family: var(--mono); font-size: 85%; background: rgba(135, 131, 120, 0.15); color: #eb5757; border-radius: 3px; padding: 0.2em 0.4em; }
348
+ .rich-link { color: inherit; text-decoration: underline; text-decoration-color: var(--ink-4); text-underline-offset: 2px; }
349
+ .rich-link:hover { text-decoration-color: var(--ink); }
350
+ .mention { font-weight: 500; border-radius: 3px; padding: 0 2px; }
351
+ .mention-user { color: var(--ink); background: rgba(55, 53, 47, 0.08); }
352
+ .mention-page { text-decoration: underline; text-decoration-color: var(--ink-4); display: inline-flex; align-items: center; gap: 2px; }
353
+ .mention-icon { width: 16px; height: 16px; color: var(--ink-3); }
354
+ .mention-date { color: var(--ink-2); }
355
+ [data-color="gray"] { color: rgb(120, 119, 116); }
356
+ [data-color="brown"] { color: rgb(159, 107, 83); }
357
+ [data-color="orange"] { color: rgb(217, 115, 13); }
358
+ [data-color="yellow"] { color: rgb(203, 145, 47); }
359
+ [data-color="green"] { color: rgb(68, 131, 97); }
360
+ [data-color="blue"] { color: rgb(51, 126, 169); }
361
+ [data-color="purple"] { color: rgb(144, 101, 176); }
362
+ [data-color="pink"] { color: rgb(193, 76, 138); }
363
+ [data-color="red"] { color: rgb(212, 76, 71); }
364
+ [data-color="gray_background"] { background: rgb(241, 241, 239); }
365
+ [data-color="yellow_background"] { background: rgb(251, 243, 219); }
366
+ [data-color="blue_background"] { background: rgb(231, 243, 248); }
367
+
368
+ /* pills (select / multi-select / status option colours of the product) */
369
+ .pill { display: inline-flex; align-items: center; gap: 4px; max-width: 100%; height: 20px; padding: 0 6px; border-radius: 3px; font-size: 14px; line-height: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: rgb(50, 48, 44); background: rgb(227, 226, 224); }
370
+ .pill[data-color="default"] { background: rgba(227, 226, 224, 0.5); }
371
+ .pill[data-color="gray"] { background: rgb(227, 226, 224); color: rgb(50, 48, 44); }
372
+ .pill[data-color="brown"] { background: rgb(238, 224, 218); color: rgb(68, 42, 30); }
373
+ .pill[data-color="orange"] { background: rgb(250, 222, 201); color: rgb(73, 41, 14); }
374
+ .pill[data-color="yellow"] { background: rgb(253, 236, 200); color: rgb(64, 44, 27); }
375
+ .pill[data-color="green"] { background: rgb(219, 237, 219); color: rgb(28, 56, 41); }
376
+ .pill[data-color="blue"] { background: rgb(211, 229, 239); color: rgb(24, 51, 71); }
377
+ .pill[data-color="purple"] { background: rgb(232, 222, 238); color: rgb(65, 36, 84); }
378
+ .pill[data-color="pink"] { background: rgb(245, 224, 233); color: rgb(76, 35, 55); }
379
+ .pill[data-color="red"] { background: rgb(255, 226, 221); color: rgb(93, 23, 21); }
380
+ .pill.status { background: rgba(227, 226, 224, 0.5); color: var(--ink); }
381
+ .status-dot { width: 8px; height: 8px; border-radius: 50%; background: rgb(145, 145, 142); flex-shrink: 0; }
382
+ .pill.status[data-color="blue"] .status-dot { background: rgb(35, 131, 226); }
383
+ .pill.status[data-color="green"] .status-dot { background: rgb(68, 131, 97); }
384
+ .pill.status[data-color="red"] .status-dot { background: rgb(212, 76, 71); }
385
+ .pill.status[data-color="yellow"] .status-dot { background: rgb(203, 145, 47); }
386
+ .pill.status[data-color="orange"] .status-dot { background: rgb(217, 115, 13); }
387
+ .pill.status[data-color="purple"] .status-dot { background: rgb(144, 101, 176); }
388
+ .pill.status[data-color="pink"] .status-dot { background: rgb(193, 76, 138); }
389
+ .pill.status[data-color="brown"] .status-dot { background: rgb(159, 107, 83); }
390
+ .pill.status[data-color="blue"] { background: rgb(211, 229, 239); }
391
+ .pill.status[data-color="green"] { background: rgb(219, 237, 219); }
392
+ .pill.status[data-color="red"] { background: rgb(255, 226, 221); }
393
+ .chip-remove { display: inline-flex; width: 14px; height: 14px; color: inherit; opacity: 0.6; }
394
+ .chip-remove .icon { width: 12px; height: 12px; }
395
+ .checkbox { width: 16px; height: 16px; border: 1px solid var(--ink-4); border-radius: 3px; display: inline-flex; align-items: center; justify-content: center; background: #fff; flex-shrink: 0; }
396
+ .checkbox.checked { background: var(--accent); border-color: var(--accent); color: #fff; }
397
+ .checkbox-mark { width: 12px; height: 12px; stroke-width: 2.4; }
398
+ .checkbox:disabled { cursor: default; opacity: 0.9; }
399
+ .person { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; }
400
+ .person-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
401
+ .avatar { width: 24px; height: 24px; border-radius: 50%; color: #fff; font-size: 12px; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
402
+ .avatar.small { width: 20px; height: 20px; font-size: 11px; }
403
+ .avatar.tiny { width: 16px; height: 16px; font-size: 9px; }
404
+ .relation-chip { display: inline-flex; align-items: center; gap: 4px; border-bottom: 1px solid var(--line-strong); font-weight: 500; max-width: 100%; }
405
+ .relation-icon { width: 16px; height: 16px; font-size: 13px; color: var(--ink-3); display: inline-flex; align-items: center; justify-content: center; }
406
+ .cell-link { color: var(--ink); text-decoration: underline; text-decoration-color: var(--ink-4); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
407
+ .obj-icon { display: inline-flex; align-items: center; justify-content: center; }
408
+ .obj-icon.glyph { color: var(--ink-3); }
409
+
410
+ /* ------------------------------------------------------------------ database views */
411
+ .db-header { padding-top: 88px; }
412
+ .db-header.inline { padding-top: 0; }
413
+ .db-title.page-title { display: flex; align-items: center; gap: 10px; }
414
+ .db-title.inline { font-size: 22px; font-weight: 600; margin: 0; padding: 4px 0; display: flex; align-items: center; gap: 8px; line-height: 1.2; }
415
+ .db-inline-icon { font-size: 22px; }
416
+ .db-title-text { outline: none; border-radius: 3px; padding: 0 2px; }
417
+ .db-description { color: var(--ink-2); margin: 6px 2px 0; }
418
+ .view-toolbar { display: flex; align-items: center; justify-content: space-between; margin-top: 12px; border-bottom: 1px solid var(--line); height: 42px; gap: 8px; }
419
+ .view-tabs { display: flex; align-items: stretch; height: 100%; }
420
+ .view-tab { display: flex; align-items: center; gap: 6px; padding: 0 8px; color: var(--ink-3); font-weight: 500; font-size: 14px; border-bottom: 2px solid transparent; margin-bottom: -1px; }
421
+ .view-tab:hover { background: var(--hover); border-radius: 4px 4px 0 0; }
422
+ .view-tab.active { color: var(--ink); border-bottom-color: var(--ink); }
423
+ .view-tab-icon { width: 16px; height: 16px; }
424
+ .view-tab.add { padding: 0 6px; }
425
+ .view-actions { display: flex; align-items: center; gap: 2px; }
426
+ .view-search { width: 180px; height: 28px; border: 0; border-bottom: 1px solid var(--line-strong); background: none; outline: none; padding: 0 4px; font-size: 14px; }
427
+ .new-btn { margin-left: 6px; height: 28px; padding: 0 10px; }
428
+ .filter-bar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 8px 0; border-bottom: 1px solid var(--line); }
429
+ .filter-chip { display: inline-flex; align-items: center; gap: 4px; height: 26px; padding: 0 8px 0 6px; border: 1px solid var(--line-strong); border-radius: 20px; font-size: 13px; color: var(--ink-2); background: #fff; }
430
+ .filter-chip:hover { background: var(--hover); }
431
+ .filter-chip:not(.sort) { border-color: rgba(35, 131, 226, 0.35); color: var(--accent); background: rgba(35, 131, 226, 0.06); }
432
+ .chip-icon { width: 14px; height: 14px; }
433
+ .chip-name { font-weight: 500; }
434
+ .chip-chevron { width: 12px; height: 12px; }
435
+ .query-error { display: flex; align-items: center; gap: 10px; padding: 12px; margin: 12px 0; background: var(--red-soft); border-radius: 4px; color: var(--red); }
436
+ .table-wrap { overflow-x: auto; padding-bottom: 8px; }
437
+ .db-table { border-collapse: collapse; min-width: 100%; font-size: 14px; }
438
+ .db-table th, .db-table td { border-bottom: 1px solid var(--line); border-right: 1px solid var(--line); text-align: left; vertical-align: top; padding: 0; }
439
+ .db-table th:last-child, .db-table td:last-child { border-right: 0; }
440
+ .db-table th { height: 34px; font-weight: 400; color: var(--ink-2); }
441
+ .col-head { display: flex; align-items: center; gap: 6px; height: 34px; width: 100%; padding: 0 8px; white-space: nowrap; border-radius: 0; }
442
+ .col-head:hover, .col-head[aria-expanded="true"] { background: var(--hover); }
443
+ .col-icon { width: 16px; height: 16px; color: var(--ink-3); }
444
+ .col-add { width: 40px; }
445
+ .db-table td.cell { min-width: 120px; max-width: 320px; }
446
+ .db-table td.type-date, .db-table td.type-created_time, .db-table td.type-last_edited_time { white-space: nowrap; }
447
+ .db-table td.type-date .cell-btn, .db-table td.type-created_time .cell-btn, .db-table td.type-last_edited_time .cell-btn { white-space: nowrap; }
448
+ .db-table td.title-cell { min-width: 260px; position: relative; }
449
+ .db-table th:first-child { min-width: 260px; }
450
+ .row-title { display: inline-flex; align-items: center; gap: 6px; padding: 6px 8px; font-weight: 500; text-align: left; width: 100%; min-height: 32px; }
451
+ .row-title-text { border-bottom: 1px solid var(--line-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
452
+ .row-icon { width: 18px; height: 18px; font-size: 14px; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
453
+ .open-btn { position: absolute; right: 6px; top: 5px; display: none; align-items: center; gap: 4px; height: 22px; padding: 0 6px; font-size: 11px; font-weight: 500; color: var(--ink-2); background: #fff; border-radius: 4px; box-shadow: var(--shadow-card); letter-spacing: 0.02em; }
454
+ .open-btn .icon { width: 14px; height: 14px; }
455
+ tr:hover .open-btn, .row-title:focus-visible + .open-btn { display: inline-flex; }
456
+ .cell-btn { display: flex; align-items: flex-start; width: 100%; min-height: 32px; padding: 6px 8px; text-align: left; white-space: normal; }
457
+ .cell-btn:hover:not(:disabled), .cell-btn[aria-expanded="true"] { background: var(--hover); }
458
+ .cell-btn.readonly { color: var(--ink); }
459
+ .db-table td.type-checkbox { vertical-align: middle; }
460
+ .db-table td.type-checkbox .checkbox { margin: 8px; }
461
+ tbody tr:hover td { background: rgba(55, 53, 47, 0.03); }
462
+ .new-row-btn { display: flex; align-items: center; gap: 6px; height: 32px; width: 100%; padding: 0 8px; color: var(--ink-3); }
463
+ .new-row-btn:hover { background: var(--hover); }
464
+ .new-row-btn .icon { width: 16px; height: 16px; }
465
+ .calc-row td { border: 0; height: 32px; }
466
+ .calc-cell { padding: 0 8px !important; display: flex; align-items: center; justify-content: flex-end; gap: 6px; height: 32px; }
467
+ .calc-label { font-size: 10px; letter-spacing: 0.06em; color: var(--ink-4); font-weight: 500; }
468
+ .calc-value { color: var(--ink-2); }
469
+ .table-empty { padding: 24px 8px; color: var(--ink-4); }
470
+ .empty-row td { border: 0; }
471
+
472
+ /* board */
473
+ .board-wrap { padding: 12px 0; overflow-x: auto; }
474
+ .board { display: flex; gap: 12px; align-items: flex-start; }
475
+ .board-column { width: 260px; flex-shrink: 0; }
476
+ .board-head { display: flex; align-items: center; gap: 8px; height: 32px; padding: 0 4px; }
477
+ .board-count { color: var(--ink-3); font-size: 13px; }
478
+ .board-card { display: block; width: 100%; text-align: left; background: #fff; border-radius: 6px; box-shadow: var(--shadow-card); padding: 8px 10px; margin-bottom: 8px; }
479
+ .board-card:hover { background: rgba(55, 53, 47, 0.03); }
480
+ .card-title { font-weight: 500; display: flex; gap: 4px; align-items: center; margin-bottom: 4px; }
481
+ .card-prop { font-size: 12px; color: var(--ink-2); margin-top: 4px; }
482
+ .card-prop .pill { font-size: 12px; height: 18px; line-height: 18px; }
483
+ .board-new { display: flex; align-items: center; gap: 6px; width: 100%; height: 32px; padding: 0 8px; color: var(--ink-3); border-radius: 4px; }
484
+ .board-new:hover { background: var(--hover); }
485
+ .board-new .icon { width: 16px; height: 16px; }
486
+ .board-empty { color: var(--ink-3); padding: 24px 0; }
487
+
488
+ /* ------------------------------------------------------------------ popovers & menus */
489
+ .popover-host { position: fixed; inset: 0; pointer-events: none; z-index: 100; }
490
+ .popover { position: fixed; background: #fff; border-radius: 10px; box-shadow: var(--shadow); padding: 6px; max-height: calc(100vh - 24px); overflow-y: auto; pointer-events: auto; min-width: 180px; }
491
+ .popover.sidebar-panel { padding: 0 0 8px; }
492
+ .menu { display: flex; flex-direction: column; }
493
+ .menu-item { display: flex; align-items: center; gap: 10px; min-height: 28px; padding: 2px 8px; border-radius: 4px; text-align: left; font-size: 14px; color: var(--ink); width: 100%; }
494
+ .menu-item:hover:not(:disabled), .menu-item:focus-visible { background: var(--hover); outline: none; }
495
+ .menu-item.danger { color: var(--red); }
496
+ .menu-item:disabled { color: var(--ink-4); }
497
+ .menu-icon { width: 18px; height: 18px; color: var(--ink-2); flex-shrink: 0; }
498
+ .menu-item.danger .menu-icon { color: var(--red); }
499
+ .menu-emoji { width: 18px; text-align: center; }
500
+ .menu-labels { display: flex; flex-direction: column; flex: 1; min-width: 0; }
501
+ .menu-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
502
+ .menu-description { font-size: 12px; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
503
+ .menu-check { width: 16px; height: 16px; color: var(--ink-2); margin-left: auto; }
504
+ .menu-shortcut { margin-left: auto; font-size: 12px; color: var(--ink-4); }
505
+ .menu-divider { border-top: 1px solid var(--line); margin: 6px -6px; }
506
+ .menu-header { font-size: 12px; color: var(--ink-3); padding: 6px 8px 2px; font-weight: 500; }
507
+ .menu-footer { border-top: 1px solid var(--line); margin: 6px -6px -6px; padding: 8px 14px 10px; font-size: 12px; color: var(--ink-3); }
508
+ .menu-swatch { width: 16px; height: 16px; border-radius: 3px; }
509
+ .block-menu .menu-item { min-height: 44px; }
510
+ .block-menu .menu-icon { width: 38px; height: 38px; border: 1px solid var(--line-strong); border-radius: 4px; padding: 8px; color: var(--ink); background: #fff; }
511
+ .picker-heading { font-size: 12px; color: var(--ink-3); padding: 6px 8px 2px; font-weight: 500; }
512
+ .picker-list { display: flex; flex-direction: column; max-height: 320px; overflow-y: auto; }
513
+ .picker-item { display: flex; align-items: center; gap: 8px; min-height: 30px; padding: 2px 8px; border-radius: 4px; text-align: left; width: 100%; }
514
+ .picker-item:hover, .picker-item:focus-visible { background: var(--hover); outline: none; }
515
+ .picker-item.selected { background: rgba(35, 131, 226, 0.06); }
516
+ .picker-item.create { color: var(--ink-2); }
517
+ .picker-item.clear { color: var(--ink-3); }
518
+ .picker-label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
519
+ .picker-sub { font-size: 12px; color: var(--ink-3); }
520
+ .picker-icon { width: 16px; height: 16px; color: var(--ink-3); }
521
+ .picker-emoji { width: 18px; text-align: center; }
522
+ .picker-check { width: 16px; height: 16px; color: var(--ink-2); }
523
+ .picker-empty { color: var(--ink-4); padding: 10px 8px; font-size: 13px; }
524
+ .editor-options, .editor-text, .editor-date, .filter-editor, .schema-editor, .emoji-picker { display: flex; flex-direction: column; gap: 6px; padding: 2px; }
525
+ .editor-chips { display: flex; flex-wrap: wrap; gap: 4px; padding: 4px; background: var(--callout); border-radius: 4px; }
526
+ .editor-chips .pill { padding-right: 4px; }
527
+ .editor-search, .editor-input { width: 100%; height: 30px; padding: 0 8px; border: 1px solid var(--line-strong); border-radius: 4px; background: var(--code); outline: none; font-size: 14px; }
528
+ .editor-search:focus, .editor-input:focus { border-color: var(--accent); background: #fff; box-shadow: 0 0 0 2px var(--accent-soft); }
529
+ textarea.editor-input { height: auto; padding: 6px 8px; resize: vertical; font-family: var(--font); }
530
+ .editor-hint { font-size: 12px; color: var(--ink-4); padding: 0 4px; }
531
+ .editor-row { display: flex; flex-direction: column; gap: 4px; }
532
+ .editor-label { font-size: 12px; color: var(--ink-3); }
533
+ .editor-actions { display: flex; justify-content: flex-end; gap: 6px; }
534
+ .filter-editor-head { display: flex; align-items: center; gap: 6px; }
535
+ .filter-select { flex: 1; height: 30px; border: 1px solid var(--line-strong); border-radius: 4px; background: #fff; padding: 0 6px; font-size: 14px; }
536
+ .filter-editor-actions { display: flex; justify-content: flex-start; }
537
+ .schema-list { display: flex; flex-direction: column; gap: 2px; max-height: 260px; overflow-y: auto; }
538
+ .schema-row { display: flex; align-items: center; gap: 6px; padding: 2px 4px; border-radius: 4px; }
539
+ .schema-row.focus { background: rgba(35, 131, 226, 0.06); }
540
+ .schema-name { flex: 1; min-width: 0; border: 1px solid transparent; border-radius: 4px; padding: 3px 6px; background: none; outline: none; }
541
+ .schema-name:focus { border-color: var(--accent); background: #fff; }
542
+ .schema-add { display: flex; gap: 6px; align-items: center; }
543
+ .schema-add .editor-input { flex: 1; }
544
+ .schema-add .filter-select { flex: 0 0 120px; }
545
+ .picker-head { display: flex; align-items: center; justify-content: space-between; }
546
+ .picker-tabs { display: flex; gap: 4px; }
547
+ .picker-tab { font-size: 13px; padding: 2px 6px; color: var(--ink-3); }
548
+ .picker-tab.active { color: var(--ink); border-bottom: 2px solid var(--ink); }
549
+ .emoji-grid { display: grid; grid-template-columns: repeat(10, 32px); gap: 2px; max-height: 240px; overflow-y: auto; }
550
+ .emoji-cell { width: 32px; height: 32px; font-size: 20px; border-radius: 4px; display: inline-flex; align-items: center; justify-content: center; }
551
+ .emoji-cell:hover, .emoji-cell.selected { background: var(--hover); }
552
+ .switcher-menu, .help-menu, .share-popover, .inbox, .trash, .settings { display: flex; flex-direction: column; gap: 6px; padding: 4px; }
553
+ .switcher-account { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--ink-3); padding: 4px 8px; }
554
+ .switcher-row { display: flex; align-items: center; gap: 10px; padding: 6px 8px; border-radius: 4px; }
555
+ .switcher-row.current { background: var(--hover); }
556
+ .switcher-text { flex: 1; min-width: 0; }
557
+ .switcher-title { font-weight: 500; }
558
+ .switcher-sub { font-size: 12px; color: var(--ink-3); white-space: normal; }
559
+ .switcher-integration { padding: 0 8px; }
560
+ .help-menu img { margin: 6px 8px 0; }
561
+ .help-shortcuts { display: flex; flex-direction: column; gap: 4px; padding: 0 8px 6px; }
562
+ .help-shortcut { display: flex; justify-content: space-between; font-size: 13px; color: var(--ink-2); }
563
+ .share-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 8px; }
564
+ .share-row.head { font-weight: 600; }
565
+ .share-badge { font-size: 11px; color: var(--ink-3); background: var(--hover); border-radius: 3px; padding: 0 6px; font-weight: 400; }
566
+ .share-role { font-size: 13px; color: var(--ink-3); white-space: nowrap; }
567
+ .inbox-list, .trash-list { display: flex; flex-direction: column; padding: 0 4px; max-height: 60vh; overflow-y: auto; }
568
+ .inbox-row { display: flex; gap: 10px; padding: 10px 8px; border-radius: 4px; }
569
+ .inbox-row:hover { background: var(--hover); }
570
+ .inbox-body { flex: 1; min-width: 0; font-size: 13px; }
571
+ .inbox-line { color: var(--ink-2); }
572
+ .inbox-author { font-weight: 500; color: var(--ink); }
573
+ .inbox-page { display: inline-flex; align-items: center; gap: 3px; font-weight: 500; color: var(--ink); }
574
+ .inbox-icon { width: 16px; height: 16px; font-size: 13px; }
575
+ .inbox-quote { color: var(--ink); margin-top: 2px; border-left: 2px solid var(--line-strong); padding-left: 8px; }
576
+ .inbox-time { color: var(--ink-4); font-size: 12px; margin-top: 4px; }
577
+ .trash .editor-search { margin: 4px 8px 0; width: auto; }
578
+ .trash-row { display: flex; align-items: center; gap: 4px; padding: 0 4px 0 0; border-radius: 4px; }
579
+ .trash-row:hover { background: var(--hover); }
580
+ .trash-main { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; padding: 6px 8px; }
581
+ .trash-icon { width: 20px; height: 20px; font-size: 16px; }
582
+ .trash-text { min-width: 0; }
583
+ .trash-title { font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
584
+ .trash-path { font-size: 12px; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
585
+ .settings-row { display: flex; justify-content: space-between; gap: 12px; padding: 6px 12px; font-size: 13px; border-bottom: 1px solid var(--line); }
586
+ .settings-label { color: var(--ink-3); }
587
+ .settings-value { text-align: right; }
588
+ .settings .panel-note, .settings .panel-actions { padding: 0 12px; }
589
+ .member-row { display: flex; align-items: center; gap: 10px; padding: 6px 12px; }
590
+ .member-text { flex: 1; min-width: 0; }
591
+ .member-name { font-weight: 500; }
592
+ .member-sub { font-size: 12px; color: var(--ink-3); }
593
+ .member-role { font-size: 13px; color: var(--ink-3); }
594
+
595
+ /* ------------------------------------------------------------------ dialogs */
596
+ dialog { border: 0; padding: 0; color: var(--ink); }
597
+ dialog::backdrop { background: rgba(15, 15, 15, 0.6); }
598
+ .confirm { border-radius: 10px; box-shadow: var(--shadow); width: 320px; padding: 20px 20px 16px; }
599
+ .confirm-title { font-weight: 600; margin: 0 0 6px; font-size: 15px; }
600
+ .confirm-text { margin: 0 0 16px; color: var(--ink-2); }
601
+ .confirm-actions { display: flex; flex-direction: column; gap: 6px; }
602
+ .confirm-actions .btn { justify-content: center; height: 32px; }
603
+ .confirm-ok.primary { background: var(--accent); color: #fff; }
604
+ .search-dialog { width: 755px; max-width: calc(100vw - 32px); margin: 90px auto 0; border-radius: 12px; box-shadow: var(--shadow); background: #fff; overflow: hidden; }
605
+ .search-box { display: flex; flex-direction: column; max-height: min(600px, 80vh); }
606
+ .search-input-row { display: flex; align-items: center; gap: 10px; padding: 12px 16px; border-bottom: 1px solid var(--line); }
607
+ .search-glyph { width: 22px; height: 22px; color: var(--ink-3); }
608
+ .search-input-row input { flex: 1; border: 0; outline: none; font-size: 18px; background: none; }
609
+ .search-input-row input::placeholder { color: var(--ink-4); }
610
+ .search-filters { display: flex; gap: 6px; padding: 8px 16px; border-bottom: 1px solid var(--line); }
611
+ .chip { height: 26px; padding: 0 10px; border-radius: 20px; border: 1px solid var(--line-strong); font-size: 13px; color: var(--ink-2); background: #fff; }
612
+ .chip[aria-pressed="true"] { background: var(--ink); color: #fff; border-color: var(--ink); }
613
+ .search-results { overflow-y: auto; padding: 6px; min-height: 120px; }
614
+ .search-group { font-size: 12px; color: var(--ink-3); padding: 8px 10px 4px; font-weight: 500; }
615
+ .search-row { display: flex; align-items: center; gap: 10px; width: 100%; padding: 6px 10px; border-radius: 6px; text-align: left; min-height: 40px; }
616
+ .search-row.selected, .search-row:hover { background: var(--hover); }
617
+ .search-icon { width: 20px; height: 20px; font-size: 17px; display: inline-flex; align-items: center; justify-content: center; }
618
+ .search-text { flex: 1; min-width: 0; }
619
+ .search-title { font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
620
+ .search-path { font-size: 12px; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
621
+ .search-date { font-size: 12px; color: var(--ink-3); white-space: nowrap; }
622
+ .search-empty { padding: 32px 16px; text-align: center; }
623
+ .search-empty-title { font-weight: 500; margin: 0 0 4px; }
624
+ .search-empty-text { color: var(--ink-3); margin: 0; font-size: 13px; }
625
+ .search-loading { padding: 16px; color: var(--ink-3); }
626
+ .search-footer { display: flex; gap: 18px; padding: 8px 16px; border-top: 1px solid var(--line); font-size: 12px; color: var(--ink-3); background: var(--sidebar); }
627
+
628
+ /* ------------------------------------------------------------------ home */
629
+ .home { max-width: 900px; margin: 0 auto; padding: 60px 48px 80px; }
630
+ .home-greeting { font-size: 28px; font-weight: 600; text-align: center; margin: 0; letter-spacing: -0.01em; }
631
+ .home-date { text-align: center; color: var(--ink-3); margin: 4px 0 40px; }
632
+ .home-section { margin-top: 32px; }
633
+ .home-section-title { display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 600; color: var(--ink-3); margin: 0 0 12px; text-transform: none; }
634
+ .home-section-icon { width: 16px; height: 16px; }
635
+ .recent-strip { display: flex; gap: 16px; overflow-x: auto; padding-bottom: 8px; }
636
+ .recent-card { width: 148px; flex-shrink: 0; border-radius: 12px; box-shadow: var(--shadow-card); overflow: hidden; background: #fff; }
637
+ .recent-card:hover { background: rgba(55, 53, 47, 0.03); }
638
+ .recent-top { height: 46px; background: linear-gradient(135deg, #e8e5df, #d9d5cc); position: relative; }
639
+ .recent-top[data-seed="1"] { background: linear-gradient(135deg, #dfe9f1, #c8dbe9); }
640
+ .recent-top[data-seed="2"] { background: linear-gradient(135deg, #e8f0e5, #cfe0c9); }
641
+ .recent-top[data-seed="3"] { background: linear-gradient(135deg, #f1e8ee, #e2d0dc); }
642
+ .recent-top[data-seed="4"] { background: linear-gradient(135deg, #f5ebdd, #ecd8bd); }
643
+ .recent-top[data-seed="5"] { background: linear-gradient(135deg, #ebe7f3, #d5cbe6); }
644
+ .recent-icon { position: absolute; left: 12px; bottom: -14px; width: 32px; height: 32px; font-size: 26px; display: inline-flex; align-items: flex-end; }
645
+ .recent-icon.glyph { color: var(--ink-3); background: #fff; border-radius: 4px; padding: 4px; box-shadow: var(--shadow-card); }
646
+ .recent-title { font-weight: 500; padding: 20px 12px 4px; font-size: 14px; line-height: 1.3; height: 60px; overflow: hidden; }
647
+ .recent-meta { display: flex; align-items: center; gap: 6px; padding: 0 12px 12px; font-size: 12px; color: var(--ink-3); }
648
+ .home-widget { border-radius: 12px; box-shadow: var(--shadow-card); background: #fff; padding: 12px 16px; }
649
+ .widget-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
650
+ .widget-title { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; font-size: 14px; }
651
+ .widget-icon { font-size: 16px; }
652
+ .widget-filter { font-size: 12px; color: var(--ink-3); background: var(--hover); border-radius: 3px; padding: 0 6px; }
653
+ .widget-list { display: flex; flex-direction: column; }
654
+ .widget-row { display: flex; align-items: center; gap: 8px; height: 34px; padding: 0 6px; border-radius: 4px; border-bottom: 1px solid var(--line); }
655
+ .widget-row:last-child { border-bottom: 0; }
656
+ .widget-row:hover { background: var(--hover); }
657
+ .widget-row-title { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: 500; }
658
+ .widget-row-date { font-size: 12px; color: var(--ink-3); white-space: nowrap; }
659
+ .widget-more { font-size: 13px; color: var(--ink-3); padding: 8px 6px 0; }
660
+ .home-empty { color: var(--ink-3); font-size: 13px; padding: 8px 6px; }
661
+
662
+ /* ------------------------------------------------------------------ peek, panels, misc states */
663
+ .peek { position: absolute; top: 0; right: 0; bottom: 0; width: 55%; min-width: 420px; max-width: 100%; background: #fff; box-shadow: rgba(15, 15, 15, 0.06) 0 0 0 1px, rgba(15, 15, 15, 0.1) -8px 0 24px; z-index: 30; display: flex; flex-direction: column; }
664
+ .peek-head { display: flex; align-items: center; gap: 2px; height: var(--topbar-height); padding: 0 8px; border-bottom: 1px solid var(--line); }
665
+ .peek-actions { margin-left: auto; display: flex; gap: 2px; }
666
+ .peek-body { flex: 1; overflow-y: auto; }
667
+ .peek .page-content { padding: 0 48px; }
668
+ .peek .page-header { padding-top: 40px; }
669
+ .peek .trash-banner { margin: 0 -48px; }
670
+ .empty-state { text-align: center; padding: 120px 24px 40px; }
671
+ .empty-title { font-size: 16px; font-weight: 600; margin: 0 0 6px; }
672
+ .empty-text { color: var(--ink-3); margin: 0 0 16px; }
673
+ .empty-actions { display: flex; justify-content: center; gap: 8px; }
674
+ .empty-actions .btn { border: 1px solid var(--line-strong); }
675
+ .connect-state { text-align: center; padding: 120px 24px; display: flex; flex-direction: column; align-items: center; gap: 8px; }
676
+ .connect-title { font-size: 18px; font-weight: 600; margin: 12px 0 0; }
677
+ .connect-text { color: var(--ink-3); margin: 0 0 12px; max-width: 420px; }
678
+ .skeleton { display: flex; flex-direction: column; gap: 12px; padding: 96px 96px 0; max-width: 900px; margin: 0 auto; }
679
+ .skeleton-line { height: 14px; border-radius: 4px; background: linear-gradient(90deg, rgba(55, 53, 47, 0.06), rgba(55, 53, 47, 0.1), rgba(55, 53, 47, 0.06)); background-size: 200% 100%; animation: shimmer 1.4s infinite; }
680
+ .skeleton-line.w1 { width: 40%; height: 28px; } .skeleton-line.w2 { width: 90%; } .skeleton-line.w3 { width: 75%; } .skeleton-line.w4 { width: 60%; }
681
+ .inline-db-host .skeleton { padding: 8px 0; }
682
+ .peek .skeleton { padding-top: 40px; }
683
+ @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
684
+ .page-loading { padding: 40px; color: var(--ink-3); }
685
+ .help-btn { position: absolute; right: 20px; bottom: 20px; width: 34px; height: 34px; border-radius: 50%; background: #fff; box-shadow: var(--shadow-card); display: inline-flex; align-items: center; justify-content: center; color: var(--ink-2); z-index: 10; }
686
+ .help-btn:hover { color: var(--ink); background: var(--sidebar); }
687
+ .snackbar { position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%); background: var(--ink); color: #fff; border-radius: 6px; padding: 8px 8px 8px 14px; display: flex; align-items: center; gap: 12px; box-shadow: var(--shadow); z-index: 200; font-size: 14px; max-width: min(640px, calc(100vw - 32px)); }
688
+ .snackbar[data-error="true"] { background: #4d2b2b; }
689
+ .snackbar-action { color: #7cc0ff; font-weight: 500; }
690
+ .snackbar-close { color: rgba(255, 255, 255, 0.7); }
691
+ .snackbar-close:hover { background: rgba(255, 255, 255, 0.12); color: #fff; }
692
+ .markdown-area { width: 100%; font-family: var(--mono); font-size: 12px; line-height: 1.5; border: 1px solid var(--line-strong); border-radius: 4px; padding: 8px; resize: vertical; background: var(--code); }
693
+ .panel-comments .discussion:last-of-type { border-bottom: 0; }
694
+
695
+ /* ------------------------------------------------------------------ responsive */
696
+ @media (max-width: 1100px) {
697
+ .page-content, .page-content.wide { padding: 0 56px; }
698
+ .gutter { left: -44px; }
699
+ .trash-banner { margin: 0 -56px; }
700
+ }
701
+ @media (max-width: 768px) {
702
+ .sidebar { position: fixed; top: 0; bottom: 0; left: 0; z-index: 60; margin-left: calc(-1 * var(--sidebar-width)); box-shadow: none; }
703
+ body.sidebar-open .sidebar { margin-left: 0; box-shadow: var(--shadow); }
704
+ body.sidebar-open .sidebar-scrim { display: block; position: fixed; inset: 0; background: rgba(15, 15, 15, 0.4); z-index: 55; }
705
+ .topbar .topbar-menu { display: inline-flex; }
706
+ .sidebar-collapse { display: none; }
707
+ .page-content, .page-content.wide { padding: 0 20px; }
708
+ .gutter { display: none; }
709
+ .trash-banner { margin: 0 -20px; }
710
+ .page-header { padding-top: 40px; }
711
+ .page-title { font-size: 30px; }
712
+ .page-emoji { font-size: 56px; }
713
+ .page-icon { width: 60px; height: 60px; }
714
+ .property-name { width: 120px; }
715
+ .side-panel, .peek { width: 100%; min-width: 0; }
716
+ .home { padding: 32px 20px; }
717
+ .topbar-edited, .btn.share { display: none; }
718
+ .search-dialog { margin-top: 16px; }
719
+ .db-header { padding-top: 40px; }
720
+ }
721
+
722
+ /* Notices for lists the app loads with a request cap (never a silent truncation). */
723
+ .inbox-notice, .list-notice { color: var(--ink-3); font-size: 12px; line-height: 1.4; padding: 6px 12px; background: var(--hover, rgba(55, 53, 47, 0.04)); border-radius: 4px; margin: 4px 8px; }
724
+ .tree-notice { color: var(--ink-4); font-size: 12px; padding: 4px 8px; }
725
+
726
+ /* UI fidelity pass (2026-09-15): controls outside the Tool's scope, extra chrome */
727
+ .not-simulated-tag { margin: 8px 0 0; font-size: 11px; font-weight: 500; letter-spacing: 0.02em; color: var(--ink-4); text-transform: uppercase; }
728
+ .sidebar-new { opacity: 1 !important; }
729
+ .side-item .side-shortcut { margin-left: auto; font-size: 12px; color: var(--ink-4); }
730
+ .topbar-end .icon-btn.fav.on .icon { color: #d9a41b; }
731
+ .view-toolbar .view-actions .icon-btn.unsimulated .icon { width: 17px; height: 17px; }
732
+ .new-split { display: inline-flex; margin-left: 6px; height: 28px; border-radius: 6px; overflow: hidden; }
733
+ .new-split .new-btn { margin-left: 0; border-radius: 0; padding: 0 8px 0 10px; }
734
+ .new-split .new-caret { display: inline-flex; align-items: center; justify-content: center; width: 24px; border-left: 1px solid rgba(255, 255, 255, 0.35); background: var(--accent); color: #fff; }
735
+ .new-split .new-caret:hover { background: var(--accent-hover); }
736
+ .new-split .new-caret .icon { width: 14px; height: 14px; }
737
+ .home-events { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); gap: 16px; align-items: center; padding: 16px 18px; border-radius: 12px; box-shadow: var(--shadow-card); }
738
+ .home-events-lead { display: flex; flex-direction: column; gap: 8px; color: var(--ink-2); font-size: 14px; }
739
+ .home-events-lead .icon { width: 22px; height: 22px; color: var(--ink-3); }
740
+ .home-events-lead .btn { align-self: flex-start; color: #2383e2; padding: 0; }
741
+ .home-events-list { border-left: 1px solid var(--line); padding-left: 16px; color: var(--ink-4); font-size: 13px; }
742
+ .sidebar-ai .side-icon { color: var(--ink-2); }
743
+ @media (max-width: 768px) { .home-events { grid-template-columns: 1fr; } .home-events-list { border-left: 0; padding-left: 0; } }
744
+ .not-simulated .panel-note, .not-simulated .not-simulated-tag { padding: 0 16px; }
745
+ .not-simulated .not-simulated-tag { padding-bottom: 12px; }
746
+ /* Table cells stay on one line (the product's default "Wrap cells" off); rich text wraps only in the peek/page. */
747
+ .db-table td.type-multi_select .prop-value, .db-table td.type-relation .prop-value, .db-table td.type-people .prop-value { flex-wrap: nowrap; white-space: nowrap; overflow: hidden; max-width: 100%; }
748
+ .db-table td.type-multi_select .cell-btn, .db-table td.type-relation .cell-btn, .db-table td.type-people .cell-btn { overflow: hidden; }
749
+ .db-table td.type-people .cell-btn, .db-table td.created_by .cell-btn, .db-table td.type-created_by .cell-btn { padding-top: 5px; padding-bottom: 3px; }
750
+ .db-table td.type-rich_text .cell-btn { white-space: nowrap; overflow: hidden; }
751
+ .db-table td.type-rich_text .prop-value { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 320px; }
752
+
753
+ /* Teamspaces and Shared: rendered in place, not simulated */
754
+ .sidebar-stub { margin-top: 10px; padding: 0 0 2px; }
755
+ .sidebar-stub .side-item { margin: 0 8px; width: calc(100% - 16px); color: var(--ink-3); }
756
+ .sidebar-stub .side-item .side-icon { color: var(--ink-4); }
757
+ .section-toggle { border-radius: 4px; padding: 1px 4px; margin-left: -4px; text-align: left; }
758
+ .section-toggle:hover { background: var(--hover); color: var(--ink-2); }
759
+ .section-actions { display: inline-flex; gap: 2px; }
760
+ .section-head .section-actions .icon-btn { opacity: 0; }
761
+ .section-head:hover .section-actions .icon-btn, .section-actions .icon-btn:focus-visible { opacity: 1; }
762
+
763
+ /* Inline text toolbar over a selection */
764
+ .format-bar {
765
+ position: fixed; z-index: 60; display: flex; align-items: center; height: 36px; padding: 0 4px; gap: 1px;
766
+ background: #fff; border-radius: 8px; white-space: nowrap;
767
+ box-shadow: rgba(15, 15, 15, 0.05) 0 0 0 1px, rgba(15, 15, 15, 0.1) 0 3px 6px, rgba(15, 15, 15, 0.2) 0 9px 24px;
768
+ }
769
+ .format-btn { display: inline-flex; align-items: center; gap: 4px; height: 28px; min-width: 28px; justify-content: center; padding: 0 6px; border-radius: 4px; color: var(--ink); font-size: 14px; }
770
+ .format-btn:hover, .format-btn[aria-expanded="true"] { background: var(--hover); }
771
+ .format-btn .icon { width: 16px; height: 16px; }
772
+ .format-btn .format-caret { width: 12px; height: 12px; color: var(--ink-3); }
773
+ .format-ai { color: #7c5cdb; font-weight: 500; }
774
+ .format-ai .icon { color: #7c5cdb; }
775
+ .format-label { font-size: 14px; }
776
+ .format-glyph { font-size: 15px; line-height: 1; }
777
+ .format-bold .format-glyph { font-weight: 700; }
778
+ .format-italic .format-glyph { font-style: italic; font-family: Georgia, "Times New Roman", serif; }
779
+ .format-underline .format-glyph { text-decoration: underline; }
780
+ .format-strike .format-glyph { text-decoration: line-through; }
781
+ .format-code .format-glyph { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; }
782
+ .format-color .format-glyph { text-decoration: underline; text-decoration-color: var(--ink-4); }
783
+ .format-divider { width: 1px; height: 20px; background: rgba(55, 53, 47, 0.09); margin: 0 3px; }
784
+ @media (max-width: 768px) { .format-bar { max-width: calc(100vw - 16px); overflow-x: auto; } .format-label { display: none; } }
785
+
786
+ /* Cover hover controls and picker */
787
+ .page-cover-actions { position: absolute; right: max(96px, calc(50% - 354px)); bottom: 46px; display: flex; gap: 0; opacity: 0; z-index: 3; transition: opacity 0.15s; background: #fff; border-radius: 4px; box-shadow: rgba(15, 15, 15, 0.1) 0 0 0 1px; overflow: hidden; }
788
+ .page-cover:hover .page-cover-actions, .page-cover-actions:focus-within { opacity: 1; }
789
+ .page-cover-actions .btn { height: 26px; border-radius: 0; font-size: 12px; color: var(--ink-2); padding: 0 8px; }
790
+ .page-cover-actions .btn + .btn { border-left: 1px solid rgba(55, 53, 47, 0.09); }
791
+ .cover-picker { padding: 0; }
792
+ .cover-tabs { display: flex; align-items: center; gap: 2px; padding: 6px 8px 0; border-bottom: 1px solid rgba(55, 53, 47, 0.09); }
793
+ .cover-tab { height: 32px; padding: 0 8px; font-size: 14px; color: var(--ink-2); border-bottom: 2px solid transparent; }
794
+ .cover-tab[aria-selected="true"] { color: var(--ink); border-bottom-color: var(--ink); }
795
+ .cover-tab:disabled { color: var(--ink-4); cursor: not-allowed; }
796
+ .cover-tabs-gap { flex: 1; }
797
+ .cover-remove { font-size: 14px; color: var(--ink-3); padding: 0 8px; height: 28px; border-radius: 4px; }
798
+ .cover-remove:hover:not(:disabled) { background: var(--hover); }
799
+ .cover-remove:disabled { color: var(--ink-4); }
800
+ .cover-body { padding: 12px; display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
801
+ .cover-group { width: 100%; font-size: 12px; color: var(--ink-3); font-weight: 500; }
802
+ .cover-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; width: 100%; }
803
+ .cover-swatch { height: 64px; border-radius: 4px; background: linear-gradient(135deg, #d7e8f3, #c3d9ea); }
804
+ .cover-swatch:hover { opacity: 0.85; }
805
+ .cover-swatch.current { box-shadow: 0 0 0 2px var(--accent); }
806
+ .cover-swatch[data-seed="1"] { background: linear-gradient(135deg, #f3e2d4, #e8cbb0); }
807
+ .cover-swatch[data-seed="2"] { background: linear-gradient(135deg, #dcefdc, #bfdfc2); }
808
+ .cover-swatch[data-seed="3"] { background: linear-gradient(135deg, #ece3f3, #d7c4e8); }
809
+ .cover-swatch[data-seed="4"] { background: linear-gradient(135deg, #fbe4e4, #f2c6c6); }
810
+ .cover-swatch[data-seed="5"] { background: linear-gradient(135deg, #f6efd6, #ecdfae); }
811
+ .cover-link { flex: 1; min-width: 0; height: 32px; padding: 0 10px; border-radius: 6px; border: 1px solid rgba(55, 53, 47, 0.16); background: rgba(242, 241, 238, 0.6); font: inherit; }
812
+ .cover-link[aria-invalid="true"] { border-color: var(--red); }
813
+ .cover-note-text { width: 100%; margin: 4px 0 0; font-size: 12px; color: var(--ink-3); }
814
+
815
+ /* Home: Learn cards (text-only) */
816
+ .learn-strip { display: flex; gap: 16px; overflow-x: auto; padding-bottom: 8px; }
817
+ .learn-card { width: calc((100% - 48px) / 4); min-width: 160px; flex-shrink: 0; border-radius: 12px; box-shadow: var(--shadow-card); overflow: hidden; background: #fff; text-align: left; display: flex; flex-direction: column; }
818
+ .learn-card:hover { background: rgba(55, 53, 47, 0.03); }
819
+ .learn-top { height: 84px; display: flex; align-items: center; justify-content: center; background: #f1f1ef; color: rgba(55, 53, 47, 0.35); }
820
+ .learn-top[data-seed="1"] { background: #f4eeee; }
821
+ .learn-top[data-seed="2"] { background: #eef3ed; }
822
+ .learn-top[data-seed="3"] { background: #e9f3f7; }
823
+ .learn-glyph { width: 32px; height: 32px; }
824
+ .learn-title { font-size: 14px; font-weight: 500; color: var(--ink); padding: 10px 12px 4px; line-height: 1.35; }
825
+ .learn-meta { display: flex; align-items: center; gap: 4px; font-size: 12px; color: var(--ink-3); padding: 0 12px 12px; }
826
+ .learn-meta-icon { width: 14px; height: 14px; }