@acms-subir/core 0.0.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 (107) hide show
  1. package/cli.mjs +75 -0
  2. package/integration.mjs +286 -0
  3. package/package.json +89 -0
  4. package/src/actions/index.ts +502 -0
  5. package/src/components/DesignManager.tsx +542 -0
  6. package/src/components/LinksManager.tsx +694 -0
  7. package/src/components/Modal.astro +65 -0
  8. package/src/components/NavManager.tsx +168 -0
  9. package/src/components/WidgetRenderer.astro +84 -0
  10. package/src/components/builder/PageBuilder.tsx +575 -0
  11. package/src/components/editor/ImagePicker.tsx +215 -0
  12. package/src/components/editor/PostEditor.tsx +1011 -0
  13. package/src/components/editor/PreviewOverlay.tsx +77 -0
  14. package/src/components/editor/extensions/calendar.tsx +230 -0
  15. package/src/components/editor/extensions/cards.tsx +488 -0
  16. package/src/components/editor/extensions/codeBlock.tsx +70 -0
  17. package/src/components/editor/extensions/infoCards.tsx +270 -0
  18. package/src/components/editor/extensions/mediaCards.tsx +376 -0
  19. package/src/components/editor/extensions/postList.tsx +130 -0
  20. package/src/components/editor/extensions/slash.tsx +250 -0
  21. package/src/components/editor/extensions/tableTyping.ts +63 -0
  22. package/src/components/editor/imaging.ts +146 -0
  23. package/src/components/media/CropModal.tsx +229 -0
  24. package/src/components/media/MediaLibrary.tsx +295 -0
  25. package/src/layouts/Admin.astro +119 -0
  26. package/src/layouts/Site.astro +218 -0
  27. package/src/lib/auth.ts +94 -0
  28. package/src/lib/backup/unzip.ts +38 -0
  29. package/src/lib/backup/zip.ts +105 -0
  30. package/src/lib/blocksToHtml.ts +68 -0
  31. package/src/lib/brand.ts +26 -0
  32. package/src/lib/calendar/ics.ts +402 -0
  33. package/src/lib/calendar/render.ts +275 -0
  34. package/src/lib/calendar/src.ts +68 -0
  35. package/src/lib/content.ts +53 -0
  36. package/src/lib/dates.ts +34 -0
  37. package/src/lib/dynamicBlocks.ts +115 -0
  38. package/src/lib/env.ts +6 -0
  39. package/src/lib/highlightCode.ts +44 -0
  40. package/src/lib/i18n.ts +40 -0
  41. package/src/lib/markdown.ts +7 -0
  42. package/src/lib/media/store.ts +95 -0
  43. package/src/lib/net.ts +51 -0
  44. package/src/lib/preview.ts +28 -0
  45. package/src/lib/repo/d1.ts +44 -0
  46. package/src/lib/repo/index.ts +23 -0
  47. package/src/lib/repo/migrations.ts +231 -0
  48. package/src/lib/repo/search.ts +14 -0
  49. package/src/lib/repo/sql.ts +721 -0
  50. package/src/lib/repo/sqlite.ts +43 -0
  51. package/src/lib/repo/types.ts +132 -0
  52. package/src/lib/schema.ts +286 -0
  53. package/src/lib/seo.ts +37 -0
  54. package/src/lib/theme.ts +206 -0
  55. package/src/lib/widgets.ts +108 -0
  56. package/src/middleware.ts +109 -0
  57. package/src/pages/[...slug].astro +43 -0
  58. package/src/pages/admin/c/[collection]/[id].astro +56 -0
  59. package/src/pages/admin/c/[collection]/index.astro +163 -0
  60. package/src/pages/admin/design.astro +42 -0
  61. package/src/pages/admin/index.astro +145 -0
  62. package/src/pages/admin/links.astro +21 -0
  63. package/src/pages/admin/login.astro +83 -0
  64. package/src/pages/admin/logout.ts +7 -0
  65. package/src/pages/admin/media.astro +13 -0
  66. package/src/pages/admin/navigation.astro +17 -0
  67. package/src/pages/admin/pages/[id].astro +49 -0
  68. package/src/pages/admin/pages/index.astro +100 -0
  69. package/src/pages/admin/posts/[id].astro +6 -0
  70. package/src/pages/admin/posts/index.astro +7 -0
  71. package/src/pages/admin/settings.astro +512 -0
  72. package/src/pages/admin/tags.astro +101 -0
  73. package/src/pages/admin/users.astro +149 -0
  74. package/src/pages/api/backup.ts +63 -0
  75. package/src/pages/api/drafts.ts +106 -0
  76. package/src/pages/api/media/upload.ts +89 -0
  77. package/src/pages/api/restore.ts +102 -0
  78. package/src/pages/author/[slug].astro +66 -0
  79. package/src/pages/blog/[slug].astro +240 -0
  80. package/src/pages/blog/index.astro +51 -0
  81. package/src/pages/blog/tag/[slug].astro +83 -0
  82. package/src/pages/embed/[pageId]/[blockId].ts +45 -0
  83. package/src/pages/go/[id].ts +10 -0
  84. package/src/pages/index.astro +52 -0
  85. package/src/pages/links.astro +110 -0
  86. package/src/pages/llms.txt.ts +47 -0
  87. package/src/pages/media/[...key].ts +18 -0
  88. package/src/pages/preview/[type]/[id].astro +52 -0
  89. package/src/pages/robots.txt.ts +28 -0
  90. package/src/pages/rss.xml.ts +58 -0
  91. package/src/pages/search.astro +83 -0
  92. package/src/pages/sitemap.xml.ts +55 -0
  93. package/src/styles/admin.css +652 -0
  94. package/src/styles/builder.css +121 -0
  95. package/src/styles/cards.css +176 -0
  96. package/src/styles/editor.css +596 -0
  97. package/src/styles/site.css +427 -0
  98. package/src/themes/editorial/templates/home.astro +127 -0
  99. package/src/themes/editorial/templates/post-minimal.astro +50 -0
  100. package/src/themes/editorial/theme.css +108 -0
  101. package/src/themes/editorial/theme.json +20 -0
  102. package/src/themes/field/theme.json +17 -0
  103. package/src/themes/ink/theme.json +17 -0
  104. package/src/themes/night/theme.css +7 -0
  105. package/src/themes/night/theme.json +17 -0
  106. package/src/virtual.d.ts +25 -0
  107. package/src/worker.ts +28 -0
