@panphora/hyper-cms 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -4
- package/dist/hypercms.min.js +1040 -220
- package/package.json +5 -3
- package/src/events.js +221 -14
- package/src/form-builder.js +32 -3
- package/src/form-rules.js +7 -5
- package/src/hypercms-bundle.js +5 -2
- package/src/hypercms.js +191 -4
- package/src/refresh.js +2 -1
- package/src/shell.js +80 -16
- package/src/templates.js +165 -24
- package/src/theme/pixel-quiet.overrides.css +503 -0
- package/src/theme.generated.css +1074 -0
- package/src/vendor/mirk.vendor.js +197 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
/* =====================================================================
|
|
2
|
+
Pixel Quiet — hypercms theme overrides (hypercms-owned).
|
|
3
|
+
|
|
4
|
+
Adapted from cms-sidebar/pixel-quiet/overrides.css. Two jobs:
|
|
5
|
+
1. Retune --mirk-* tokens, scoped to .hcms-shell.pixel-quiet (never :root).
|
|
6
|
+
2. Author the panel geometry + the functional chrome the static mockup
|
|
7
|
+
doesn't have (error banner, add/remove/move controls, the engine's
|
|
8
|
+
sortable cards, push / overlay / left-dock modes) on top of the
|
|
9
|
+
.hcms-* structural hooks.
|
|
10
|
+
|
|
11
|
+
This file is concatenated AFTER the scoped mirk base+components by
|
|
12
|
+
scripts/build-theme.js, so plain rules here win over mirk's @layer
|
|
13
|
+
components with zero !important. Loaded only inside .hcms-shell, so nothing
|
|
14
|
+
here leaks onto the host page.
|
|
15
|
+
===================================================================== */
|
|
16
|
+
|
|
17
|
+
/* ============================================================
|
|
18
|
+
TOKEN RETUNE — LIGHT (warm cream, gentle near-equal bevel)
|
|
19
|
+
============================================================ */
|
|
20
|
+
.hcms-shell.pixel-quiet {
|
|
21
|
+
color-scheme: light;
|
|
22
|
+
--mirk-canvas: #F7F2EA;
|
|
23
|
+
--mirk-bg: #F7F2EA;
|
|
24
|
+
--mirk-fg: #2B241B;
|
|
25
|
+
--mirk-accent: #efefe5;
|
|
26
|
+
--mirk-destructive: #C24A3A;
|
|
27
|
+
--mirk-focus-color: #C7AE93;
|
|
28
|
+
|
|
29
|
+
--mirk-bevel-bg: #FCF8F1;
|
|
30
|
+
--mirk-bevel-fg: #2B241B;
|
|
31
|
+
--mirk-bevel-tl: #F0E7D8;
|
|
32
|
+
--mirk-bevel-br: #E2D4BF;
|
|
33
|
+
--mirk-bevel-hover-bg: #F4ECDF;
|
|
34
|
+
--mirk-pill-inner-top: #FBF6EE;
|
|
35
|
+
--mirk-input-border: #D8C8AF;
|
|
36
|
+
--mirk-placeholder-color: #A8987F;
|
|
37
|
+
|
|
38
|
+
--mirk-mark-fg: #6B5942;
|
|
39
|
+
--mirk-toggle-bg: #EFDBBD;
|
|
40
|
+
--mirk-toggle-hi: #F4EADA;
|
|
41
|
+
--mirk-toggle-lo: #C2A87E;
|
|
42
|
+
--mirk-sortable-dot: #DDCBB0;
|
|
43
|
+
--mirk-sortable-shadow: #C9B493;
|
|
44
|
+
--mirk-sortable-label: #8C7B62;
|
|
45
|
+
--mirk-sortable-placeholder: #A8987F;
|
|
46
|
+
|
|
47
|
+
--mirk-radius: 5px;
|
|
48
|
+
--mirk-focus-offset: 2px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* dark token deltas, shared by the explicit .dark opt-in and OS preference */
|
|
52
|
+
.hcms-shell.pixel-quiet.dark,
|
|
53
|
+
.hcms-shell.pixel-quiet[data-theme="dark"] {
|
|
54
|
+
color-scheme: dark;
|
|
55
|
+
--mirk-canvas: #0B0C13;
|
|
56
|
+
--mirk-bg: #11131E;
|
|
57
|
+
--mirk-fg: #ECEAF2;
|
|
58
|
+
--mirk-accent: #1D1F2F;
|
|
59
|
+
--mirk-focus-color: #4A506B;
|
|
60
|
+
|
|
61
|
+
--mirk-bevel-bg: #1A1D2C;
|
|
62
|
+
--mirk-bevel-fg: #ECEAF2;
|
|
63
|
+
--mirk-bevel-tl: #2A2E42;
|
|
64
|
+
--mirk-bevel-br: #14182A;
|
|
65
|
+
--mirk-bevel-hover-bg: #202436;
|
|
66
|
+
--mirk-pill-inner-top: #202436;
|
|
67
|
+
--mirk-input-border: #353B52;
|
|
68
|
+
--mirk-placeholder-color: #6A7090;
|
|
69
|
+
|
|
70
|
+
--mirk-mark-fg: #C9CDE0;
|
|
71
|
+
--mirk-toggle-bg: #3E4660;
|
|
72
|
+
--mirk-toggle-hi: #4E567A;
|
|
73
|
+
--mirk-toggle-lo: #262B42;
|
|
74
|
+
--mirk-sortable-dot: #353B52;
|
|
75
|
+
--mirk-sortable-shadow: #0E1120;
|
|
76
|
+
--mirk-sortable-label: #8A90AB;
|
|
77
|
+
--mirk-sortable-placeholder: #6A7090;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Auto-dark on OS preference, unless the shell pins light with .light */
|
|
81
|
+
@media (prefers-color-scheme: dark) {
|
|
82
|
+
.hcms-shell.pixel-quiet:not(.light):not([data-theme="light"]) {
|
|
83
|
+
color-scheme: dark;
|
|
84
|
+
--mirk-canvas: #0B0C13;
|
|
85
|
+
--mirk-bg: #11131E;
|
|
86
|
+
--mirk-fg: #ECEAF2;
|
|
87
|
+
--mirk-accent: #1D1F2F;
|
|
88
|
+
--mirk-focus-color: #4A506B;
|
|
89
|
+
|
|
90
|
+
--mirk-bevel-bg: #1A1D2C;
|
|
91
|
+
--mirk-bevel-fg: #ECEAF2;
|
|
92
|
+
--mirk-bevel-tl: #2A2E42;
|
|
93
|
+
--mirk-bevel-br: #14182A;
|
|
94
|
+
--mirk-bevel-hover-bg: #202436;
|
|
95
|
+
--mirk-pill-inner-top: #202436;
|
|
96
|
+
--mirk-input-border: #353B52;
|
|
97
|
+
--mirk-placeholder-color: #6A7090;
|
|
98
|
+
|
|
99
|
+
--mirk-mark-fg: #C9CDE0;
|
|
100
|
+
--mirk-toggle-bg: #3E4660;
|
|
101
|
+
--mirk-toggle-hi: #4E567A;
|
|
102
|
+
--mirk-toggle-lo: #262B42;
|
|
103
|
+
--mirk-sortable-dot: #353B52;
|
|
104
|
+
--mirk-sortable-shadow: #0E1120;
|
|
105
|
+
--mirk-sortable-label: #8A90AB;
|
|
106
|
+
--mirk-sortable-placeholder: #6A7090;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* ============================================================
|
|
111
|
+
SHELL GEOMETRY — fixed, docked panel, single column.
|
|
112
|
+
position: fixed makes the shell a containing block so the absolute
|
|
113
|
+
minibar anchors to it; flex column so the body owns the scroll.
|
|
114
|
+
============================================================ */
|
|
115
|
+
.hcms-shell.pixel-quiet {
|
|
116
|
+
box-sizing: border-box;
|
|
117
|
+
position: fixed;
|
|
118
|
+
top: 0;
|
|
119
|
+
right: 0;
|
|
120
|
+
bottom: 0;
|
|
121
|
+
width: 380px;
|
|
122
|
+
max-width: 100vw;
|
|
123
|
+
z-index: 2147483000;
|
|
124
|
+
display: flex;
|
|
125
|
+
flex-direction: column;
|
|
126
|
+
color: var(--mirk-fg);
|
|
127
|
+
background: var(--mirk-bg);
|
|
128
|
+
border-left: 1px solid var(--mirk-input-border);
|
|
129
|
+
box-shadow: -16px 0 48px -28px rgba(43, 36, 27, 0.45);
|
|
130
|
+
}
|
|
131
|
+
.hcms-shell.pixel-quiet.dark {
|
|
132
|
+
box-shadow: -16px 0 48px -28px rgba(0, 0, 0, 0.6);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.hcms-shell.pixel-quiet.hcms-side-left {
|
|
136
|
+
right: auto;
|
|
137
|
+
left: 0;
|
|
138
|
+
border-left: 0;
|
|
139
|
+
border-right: 1px solid var(--mirk-input-border);
|
|
140
|
+
box-shadow: 16px 0 48px -28px rgba(43, 36, 27, 0.45);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* Push the page over so docked content is never hidden underneath. */
|
|
144
|
+
body.hcms-open:not(.hcms-overlay) { padding-right: 380px; }
|
|
145
|
+
body.hcms-open.hcms-side-left:not(.hcms-overlay) { padding-right: 0; padding-left: 380px; }
|
|
146
|
+
body.hcms-open.hcms-overlay { overflow: hidden; }
|
|
147
|
+
|
|
148
|
+
@media (max-width: 799px) {
|
|
149
|
+
.hcms-shell.pixel-quiet { width: 100vw; }
|
|
150
|
+
body.hcms-open:not(.hcms-overlay),
|
|
151
|
+
body.hcms-open.hcms-side-left:not(.hcms-overlay) { padding-right: 0; padding-left: 0; }
|
|
152
|
+
body.hcms-open { overflow: hidden; }
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* ---------- SCROLL REGION — holds the (scrollable) header + form + save ---------- */
|
|
156
|
+
.hcms-shell-body {
|
|
157
|
+
flex: 1;
|
|
158
|
+
min-height: 0;
|
|
159
|
+
overflow-y: auto;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* ---------- CONDENSED MINIBAR — appears once the full header scrolls away ---------- */
|
|
163
|
+
.hcms-shell-minibar {
|
|
164
|
+
position: absolute;
|
|
165
|
+
top: 0;
|
|
166
|
+
left: 0;
|
|
167
|
+
right: 0;
|
|
168
|
+
z-index: 2;
|
|
169
|
+
display: flex;
|
|
170
|
+
align-items: center;
|
|
171
|
+
justify-content: space-between;
|
|
172
|
+
gap: 12px;
|
|
173
|
+
padding: 9px 24px 10px;
|
|
174
|
+
background: var(--mirk-bg);
|
|
175
|
+
border-bottom: 1px solid var(--mirk-input-border);
|
|
176
|
+
opacity: 0;
|
|
177
|
+
transform: translateY(-100%);
|
|
178
|
+
pointer-events: none;
|
|
179
|
+
transition: opacity 140ms ease, transform 160ms ease;
|
|
180
|
+
}
|
|
181
|
+
.hcms-shell.is-condensed .hcms-shell-minibar {
|
|
182
|
+
opacity: 1;
|
|
183
|
+
transform: none;
|
|
184
|
+
pointer-events: auto;
|
|
185
|
+
}
|
|
186
|
+
.hcms-shell-minibar-title {
|
|
187
|
+
font-size: 14px;
|
|
188
|
+
line-height: 1;
|
|
189
|
+
color: var(--mirk-fg);
|
|
190
|
+
white-space: nowrap;
|
|
191
|
+
overflow: hidden;
|
|
192
|
+
text-overflow: ellipsis;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* ---------- HEADER (no underline rule — whitespace separates the bands) ---------- */
|
|
196
|
+
.hcms-shell-header {
|
|
197
|
+
flex-shrink: 0;
|
|
198
|
+
display: flex;
|
|
199
|
+
align-items: flex-start;
|
|
200
|
+
justify-content: space-between;
|
|
201
|
+
gap: 12px;
|
|
202
|
+
padding: 24px 24px 4px;
|
|
203
|
+
}
|
|
204
|
+
.hcms-shell-heading { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
205
|
+
.hcms-shell-eyebrow {
|
|
206
|
+
font-size: 11px;
|
|
207
|
+
text-transform: uppercase;
|
|
208
|
+
letter-spacing: 0.18em;
|
|
209
|
+
color: var(--mirk-placeholder-color);
|
|
210
|
+
}
|
|
211
|
+
.hcms-shell-title {
|
|
212
|
+
margin: 0;
|
|
213
|
+
font-size: 18px;
|
|
214
|
+
font-weight: 400;
|
|
215
|
+
line-height: 1.2;
|
|
216
|
+
color: var(--mirk-fg);
|
|
217
|
+
}
|
|
218
|
+
.hcms-shell-close.mirk-button {
|
|
219
|
+
flex-shrink: 0;
|
|
220
|
+
padding: 2px 9px 3px;
|
|
221
|
+
line-height: 1;
|
|
222
|
+
}
|
|
223
|
+
.hcms-shell-close .mirk-button__label { font-size: 16px; }
|
|
224
|
+
|
|
225
|
+
/* ---------- FORM — generous, even vertical rhythm ---------- */
|
|
226
|
+
.hcms-form {
|
|
227
|
+
display: flex;
|
|
228
|
+
flex-direction: column;
|
|
229
|
+
gap: 26px;
|
|
230
|
+
padding: 24px 24px 28px;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* one labeled scalar field */
|
|
234
|
+
.hcms-field { display: flex; flex-direction: column; gap: 9px; }
|
|
235
|
+
.hcms-field--row {
|
|
236
|
+
flex-direction: row;
|
|
237
|
+
align-items: center;
|
|
238
|
+
justify-content: space-between;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* themed field label */
|
|
242
|
+
.hcms-label {
|
|
243
|
+
font-size: 11px;
|
|
244
|
+
text-transform: uppercase;
|
|
245
|
+
letter-spacing: 0.14em;
|
|
246
|
+
color: var(--mirk-sortable-label);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* comfortable control padding + readable size, in mirk's own mono */
|
|
250
|
+
.hcms-shell.pixel-quiet .mirk-input,
|
|
251
|
+
.hcms-shell.pixel-quiet .mirk-textarea {
|
|
252
|
+
font-size: 15px;
|
|
253
|
+
padding: 9px 14px 10px;
|
|
254
|
+
}
|
|
255
|
+
.hcms-shell.pixel-quiet textarea.mirk-input { min-height: 76px; resize: vertical; }
|
|
256
|
+
.hcms-shell.pixel-quiet .mirk-select__field {
|
|
257
|
+
font-size: 15px;
|
|
258
|
+
padding: 8px 40px 9px 14px;
|
|
259
|
+
}
|
|
260
|
+
.hcms-shell.pixel-quiet .mirk-radio__label,
|
|
261
|
+
.hcms-shell.pixel-quiet .mirk-toggle__label,
|
|
262
|
+
.hcms-shell.pixel-quiet .mirk-tags__input { font-size: 15px; }
|
|
263
|
+
|
|
264
|
+
/* inline radio row */
|
|
265
|
+
.hcms-radio-row { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
|
|
266
|
+
|
|
267
|
+
/* ---------- OBJECT GROUP — a quiet framed band, not a heavy card ---------- */
|
|
268
|
+
.hcms-object {
|
|
269
|
+
display: flex;
|
|
270
|
+
flex-direction: column;
|
|
271
|
+
gap: 16px;
|
|
272
|
+
}
|
|
273
|
+
.hcms-object-title {
|
|
274
|
+
margin: 0;
|
|
275
|
+
font-size: 11px;
|
|
276
|
+
font-weight: 400;
|
|
277
|
+
text-transform: uppercase;
|
|
278
|
+
letter-spacing: 0.14em;
|
|
279
|
+
color: var(--mirk-sortable-label);
|
|
280
|
+
}
|
|
281
|
+
.hcms-object-fields { display: flex; flex-direction: column; gap: 16px; }
|
|
282
|
+
|
|
283
|
+
/* ---------- SCALAR ARRAY — a calm list of mirk-input rows ---------- */
|
|
284
|
+
.hcms-array { display: flex; flex-direction: column; gap: 14px; }
|
|
285
|
+
.hcms-array-header { display: flex; align-items: baseline; justify-content: space-between; }
|
|
286
|
+
.hcms-array-title {
|
|
287
|
+
margin: 0;
|
|
288
|
+
font-size: 11px;
|
|
289
|
+
font-weight: 400;
|
|
290
|
+
text-transform: uppercase;
|
|
291
|
+
letter-spacing: 0.14em;
|
|
292
|
+
color: var(--mirk-sortable-label);
|
|
293
|
+
}
|
|
294
|
+
/* The generic stacked-list layout is unlayered, so it would beat mirk's
|
|
295
|
+
@layer-components rules on any slot that is also a mirk component. Exempt a
|
|
296
|
+
mirk tags box so it keeps mirk's own row-wrap layout and inner padding. */
|
|
297
|
+
.hcms-array-items:not(.mirk-tags) {
|
|
298
|
+
list-style: none;
|
|
299
|
+
margin: 0;
|
|
300
|
+
padding: 0;
|
|
301
|
+
display: flex;
|
|
302
|
+
flex-direction: column;
|
|
303
|
+
gap: 10px;
|
|
304
|
+
}
|
|
305
|
+
.hcms-array-item {
|
|
306
|
+
display: flex;
|
|
307
|
+
align-items: center;
|
|
308
|
+
gap: 8px;
|
|
309
|
+
}
|
|
310
|
+
.hcms-array-item .mirk-input { flex: 1; min-width: 0; }
|
|
311
|
+
|
|
312
|
+
/* ---------- OBJECT ARRAY — mirk-sortable cards from the engine markup ---------- */
|
|
313
|
+
.hcms-array--cards .hcms-array-items { gap: 14px; }
|
|
314
|
+
.hcms-card.mirk-sortable__item { background: var(--mirk-bevel-bg); position: relative; }
|
|
315
|
+
.hcms-card .hcms-card-fields { display: flex; flex-direction: column; flex: 1; min-width: 0; }
|
|
316
|
+
.hcms-card .hcms-field {
|
|
317
|
+
gap: 2px;
|
|
318
|
+
padding: 8px 14px 9px;
|
|
319
|
+
}
|
|
320
|
+
.hcms-card .hcms-field:not(:last-child) { border-bottom: 1px solid var(--mirk-input-border); }
|
|
321
|
+
.hcms-card .hcms-label { letter-spacing: 0.16em; }
|
|
322
|
+
/* fields inside a card read as quiet rows, not chunky boxed inputs */
|
|
323
|
+
.hcms-card .mirk-input,
|
|
324
|
+
.hcms-card .mirk-textarea {
|
|
325
|
+
border: none;
|
|
326
|
+
background: transparent;
|
|
327
|
+
padding: 0;
|
|
328
|
+
font-size: 15px;
|
|
329
|
+
}
|
|
330
|
+
.hcms-card .mirk-input:focus-visible,
|
|
331
|
+
.hcms-card .mirk-textarea:focus-visible { outline: none; }
|
|
332
|
+
/* the remove × is pulled out to the card corner (below), so the controls row
|
|
333
|
+
now only holds the sr-only move buttons — collapse it until one is focused. */
|
|
334
|
+
.hcms-card-controls {
|
|
335
|
+
display: flex;
|
|
336
|
+
align-items: center;
|
|
337
|
+
justify-content: flex-end;
|
|
338
|
+
gap: 6px;
|
|
339
|
+
padding: 0;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* quiet × remove control, shared by scalar-array rows and object-array cards */
|
|
343
|
+
.hcms-remove {
|
|
344
|
+
flex-shrink: 0;
|
|
345
|
+
appearance: none;
|
|
346
|
+
border: 0;
|
|
347
|
+
background: none;
|
|
348
|
+
color: var(--mirk-placeholder-color);
|
|
349
|
+
cursor: pointer;
|
|
350
|
+
font-size: 16px;
|
|
351
|
+
line-height: 1;
|
|
352
|
+
padding: 2px 6px;
|
|
353
|
+
}
|
|
354
|
+
.hcms-remove:hover { color: var(--mirk-destructive); }
|
|
355
|
+
.hcms-remove[hidden] { display: none; }
|
|
356
|
+
|
|
357
|
+
/* object-array card: the delete control is a square corner button pinned
|
|
358
|
+
top-right, carrying the card's own 1px border + a crisp-line × icon. */
|
|
359
|
+
.hcms-remove--card {
|
|
360
|
+
position: absolute;
|
|
361
|
+
top: -1px;
|
|
362
|
+
right: -1px;
|
|
363
|
+
width: 18px;
|
|
364
|
+
height: 18px;
|
|
365
|
+
padding: 0;
|
|
366
|
+
display: flex;
|
|
367
|
+
align-items: center;
|
|
368
|
+
justify-content: center;
|
|
369
|
+
border: 1px solid var(--mirk-input-border);
|
|
370
|
+
background: var(--mirk-bevel-bg);
|
|
371
|
+
color: var(--mirk-placeholder-color);
|
|
372
|
+
}
|
|
373
|
+
.hcms-remove--card:hover { border-color: var(--mirk-destructive); }
|
|
374
|
+
.hcms-remove--card .hcms-x { width: 64%; height: 64%; display: block; }
|
|
375
|
+
|
|
376
|
+
/* "+ Add" — quiet, pinned left */
|
|
377
|
+
.hcms-add.mirk-button { align-self: flex-start; }
|
|
378
|
+
|
|
379
|
+
/* ---------- UPLOAD COMPONENTS (@file / @image) ----------
|
|
380
|
+
Built on the kit's mirk-file / mirk-image--compact chrome. The native picker
|
|
381
|
+
is visually hidden but focusable (the mirk-button label is the visible
|
|
382
|
+
trigger and rings via :has(:focus-visible)); it is NOT .mirk-*__input, so the
|
|
383
|
+
vendored mirk runtime never handles it. The empty/filled chrome is driven by
|
|
384
|
+
the bound leaf's value attribute (src/href) in CSS — no JS state to desync. */
|
|
385
|
+
.hcms-upload input[type="file"] {
|
|
386
|
+
position: absolute;
|
|
387
|
+
width: 1px;
|
|
388
|
+
height: 1px;
|
|
389
|
+
padding: 0;
|
|
390
|
+
margin: -1px;
|
|
391
|
+
overflow: hidden;
|
|
392
|
+
clip: rect(0, 0, 0, 0);
|
|
393
|
+
white-space: nowrap;
|
|
394
|
+
border: 0;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/* @image: show the upload button until the bound <img> carries a real src. */
|
|
398
|
+
.hcms-upload--image .mirk-image__thumb { display: none; }
|
|
399
|
+
.hcms-upload--image:has(.mirk-image__preview[src]:not([src=""])) .mirk-image__upload { display: none; }
|
|
400
|
+
.hcms-upload--image:has(.mirk-image__preview[src]:not([src=""])) .mirk-image__thumb { display: inline-block; }
|
|
401
|
+
|
|
402
|
+
/* @file: reveal the clear × and the filename only once the bound <a> has href. */
|
|
403
|
+
.hcms-upload--file .hcms-upload-clear { display: none; }
|
|
404
|
+
.hcms-upload--file:has(a.mirk-file__name[href]:not([href=""])) .hcms-upload-clear { display: inline-flex; }
|
|
405
|
+
/* A filled filename uses the bright foreground (the kit's [data-filled] look),
|
|
406
|
+
driven by the bound href so there's no JS attribute to keep in sync — the
|
|
407
|
+
vendored runtime that would otherwise stamp data-filled is inert here. */
|
|
408
|
+
.hcms-upload--file:has(a.mirk-file__name[href]:not([href=""])) a.mirk-file__name {
|
|
409
|
+
color: var(--mirk-bevel-fg);
|
|
410
|
+
}
|
|
411
|
+
.hcms-upload--file a.mirk-file__name:empty {
|
|
412
|
+
text-decoration: none;
|
|
413
|
+
cursor: default;
|
|
414
|
+
}
|
|
415
|
+
.hcms-upload--file a.mirk-file__name:empty::after {
|
|
416
|
+
content: "No file chosen";
|
|
417
|
+
color: var(--mirk-placeholder-color);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/* clear-× (vendored-inert; data-hcms-action, never .mirk-*__remove). Bare × for
|
|
421
|
+
@file, a pinned corner badge for @image — mirroring .hcms-remove / --card. */
|
|
422
|
+
.hcms-upload-clear {
|
|
423
|
+
flex-shrink: 0;
|
|
424
|
+
appearance: none;
|
|
425
|
+
border: 0;
|
|
426
|
+
background: none;
|
|
427
|
+
color: var(--mirk-placeholder-color);
|
|
428
|
+
cursor: pointer;
|
|
429
|
+
line-height: 0;
|
|
430
|
+
padding: 2px 4px;
|
|
431
|
+
display: inline-flex;
|
|
432
|
+
align-items: center;
|
|
433
|
+
justify-content: center;
|
|
434
|
+
}
|
|
435
|
+
.hcms-upload-clear:hover { color: var(--mirk-destructive); }
|
|
436
|
+
.hcms-upload-clear .hcms-x { display: block; width: 14px; height: 14px; }
|
|
437
|
+
|
|
438
|
+
.hcms-upload-clear--badge {
|
|
439
|
+
position: absolute;
|
|
440
|
+
top: -7px;
|
|
441
|
+
right: -7px;
|
|
442
|
+
width: 18px;
|
|
443
|
+
height: 18px;
|
|
444
|
+
padding: 0;
|
|
445
|
+
border-radius: 50%;
|
|
446
|
+
border: 1px solid var(--mirk-input-border);
|
|
447
|
+
background: var(--mirk-bevel-bg);
|
|
448
|
+
color: var(--mirk-bevel-fg);
|
|
449
|
+
}
|
|
450
|
+
.hcms-upload-clear--badge:hover { color: var(--mirk-destructive); border-color: var(--mirk-destructive); }
|
|
451
|
+
.hcms-upload-clear--badge .hcms-x { width: 10px; height: 10px; }
|
|
452
|
+
|
|
453
|
+
/* ---------- ERROR BANNER + inline errors ---------- */
|
|
454
|
+
.hcms-shell-error,
|
|
455
|
+
.hcms-error {
|
|
456
|
+
font-size: 12px;
|
|
457
|
+
line-height: 1.45;
|
|
458
|
+
color: var(--mirk-destructive);
|
|
459
|
+
background: var(--mirk-bevel-bg);
|
|
460
|
+
border: 1px solid var(--mirk-destructive);
|
|
461
|
+
padding: 8px 12px;
|
|
462
|
+
}
|
|
463
|
+
.hcms-shell-error { margin: 0 24px; }
|
|
464
|
+
.hcms-error { margin-top: 6px; }
|
|
465
|
+
.hcms-shell-error[hidden],
|
|
466
|
+
.hcms-error[hidden] { display: none; }
|
|
467
|
+
|
|
468
|
+
/* ---------- SAVE (sits at the end of the scrolling form, not pinned) ---------- */
|
|
469
|
+
.hcms-shell-footer {
|
|
470
|
+
display: flex;
|
|
471
|
+
justify-content: flex-end;
|
|
472
|
+
padding: 4px 24px 28px;
|
|
473
|
+
}
|
|
474
|
+
.hcms-shell-footer[hidden] { display: none; }
|
|
475
|
+
|
|
476
|
+
/* ---------- sr-only move buttons: hidden, visible on keyboard focus ---------- */
|
|
477
|
+
.hcms-sr-only {
|
|
478
|
+
position: absolute;
|
|
479
|
+
width: 1px;
|
|
480
|
+
height: 1px;
|
|
481
|
+
padding: 0;
|
|
482
|
+
margin: -1px;
|
|
483
|
+
overflow: hidden;
|
|
484
|
+
clip: rect(0, 0, 0, 0);
|
|
485
|
+
white-space: nowrap;
|
|
486
|
+
border: 0;
|
|
487
|
+
}
|
|
488
|
+
.hcms-sr-only:focus {
|
|
489
|
+
position: static;
|
|
490
|
+
width: auto;
|
|
491
|
+
height: auto;
|
|
492
|
+
padding: 2px 6px;
|
|
493
|
+
margin: 0 2px;
|
|
494
|
+
overflow: visible;
|
|
495
|
+
clip: auto;
|
|
496
|
+
white-space: normal;
|
|
497
|
+
background: var(--mirk-bevel-bg);
|
|
498
|
+
border: 1px solid var(--mirk-input-border);
|
|
499
|
+
color: var(--mirk-fg);
|
|
500
|
+
font-size: 12px;
|
|
501
|
+
cursor: pointer;
|
|
502
|
+
}
|
|
503
|
+
.hcms-sr-only[hidden] { display: none; }
|