@@ -0,0 +1,652 @@
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. */
4
+ *, *::before, *::after { box-sizing: border-box; }
5
+ :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;
25
+
26
+ /* accent — signal orange */
27
+ --accent: #ee5d20;
28
+ --accent-strong: #d94f15;
29
+ --accent-soft: rgb(238 93 32 / 10%);
30
+ --accent-ring: rgb(238 93 32 / 18%);
31
+ --accent-deep: #c2410c;
32
+
33
+ /* status */
34
+ --green: #127442;
35
+ --green-soft: #ddf4e7;
36
+ --amber: #93660c;
37
+ --amber-soft: #faeed2;
38
+ --red: #d24545;
39
+ --red-soft: rgb(210 69 69 / 10%);
40
+
41
+ /* dark code islands (stay dark on the light canvas) */
42
+ --code-bg: #1f232c;
43
+ --code-text: #e6e9f0;
44
+
45
+ /* radius scale */
46
+ --r-sm: 8px;
47
+ --r-md: 10px;
48
+ --r-lg: 16px;
49
+ --r-xl: 20px;
50
+ --r-full: 999px;
51
+ --radius: var(--r-lg);
52
+
53
+ /* spacing scale (4px grid) */
54
+ --s-1: 4px; --s-2: 8px; --s-3: 12px; --s-4: 16px;
55
+ --s-5: 20px; --s-6: 24px; --s-8: 32px; --s-10: 40px;
56
+
57
+ /* 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%);
61
+ }
62
+ html { color-scheme: light; }
63
+ body {
64
+ margin: 0;
65
+ background: var(--bg);
66
+ color: var(--text);
67
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
68
+ font-size: 13.5px;
69
+ line-height: 1.55;
70
+ -webkit-font-smoothing: antialiased;
71
+ }
72
+ a { color: var(--accent-deep); text-decoration: none; }
73
+
74
+ /* shell */
75
+ .shell { display: flex; min-height: 100vh; }
76
+ .sidebar {
77
+ 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;
82
+ position: sticky; top: 0; height: 100vh;
83
+ }
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; }
87
+ .nav-item {
88
+ display: flex; align-items: center; gap: 9px;
89
+ padding: 7px 10px; border-radius: var(--r-md);
90
+ color: var(--side-muted); font-weight: 500;
91
+ }
92
+ .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; }
104
+ .topbar {
105
+ 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;
108
+ }
109
+ .crumb { color: var(--muted); font-size: 12.5px; }
110
+ .crumb b { color: var(--text); font-weight: 600; }
111
+ .content { padding: clamp(20px, 3vw, 40px); max-width: 1360px; margin-inline: auto; }
112
+ .content-wide { max-width: none; }
113
+ .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; }
115
+
116
+ /* cards & stats */
117
+ .card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: var(--shadow-card); }
118
+ .card + .card { margin-top: 16px; }
119
+ .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; }
121
+ .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; margin-bottom: 16px; }
122
+ .stat { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: var(--shadow-card); padding: 14px 16px; }
123
+ .stat .label { font-size: 12px; color: var(--muted); }
124
+ .stat .value { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; margin-top: 2px; font-variant-numeric: tabular-nums; }
125
+
126
+ /* table */
127
+ 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); }
129
+ .list td { padding: 12px 18px; border-bottom: 1px solid var(--line); vertical-align: middle; }
130
+ .list tr:last-child td { border-bottom: none; }
131
+ .list tr:hover td { background: rgb(26 29 37 / 2.5%); }
132
+ .list .t-title { font-weight: 600; color: var(--text); }
133
+ .list .t-sub { color: var(--faint); font-size: 12px; }
134
+ .list td.num { text-align: right; font-variant-numeric: tabular-nums; color: var(--muted); }
135
+
136
+ /* pills */
137
+ .pill { display: inline-block; font-size: 11px; font-weight: 600; padding: 2px 9px; border-radius: var(--r-full); }
138
+ .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); }
143
+ .pill.lang { background: var(--panel-2); color: var(--muted); border: 1px solid var(--line); }
144
+
145
+ /* buttons & forms */
146
+ .btn {
147
+ display: inline-flex; align-items: center; gap: 6px;
148
+ background: var(--panel); color: var(--text);
149
+ border: 1px solid var(--line-strong); border-radius: var(--r-md);
150
+ padding: 6px 13px; font-size: 13px; font-weight: 600;
151
+ cursor: pointer; font-family: inherit;
152
+ box-shadow: var(--shadow-sm);
153
+ }
154
+ .btn:hover { border-color: var(--faint); }
155
+ .btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
156
+ .btn.primary:hover { background: var(--accent-strong); border-color: var(--accent-strong); }
157
+ .btn.danger { color: var(--red); }
158
+ .btn.sm { padding: 3px 9px; font-size: 12px; }
159
+ .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%); }
161
+ 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
+ width: 100%; background: var(--panel); color: var(--text);
163
+ border: 1px solid var(--line-strong); border-radius: var(--r-md);
164
+ padding: 7px 11px; font-size: 13.5px; font-family: inherit;
165
+ }
166
+ input[type='search'] { -webkit-appearance: none; appearance: none; }
167
+ input[type='search']::-webkit-search-cancel-button { -webkit-appearance: none; }
168
+ textarea { resize: vertical; line-height: 1.6; }
169
+ textarea.code { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12.5px; }
170
+ input:focus, textarea:focus, select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
171
+ label.field { display: block; margin-bottom: 12px; }
172
+ label.field > span { display: block; font-size: 12px; color: var(--muted); margin-bottom: 5px; font-weight: 500; }
173
+ .field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
174
+ .form-actions { display: flex; gap: 8px; align-items: center; margin-top: 16px; flex-wrap: wrap; }
175
+ .inline-form { display: inline; }
176
+ .hint { color: var(--faint); font-size: 12px; }
177
+ .flash { background: var(--green-soft); color: var(--green); border: 1px solid rgb(18 116 66 / 22%); border-radius: var(--r-md); padding: 8px 13px; margin-bottom: 14px; font-size: 13px; }
178
+ .flash.error { background: var(--red-soft); color: var(--red); border-color: rgb(210 69 69 / 28%); }
179
+
180
+ /* editable row lists (links, tags) */
181
+ .rowlist .row { display: flex; align-items: center; gap: 6px; padding: 7px 12px 7px 6px; border-bottom: 1px solid var(--line); }
182
+ .rowlist .row:last-child { border-bottom: none; }
183
+ .rowlist .row:hover { background: rgb(26 29 37 / 2.5%); }
184
+ .rowlist .empty { padding: 22px 18px; }
185
+ .row-edit { display: flex; flex: 1; align-items: center; gap: 6px; min-width: 0; }
186
+ input.bare { background: transparent; border-color: transparent; box-shadow: none; }
187
+ input.bare:hover { border-color: var(--line); }
188
+ input.bare:focus { background: var(--panel); }
189
+ input.bare.strong { font-weight: 600; }
190
+ input.bare.dim { color: var(--muted); }
191
+ input.bare.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12.5px; }
192
+ .icon-tile { flex: 0 0 38px; text-align: center; padding-left: 0; padding-right: 0; }
193
+ .row .meta { color: var(--faint); font-size: 12px; white-space: nowrap; font-variant-numeric: tabular-nums; padding: 0 6px; }
194
+ .row .reveal { opacity: 0; transition: opacity 0.12s; }
195
+ .row:hover .reveal, .row:focus-within .reveal { opacity: 1; }
196
+ .order-col { display: flex; flex-direction: column; flex: 0 0 auto; }
197
+ .order-col .btn { padding: 0 6px; font-size: 10px; line-height: 1.5; }
198
+
199
+ /* media library: toolbar + tile grid + detail drawer */
200
+ .ml { position: relative; }
201
+ .ml-count { font-size: 12px; color: var(--faint); font-weight: 500; margin-left: 8px; }
202
+ .ml-tools { display: flex; align-items: center; gap: 10px; }
203
+ .ml-search { position: relative; width: 260px; }
204
+ .ml-search svg { position: absolute; left: 11px; top: 50%; transform: translateY(-50%); width: 14px; height: 14px; color: var(--faint); pointer-events: none; }
205
+ .ml-search input[type='search'] { border-radius: var(--r-full); padding: 6px 32px 6px 33px; font-size: 13px; }
206
+ .ml-search kbd {
207
+ position: absolute; right: 11px; top: 50%; transform: translateY(-50%);
208
+ font: 600 10.5px/1 Inter, system-ui, sans-serif; color: var(--faint);
209
+ border: 1px solid var(--line); border-radius: 4px; padding: 2px 5px; background: var(--panel-2);
210
+ pointer-events: none;
211
+ }
212
+ .ml-layout { display: flex; gap: 20px; align-items: flex-start; }
213
+ .ml-grid { flex: 1; min-width: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
214
+ .ml-tile {
215
+ position: relative; display: block; width: 100%; padding: 0; text-align: left;
216
+ background: var(--panel); color: var(--text); font-family: inherit;
217
+ border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden;
218
+ box-shadow: var(--shadow-sm);
219
+ cursor: pointer; transition: border-color 0.12s, transform 0.12s;
220
+ }
221
+ .ml-tile:hover { border-color: var(--line-strong); transform: translateY(-1px); }
222
+ .ml-tile.sel, .ml-tile:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
223
+ .ml-thumb { display: block; aspect-ratio: 1; background: var(--panel-2); }
224
+ .ml-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
225
+ .ml-noalt {
226
+ position: absolute; top: 7px; left: 7px;
227
+ font-size: 9.5px; font-weight: 800; letter-spacing: 0.05em; text-transform: uppercase;
228
+ background: var(--amber-soft); color: var(--amber); border-radius: var(--r-full); padding: 2px 7px;
229
+ backdrop-filter: blur(4px);
230
+ }
231
+ .ml-cap { display: block; padding: 7px 10px 8px; }
232
+ .ml-name { display: block; font-size: 12px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
233
+ .ml-sub { display: block; font-size: 11px; color: var(--faint); }
234
+ .ml-drawer {
235
+ width: 280px; flex: 0 0 280px; position: sticky; top: 66px;
236
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg);
237
+ box-shadow: var(--shadow-card);
238
+ padding: 14px; font-size: 12.5px;
239
+ }
240
+ .ml-big { display: block; border-radius: var(--r-md); overflow: hidden; border: 1px solid var(--line); background: var(--panel-2); margin-bottom: 12px; }
241
+ .ml-big img { width: 100%; max-height: 220px; object-fit: contain; display: block; }
242
+ .ml-dname { font-weight: 700; font-size: 13px; overflow-wrap: anywhere; margin-bottom: 10px; }
243
+ .ml-saved { font-style: normal; color: var(--green); font-size: 11px; margin-left: 6px; }
244
+ .ml-kv { display: flex; justify-content: space-between; gap: 10px; color: var(--muted); font-size: 12px; padding: 3px 0; }
245
+ .ml-kv b { color: var(--text); font-weight: 600; font-variant-numeric: tabular-nums; }
246
+ .ml-actions { display: flex; align-items: center; gap: 6px; margin-top: 12px; }
247
+ .ml-dropveil {
248
+ position: absolute; inset: -10px; z-index: 10;
249
+ border: 2px dashed var(--accent); border-radius: var(--r-lg); background: var(--accent-soft);
250
+ display: flex; align-items: center; justify-content: center;
251
+ font-weight: 700; color: var(--accent-deep); pointer-events: none;
252
+ }
253
+ @media (max-width: 900px) {
254
+ .ml-layout { flex-direction: column; }
255
+ .ml-drawer { position: static; width: 100%; flex: none; }
256
+ .ml-search { width: 100%; }
257
+ .ml-tools { flex: 1; }
258
+ }
259
+
260
+ /* 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; }
265
+ .lm-item .row { border-bottom: none; }
266
+ .lm-item .row.is-open { border-bottom: 1px dashed var(--line); }
267
+ .lm-item.is-dragging { position: relative; z-index: 5; background: var(--panel); box-shadow: var(--shadow-pop); border-radius: var(--r-md); }
268
+ .lm-badge {
269
+ 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;
271
+ }
272
+
273
+ /* 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; }
276
+ .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));
280
+ user-select: none; cursor: pointer; position: relative; overflow: hidden; font-family: inherit;
281
+ }
282
+ .lm-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
283
+ .lm-avatar-hint {
284
+ position: absolute; inset: auto 0 0 0; padding: 2px 0 3px;
285
+ font-size: 9px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;
286
+ background: rgb(0 0 0 / 55%); color: #fff; opacity: 0; transition: opacity 0.12s;
287
+ }
288
+ .lm-avatar:hover .lm-avatar-hint { opacity: 1; }
289
+ .lm-avatar-remove {
290
+ position: absolute; top: -4px; right: -4px; width: 18px; height: 18px;
291
+ border-radius: 50%; border: 1px solid var(--line-strong); background: var(--panel); color: var(--muted);
292
+ font-size: 9px; cursor: pointer; display: grid; place-items: center; padding: 0;
293
+ opacity: 0; transition: opacity 0.12s;
294
+ }
295
+ .lm-avatarwrap:hover .lm-avatar-remove { opacity: 1; }
296
+ .lm-avatar-remove:hover { color: var(--red); border-color: var(--red); }
297
+ .lm-profile-fields { flex: 1; min-width: 0; }
298
+ .lm-profile-name {
299
+ display: block; width: 100%; background: none; border: 1px solid transparent; border-radius: var(--r-md);
300
+ color: var(--text); font-family: inherit; font-size: 17px; font-weight: 700; letter-spacing: -0.01em;
301
+ padding: 3px 8px; margin-left: -8px; outline: none;
302
+ }
303
+ .lm-profile-bio {
304
+ display: block; width: 100%; background: none; border: 1px solid transparent; border-radius: var(--r-md);
305
+ color: var(--muted); font-family: inherit; font-size: 13px; line-height: 1.55;
306
+ padding: 3px 8px; margin: 1px 0 0 -8px; outline: none; resize: none; overflow: hidden;
307
+ }
308
+ .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); }
311
+
312
+ /* add-block picker */
313
+ .lm-picker-head { display: flex; align-items: center; gap: 8px; }
314
+ .lm-picker-head .card-title { margin: 0; flex: 1; }
315
+ .lm-group-label {
316
+ font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em;
317
+ color: var(--faint); margin: 14px 0 8px;
318
+ }
319
+ .lm-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(185px, 1fr)); gap: 8px; }
320
+ .lm-tile {
321
+ display: flex; gap: 10px; align-items: center; text-align: left;
322
+ background: transparent; border: 1px solid var(--line); border-radius: var(--r-md);
323
+ padding: 9px 11px; cursor: pointer; font-family: inherit; color: var(--text);
324
+ transition: border-color 0.12s, background 0.12s;
325
+ }
326
+ .lm-tile:hover { border-color: var(--accent); background: var(--accent-soft); }
327
+ .lm-tile-ico {
328
+ 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;
330
+ transition: background 0.12s, color 0.12s;
331
+ }
332
+ .lm-tile:hover .lm-tile-ico { background: var(--accent); color: #fff; }
333
+ .lm-tile-ico svg { width: 18px; height: 18px; }
334
+ .lm-tile-body { min-width: 0; }
335
+ .lm-tile-body b { display: block; font-size: 12.5px; line-height: 1.3; }
336
+ .lm-tile-body span {
337
+ display: block; font-size: 11px; color: var(--faint); line-height: 1.35; margin-top: 1px;
338
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
339
+ }
340
+
341
+ /* predefined-site grid */
342
+ .lm-sites { display: grid; grid-template-columns: repeat(auto-fill, minmax(132px, 1fr)); gap: 6px; margin-top: 12px; }
343
+ .lm-site {
344
+ display: flex; align-items: center; gap: 8px;
345
+ background: transparent; border: 1px solid var(--line); border-radius: var(--r-sm);
346
+ padding: 8px 10px; cursor: pointer; font-family: inherit; font-size: 12.5px; font-weight: 600;
347
+ transition: border-color 0.12s, background 0.12s;
348
+ }
349
+ .lm-site span:last-child { color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
350
+ .lm-site:hover { border-color: currentColor; background: color-mix(in srgb, currentColor 10%, transparent); }
351
+ .lm-site-ico { display: grid; place-items: center; width: 18px; height: 18px; flex: 0 0 auto; }
352
+ .lm-site-ico svg { width: 16px; height: 16px; fill: currentColor; }
353
+
354
+ /* icon control */
355
+ .lm-iconwrap { position: relative; flex: 0 0 auto; }
356
+ .lm-iconbtn {
357
+ width: 34px; height: 30px; display: grid; place-items: center;
358
+ background: transparent; border: 1px solid transparent; border-radius: var(--r-sm);
359
+ cursor: pointer; font-family: inherit; color: var(--text);
360
+ }
361
+ .lm-iconbtn:hover { border-color: var(--line); background: var(--panel-2); }
362
+ .lm-iconbtn img { width: 18px; height: 18px; border-radius: 4px; object-fit: cover; }
363
+ .lm-iconface { display: grid; place-items: center; width: 18px; height: 18px; }
364
+ .lm-iconface svg { width: 16px; height: 16px; fill: currentColor; }
365
+ .lm-iconface-empty { color: var(--faint); font-size: 13px; }
366
+ .lm-iconpop {
367
+ position: absolute; left: 0; top: calc(100% + 6px); z-index: 30; width: 240px;
368
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md);
369
+ padding: 12px; box-shadow: var(--shadow-pop);
370
+ }
371
+ .lm-iconpop .field { margin-bottom: 10px; }
372
+
373
+ /* per-button color control */
374
+ .lm-colorpop { left: auto; right: 0; width: 220px; }
375
+ .lm-colorswatch {
376
+ width: 20px; height: 20px; border-radius: 6px; display: grid; place-items: center;
377
+ font-size: 12px; font-weight: 700; line-height: 1; border: 1px solid var(--line-strong);
378
+ }
379
+ .lm-colorswatch-empty { color: var(--faint); background: transparent; border-style: dashed; }
380
+ .lm-colorrow { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; font-size: 12.5px; }
381
+ .lm-colorrow > span { flex: 1; text-align: left; color: var(--muted); }
382
+ .lm-colorrow input[type='color'] {
383
+ width: 34px; height: 26px; padding: 2px; border: 1px solid var(--line-strong); border-radius: var(--r-sm);
384
+ background: var(--panel); cursor: pointer;
385
+ }
386
+
387
+ /* text block + vcard editors */
388
+ .lm-plaintext {
389
+ display: block; width: 100%; border: none; outline: none; resize: vertical;
390
+ background: var(--panel-2); color: var(--text); padding: 12px 14px; min-height: 90px;
391
+ font-family: inherit; font-size: 13.5px; line-height: 1.6;
392
+ }
393
+ .lm-plaintext::placeholder { color: var(--faint); }
394
+ .lm-fields { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; padding: 12px 14px; background: var(--panel-2); }
395
+ @media (max-width: 900px) { .lm-fields { grid-template-columns: 1fr; } }
396
+ .lm-fields .field { margin: 0; }
397
+ .lm-select {
398
+ background: var(--panel); color: var(--text); border: 1px solid var(--line-strong); border-radius: var(--r-sm);
399
+ padding: 5px 8px; font-size: 12.5px; font-family: inherit; width: auto;
400
+ }
401
+ /* syntax-highlighted code editor: transparent textarea over a Prism <pre>.
402
+ Code stays a dark island on the light canvas. */
403
+ .lm-codewrap { position: relative; background: var(--code-bg); }
404
+ .lm-code, .lm-codehl {
405
+ margin: 0; padding: 12px 14px; tab-size: 2;
406
+ font-family: ui-monospace, 'SF Mono', monospace; font-size: 12.5px; line-height: 1.55;
407
+ white-space: pre-wrap; word-break: break-word;
408
+ }
409
+ .lm-code {
410
+ position: relative; z-index: 1; display: block; width: 100%; min-height: 130px;
411
+ border: none; outline: none; resize: vertical;
412
+ background: transparent; color: transparent; caret-color: var(--code-text);
413
+ }
414
+ .lm-code::placeholder { color: #7c8494; }
415
+ .lm-code::selection { background: rgb(255 138 76 / 30%); }
416
+ .lm-codehl { position: absolute; inset: 0; overflow: hidden; pointer-events: none; color: #d4d4d4; }
417
+
418
+ /* VS Code Dark+ token colors (dark code island) */
419
+ .lm-codehl .token.comment, .lm-codehl .token.doctype, .lm-codehl .token.cdata { color: #6a9955; }
420
+ .lm-codehl .token.tag { color: #569cd6; }
421
+ .lm-codehl .token.tag .token.punctuation { color: #808080; }
422
+ .lm-codehl .token.attr-name { color: #9cdcfe; }
423
+ .lm-codehl .token.attr-value, .lm-codehl .token.string, .lm-codehl .token.char { color: #ce9178; }
424
+ .lm-codehl .token.punctuation, .lm-codehl .token.operator { color: #d4d4d4; }
425
+ .lm-codehl .token.keyword { color: #c586c0; }
426
+ .lm-codehl .token.function { color: #dcdcaa; }
427
+ .lm-codehl .token.number { color: #b5cea8; }
428
+ .lm-codehl .token.boolean, .lm-codehl .token.constant { color: #569cd6; }
429
+ .lm-codehl .token.property { color: #9cdcfe; }
430
+ .lm-codehl .token.selector { color: #d7ba7d; }
431
+ .lm-codehl .token.entity, .lm-codehl .token.url { color: #9cdcfe; }
432
+ .lm-codehl .token.regex { color: #d16969; }
433
+ .lm-codehl .token.class-name { color: #4ec9b0; }
434
+ .lm-handle {
435
+ background: none; border: none; color: var(--faint); cursor: grab; font-size: 13px;
436
+ padding: 4px 6px; touch-action: none; font-family: inherit;
437
+ }
438
+ .lm-handle:hover { color: var(--text); }
439
+ .lm-row.is-dragging .lm-handle { cursor: grabbing; }
440
+ .lm-preview { position: sticky; top: 70px; }
441
+ .lm-preview-bar { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
442
+ .lm-preview-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); }
443
+ .lm-savestate { font-size: 11.5px; color: var(--faint); margin-left: auto; }
444
+ .lm-savestate.saving { color: var(--muted); }
445
+ .lm-savestate.error { color: var(--red); }
446
+ .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);
449
+ }
450
+ .lm-phone iframe { width: 100%; height: 100%; border: 0; display: block; }
451
+
452
+ /* block editor */
453
+ .block { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: var(--shadow-card); margin-bottom: 12px; }
454
+ .block-head {
455
+ display: flex; align-items: center; gap: 10px;
456
+ padding: 9px 14px; border-bottom: 1px solid var(--line);
457
+ background: var(--panel-2); border-radius: var(--r-lg) var(--r-lg) 0 0;
458
+ }
459
+ .block-head .type { font-weight: 700; font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent-deep); }
460
+ .block-head .spacer { flex: 1; }
461
+ .block-body { padding: 14px; }
462
+ .add-block { display: flex; gap: 8px; align-items: center; margin-top: 4px; }
463
+ .add-block select { width: auto; }
464
+
465
+ /* modal (kit primitive — native <dialog>) */
466
+ dialog.modal {
467
+ border: none; padding: 0; margin: auto;
468
+ width: min(440px, calc(100vw - 48px));
469
+ background: var(--panel); color: var(--text);
470
+ border-radius: var(--r-lg); box-shadow: var(--shadow-pop);
471
+ }
472
+ dialog.modal::backdrop { background: rgb(20 22 28 / 40%); backdrop-filter: blur(2px); }
473
+ dialog.modal[open] { animation: modal-in 0.16s ease-out; }
474
+ @keyframes modal-in { from { opacity: 0; transform: translateY(6px) scale(0.98); } }
475
+ .modal-head {
476
+ display: flex; align-items: center; justify-content: space-between; gap: 12px;
477
+ padding: 16px 20px 0; font-size: 15px; font-weight: 700;
478
+ }
479
+ .modal-x {
480
+ background: none; border: none; color: var(--faint); cursor: pointer;
481
+ font-size: 13px; padding: 4px 6px; border-radius: var(--r-sm);
482
+ }
483
+ .modal-x:hover { color: var(--text); background: rgb(26 29 37 / 5%); }
484
+ .modal-body { padding: 14px 20px 20px; }
485
+ .modal-foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; }
486
+
487
+ /* slug input with fixed path prefix */
488
+ .slug-wrap {
489
+ display: flex; align-items: center; overflow: hidden;
490
+ background: var(--panel); border: 1px solid var(--line-strong); border-radius: var(--r-md);
491
+ }
492
+ .slug-wrap:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
493
+ .slug-prefix {
494
+ color: var(--faint); background: var(--panel-2); border-right: 1px solid var(--line);
495
+ padding: 7px 9px; font-size: 12.5px; white-space: nowrap;
496
+ font-family: ui-monospace, 'SF Mono', monospace;
497
+ }
498
+ .slug-wrap input { border: none !important; box-shadow: none !important; border-radius: 0; }
499
+
500
+ /* empty state (kit primitive) */
501
+ .empty-state { text-align: center; padding: 44px 20px 48px; }
502
+ .empty-state b { display: block; font-size: 15px; margin-bottom: 4px; }
503
+ .empty-state p { color: var(--muted); font-size: 13px; margin: 0 0 16px; }
504
+
505
+ /* login */
506
+ .login-wrap { min-height: 100vh; display: grid; place-items: center; padding: 20px; }
507
+ .login-card { width: 100%; max-width: 360px; }
508
+ .login-card .brand { justify-content: center; padding-bottom: 20px; }
509
+ .login-card .brand-name { color: var(--text); }
510
+
511
+ /* recent list on dashboard */
512
+ .recent { list-style: none; margin: 0; padding: 0; }
513
+ .recent li { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--line); }
514
+ .recent li:last-child { border-bottom: none; }
515
+ .recent .when { margin-left: auto; color: var(--faint); font-size: 12px; white-space: nowrap; }
516
+ .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
+ }
521
+
522
+ /* ---- design screen (DesignManager) ---- */
523
+ /* controls cap out; the preview column absorbs all remaining width on large displays */
524
+ .dm-layout { display: grid; grid-template-columns: minmax(420px, 680px) minmax(360px, 1fr); gap: 20px; align-items: start; }
525
+ @media (max-width: 1100px) { .dm-layout { grid-template-columns: 1fr; } }
526
+ .dm-controls { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
527
+ .dm-cardhead { display: flex; align-items: flex-start; gap: 14px; }
528
+ .dm-sub { flex: 1; margin: 0; color: var(--muted); font-size: 13px; line-height: 1.6; }
529
+ .dm-sub b { color: var(--text); font-weight: 600; }
530
+ .dm-sub code {
531
+ background: var(--panel-2); border: 1px solid var(--line); border-radius: 5px;
532
+ padding: 1px 6px; font-size: 12px; font-family: ui-monospace, 'SF Mono', monospace;
533
+ }
534
+ .dm-headactions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
535
+ .dm-themes { display: grid; grid-template-columns: repeat(auto-fill, minmax(126px, 1fr)); gap: 10px; margin: 14px 0 4px; }
536
+ .dm-theme {
537
+ display: flex; flex-direction: column; align-items: center; gap: 2px; text-align: center;
538
+ background: transparent; border: 1px solid var(--line); border-radius: var(--r-md); padding: 9px 10px 11px;
539
+ cursor: pointer; font: inherit; color: var(--text);
540
+ transition: border-color 0.12s ease, box-shadow 0.12s ease;
541
+ }
542
+ .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); }
544
+ .dm-swatch {
545
+ position: relative; width: 100%; height: 56px; border-radius: var(--r-sm); border: 1px solid;
546
+ display: flex; align-items: center; justify-content: center; font-size: 22px; font-weight: 600;
547
+ margin-bottom: 6px;
548
+ }
549
+ .dm-swatch i { position: absolute; right: 7px; bottom: 7px; width: 10px; height: 10px; border-radius: 50%; }
550
+ .dm-theme-name { font-weight: 600; font-size: 13px; }
551
+ .dm-theme-desc {
552
+ font-size: 11.5px; color: var(--faint); line-height: 1.35;
553
+ max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
554
+ }
555
+ .dm-chip {
556
+ 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;
558
+ }
559
+ .dm-row {
560
+ display: flex; align-items: center; justify-content: space-between; gap: 16px;
561
+ padding: 12px 0; border-bottom: 1px solid var(--line);
562
+ }
563
+ .dm-row:last-child { border-bottom: none; padding-bottom: 2px; }
564
+ .dm-lab { min-width: 0; }
565
+ .dm-lab span { display: flex; align-items: center; gap: 8px; font-weight: 600; font-size: 13.5px; color: var(--text); }
566
+ .dm-lab small { display: block; color: var(--muted); font-size: 12px; margin-top: 1px; }
567
+ .dm-lab small code { font-family: ui-monospace, 'SF Mono', monospace; font-size: 11.5px; }
568
+ .dm-ovr {
569
+ 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;
571
+ }
572
+ .dm-resetlink {
573
+ background: none; border: none; padding: 0; margin: 0; cursor: pointer;
574
+ font: inherit; color: var(--muted); text-decoration: underline; text-underline-offset: 2px;
575
+ }
576
+ .dm-resetlink:hover { color: var(--text); }
577
+ .dm-ctl { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
578
+ .dm-ctl input[type='color'] {
579
+ width: 32px; height: 30px; padding: 2px; border: 1px solid var(--line-strong); border-radius: var(--r-sm);
580
+ background: var(--panel); cursor: pointer;
581
+ }
582
+ .dm-hex {
583
+ width: 92px; background: var(--panel); color: var(--text); border: 1px solid var(--line-strong);
584
+ border-radius: var(--r-sm); padding: 6px 9px;
585
+ font-family: ui-monospace, 'SF Mono', monospace; font-size: 12.5px;
586
+ }
587
+ .dm-group { margin: 20px 0 0; }
588
+ .dm-grouphint { color: var(--faint); font-size: 12px; margin: 0; }
589
+ .dm-logo { height: 30px; width: auto; max-width: 120px; object-fit: contain; border-radius: 6px; background: #fff; border: 1px solid var(--line); padding: 2px 6px; }
590
+ .dm-preview {
591
+ position: sticky; top: 70px; border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden;
592
+ background: #fff; box-shadow: var(--shadow-pop);
593
+ }
594
+ .dm-preview-bar {
595
+ display: flex; align-items: center; justify-content: space-between; gap: 8px;
596
+ padding: 7px 12px; border-bottom: 1px solid var(--line); background: var(--panel);
597
+ }
598
+ .dm-preview-actions { display: flex; align-items: center; gap: 6px; margin-left: auto; }
599
+ .dm-ptabs {
600
+ display: flex; gap: 2px;
601
+ background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-md); padding: 2px;
602
+ }
603
+ .dm-ptabs button {
604
+ border: none; background: transparent; color: var(--muted); border-radius: calc(var(--r-md) - 3px);
605
+ padding: 3px 12px; font-size: 12px; font-weight: 600; cursor: pointer; font-family: inherit;
606
+ }
607
+ .dm-ptabs button:hover { color: var(--text); }
608
+ .dm-ptabs button.active { background: var(--accent); color: #fff; }
609
+ .dm-ptabs .dm-devbtn { display: grid; place-items: center; padding: 3px 8px; }
610
+ .dm-ptabs .dm-devbtn svg { width: 15px; height: 15px; display: block; }
611
+ .dm-frame { height: calc(100vh - 160px); min-height: 480px; overflow: hidden; background: #fff; }
612
+ /* auto margins center the frame when it's narrower than the panel (mobile on a
613
+ wide display); they resolve to 0 when the device width overflows and is scaled */
614
+ .dm-frame iframe { border: 0; display: block; background: #fff; transform-origin: 0 0; margin: 0 auto; }
615
+
616
+ /* ---- navigation screen (NavManager) ---- */
617
+ .nm-head { display: flex; justify-content: flex-end; margin-bottom: 8px; }
618
+ .nm-group { margin-bottom: 16px; padding-bottom: 8px; }
619
+ .nm-group-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 16px 18px 12px; }
620
+ .nm-group-head .card-title { margin: 0; }
621
+ .nm-group-head .hint { margin: 4px 0 0; }
622
+ .nm-empty { color: var(--muted); font-size: 13.5px; padding: 2px 18px 8px; margin: 0; }
623
+ .nm-row { display: flex; align-items: center; gap: 10px; }
624
+ .nm-group .nm-row { padding-left: 12px; padding-right: 16px; }
625
+ .nm-label { flex: 0 0 180px; font-weight: 500; }
626
+ .nm-url { flex: 1; color: var(--muted); font-family: ui-monospace, 'SF Mono', monospace; font-size: 13px; }
627
+ .nm-ext { color: var(--faint); font-size: 13px; }
628
+ .nm-area { max-width: 110px; }
629
+
630
+ /* design screen: page-width control (preset chips + free px input) */
631
+ .dm-width { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
632
+ .dm-width-chip {
633
+ border: 1px solid var(--line-strong); background: transparent; border-radius: var(--r-full); padding: 4px 11px;
634
+ font-size: 12px; font-weight: 500; color: var(--muted); cursor: pointer; font-family: inherit;
635
+ }
636
+ .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; }
638
+ .dm-width input[type='number'] {
639
+ width: 68px; padding: 5px 8px;
640
+ font-size: 13px; font-family: ui-monospace, 'SF Mono', monospace;
641
+ }
642
+ .dm-width-unit { font-size: 12px; color: var(--faint); }
643
+
644
+ /* media library: non-image (document) tiles */
645
+ .ml-filetile {
646
+ display: flex; align-items: center; justify-content: center;
647
+ width: 100%; height: 100%; min-height: 96px;
648
+ background: var(--bg); color: var(--muted);
649
+ font-size: 13px; font-weight: 700; letter-spacing: 0.06em;
650
+ border-radius: inherit;
651
+ }
652
+ .ml-filetile.big { min-height: 180px; font-size: 20px; }