caracms 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +57 -2
- package/bin/caracms.mjs +174 -0
- package/bin/gate.mjs +275 -0
- package/bin/init.mjs +712 -0
- package/bin/media.mjs +662 -0
- package/bin/site-runner.mjs +61 -0
- package/bin/templates/Page.astro.txt +31 -0
- package/bin/templates/TextBlock.astro.txt +13 -0
- package/bin/templates/caracms.config.ts.txt +22 -0
- package/bin/templates/catch-all.astro.txt +25 -0
- package/bin/templates/health.ts.txt +6 -0
- package/bin/templates/railway.ts.txt +147 -0
- package/package.json +66 -4
- package/skills/caracms-adopt/SKILL.md +508 -0
- package/skills/caracms-adopt/look-same.mjs +957 -0
- package/skills/caracms-blocks/SKILL.md +376 -0
- package/skills/caracms-content/SKILL.md +201 -0
- package/skills/caracms-tina/SKILL.md +427 -0
- package/skills/caracms-tina/field-kinds.md +88 -0
- package/skills/caracms-tina/tina-to-caracms.mjs +1011 -0
- package/src/block-runs.ts +84 -0
- package/src/cards.ts +158 -0
- package/src/cli/schemas.ts +122 -0
- package/src/cli/site.ts +66 -0
- package/src/cli/validate.ts +471 -0
- package/src/code-routes-disk.ts +67 -0
- package/src/code-routes.ts +134 -0
- package/src/columns.ts +39 -0
- package/src/components/Block.astro +46 -0
- package/src/components/BlockRunTree.astro +45 -0
- package/src/components/Blocks.astro +139 -0
- package/src/components/Buttons.astro +116 -0
- package/src/components/Fonts.astro +14 -0
- package/src/components/Form.astro +221 -0
- package/src/components/Head.astro +62 -0
- package/src/components/Link.astro +68 -0
- package/src/components/Lockup.astro +116 -0
- package/src/components/Media.astro +124 -0
- package/src/components/MediaPlayer.astro +102 -0
- package/src/components/RenderDocument.astro +64 -0
- package/src/components/RichText.astro +59 -0
- package/src/components/Text.astro +81 -0
- package/src/components/attributes.ts +33 -0
- package/src/components/descriptor.ts +45 -0
- package/src/components/form-client.ts +182 -0
- package/src/components/media-player.ts +46 -0
- package/src/components/media-props.ts +35 -0
- package/src/components/sitemap.xml.ts +36 -0
- package/src/config.ts +825 -0
- package/src/content-schema.ts +166 -0
- package/src/content.ts +422 -0
- package/src/document.ts +579 -0
- package/src/editor/README.md +405 -0
- package/src/editor/addresses.ts +61 -0
- package/src/editor/brand.ts +118 -0
- package/src/editor/client/block-list/BlockList.tsx +342 -0
- package/src/editor/client/block-list/Picker.tsx +105 -0
- package/src/editor/client/block-list/UnknownBlock.tsx +119 -0
- package/src/editor/client/block-list/insert-points.ts +56 -0
- package/src/editor/client/block-list/link.ts +71 -0
- package/src/editor/client/block-list/reorder.ts +105 -0
- package/src/editor/client/block-list/summary.ts +118 -0
- package/src/editor/client/collections/CollectionGrid.tsx +143 -0
- package/src/editor/client/collections/CollectionTable.tsx +406 -0
- package/src/editor/client/collections/table.ts +270 -0
- package/src/editor/client/context.tsx +27 -0
- package/src/editor/client/documents/DocMenu.tsx +154 -0
- package/src/editor/client/documents/actions.ts +192 -0
- package/src/editor/client/documents/dialogs.tsx +687 -0
- package/src/editor/client/editor.ts +995 -0
- package/src/editor/client/fields/ButtonsField.tsx +87 -0
- package/src/editor/client/fields/DateField.tsx +200 -0
- package/src/editor/client/fields/FieldControl.tsx +61 -0
- package/src/editor/client/fields/FieldFrame.tsx +109 -0
- package/src/editor/client/fields/GroupField.tsx +113 -0
- package/src/editor/client/fields/HiddenToggle.tsx +51 -0
- package/src/editor/client/fields/LinkField.tsx +307 -0
- package/src/editor/client/fields/ListField.tsx +642 -0
- package/src/editor/client/fields/LockupField.tsx +365 -0
- package/src/editor/client/fields/MediaField.tsx +823 -0
- package/src/editor/client/fields/PageFields.tsx +82 -0
- package/src/editor/client/fields/ReferenceField.tsx +209 -0
- package/src/editor/client/fields/RichTextField.tsx +306 -0
- package/src/editor/client/fields/SelectField.tsx +63 -0
- package/src/editor/client/fields/SeoGroup.tsx +282 -0
- package/src/editor/client/fields/SimpleFields.tsx +89 -0
- package/src/editor/client/fields/TextField.tsx +51 -0
- package/src/editor/client/fields/date.ts +73 -0
- package/src/editor/client/fields/host.tsx +172 -0
- package/src/editor/client/fields/list-summary.ts +85 -0
- package/src/editor/client/fields/lockup-rules.ts +181 -0
- package/src/editor/client/fields/parts.tsx +458 -0
- package/src/editor/client/fields/rich-text-commands.ts +183 -0
- package/src/editor/client/fields/rich-text-doc.ts +156 -0
- package/src/editor/client/fields/rich-text-schema.ts +224 -0
- package/src/editor/client/fields/stale.ts +58 -0
- package/src/editor/client/inbox/InboxStage.tsx +272 -0
- package/src/editor/client/inbox/store.ts +311 -0
- package/src/editor/client/live/format.ts +77 -0
- package/src/editor/client/live/marks.tsx +90 -0
- package/src/editor/client/live/notices.tsx +213 -0
- package/src/editor/client/live/publish.tsx +617 -0
- package/src/editor/client/live/session.tsx +162 -0
- package/src/editor/client/main.tsx +12 -0
- package/src/editor/client/media/LibraryStage.tsx +75 -0
- package/src/editor/client/media/ReplaceDialog.tsx +355 -0
- package/src/editor/client/media/store.ts +618 -0
- package/src/editor/client/nav/DocRow.tsx +122 -0
- package/src/editor/client/nav/search.ts +71 -0
- package/src/editor/client/nav/tree.ts +93 -0
- package/src/editor/client/overlays/OverlayMount.tsx +26 -0
- package/src/editor/client/overlays/editor-marks.ts +159 -0
- package/src/editor/client/overlays/index.ts +50 -0
- package/src/editor/client/overlays/layer.ts +437 -0
- package/src/editor/client/overlays/overlay-css.ts +177 -0
- package/src/editor/client/overlays/rich-text-bar.ts +717 -0
- package/src/editor/client/pane/Pane.tsx +91 -0
- package/src/editor/client/pane/levels/BlockLevel.tsx +123 -0
- package/src/editor/client/pane/levels/CollectionLevel.tsx +115 -0
- package/src/editor/client/pane/levels/DocumentLevel.tsx +93 -0
- package/src/editor/client/pane/levels/DocumentsLevel.tsx +390 -0
- package/src/editor/client/pane/levels/FileLevel.tsx +132 -0
- package/src/editor/client/pane/levels/FormLevel.tsx +550 -0
- package/src/editor/client/pane/levels/MediaLevel.tsx +657 -0
- package/src/editor/client/pane/levels/SettingsM6.tsx +299 -0
- package/src/editor/client/pane/levels/SubmissionsLevel.tsx +185 -0
- package/src/editor/client/pane/parts.tsx +179 -0
- package/src/editor/client/pane/switcher.tsx +165 -0
- package/src/editor/client/preview/driver.ts +640 -0
- package/src/editor/client/preview/field-text.ts +71 -0
- package/src/editor/client/preview/follow-links.ts +234 -0
- package/src/editor/client/preview/layout.ts +37 -0
- package/src/editor/client/preview/link-target.ts +50 -0
- package/src/editor/client/preview/markers.ts +86 -0
- package/src/editor/client/preview/page-edit.ts +632 -0
- package/src/editor/client/preview/page-editor-registry.ts +63 -0
- package/src/editor/client/preview/page-editor.ts +235 -0
- package/src/editor/client/preview/render-sequencer.ts +113 -0
- package/src/editor/client/preview/selection.ts +116 -0
- package/src/editor/client/preview/warnings.ts +61 -0
- package/src/editor/client/shell/App.tsx +101 -0
- package/src/editor/client/shell/Bar.tsx +197 -0
- package/src/editor/client/shell/Brand.tsx +33 -0
- package/src/editor/client/shell/Icons.tsx +87 -0
- package/src/editor/client/shell/NarrowNote.tsx +47 -0
- package/src/editor/client/shell/Popovers.tsx +47 -0
- package/src/editor/client/shell/Stage.tsx +132 -0
- package/src/editor/client/shell/Toast.tsx +61 -0
- package/src/editor/client/state/document-store.ts +465 -0
- package/src/editor/client/state/keeper.ts +713 -0
- package/src/editor/client/state/live.ts +257 -0
- package/src/editor/client/state/schema.ts +42 -0
- package/src/editor/client/state/store.ts +39 -0
- package/src/editor/fonts/OFL-GeistMono.txt +93 -0
- package/src/editor/fonts/OFL-InstrumentSans.txt +93 -0
- package/src/editor/fonts/geist-mono-latin-ext-wght-normal.woff2 +0 -0
- package/src/editor/fonts/geist-mono-latin-wght-normal.woff2 +0 -0
- package/src/editor/fonts/instrument-sans-latin-ext-wght-normal.woff2 +0 -0
- package/src/editor/fonts/instrument-sans-latin-wght-normal.woff2 +0 -0
- package/src/editor/middleware.ts +62 -0
- package/src/editor/routes/_live.ts +26 -0
- package/src/editor/routes/admin.astro +80 -0
- package/src/editor/routes/create.ts +19 -0
- package/src/editor/routes/delete.ts +19 -0
- package/src/editor/routes/document.ts +39 -0
- package/src/editor/routes/documents.ts +30 -0
- package/src/editor/routes/github.ts +23 -0
- package/src/editor/routes/history.ts +9 -0
- package/src/editor/routes/lock.ts +9 -0
- package/src/editor/routes/login/assets.d.ts +10 -0
- package/src/editor/routes/login/login.ts +43 -0
- package/src/editor/routes/media.ts +16 -0
- package/src/editor/routes/move.ts +17 -0
- package/src/editor/routes/notice.ts +9 -0
- package/src/editor/routes/preview.astro +77 -0
- package/src/editor/routes/publish.ts +9 -0
- package/src/editor/routes/status.ts +9 -0
- package/src/editor/routes/submissions.ts +16 -0
- package/src/editor/routes/try-again.ts +9 -0
- package/src/editor/routes/write.ts +18 -0
- package/src/editor/server/admin-props.ts +151 -0
- package/src/editor/server/cards.ts +61 -0
- package/src/editor/server/create.ts +414 -0
- package/src/editor/server/drafts-store.ts +127 -0
- package/src/editor/server/media/alt.ts +107 -0
- package/src/editor/server/media/bucket.ts +295 -0
- package/src/editor/server/media/config.ts +78 -0
- package/src/editor/server/media/handler.ts +221 -0
- package/src/editor/server/media/library.ts +254 -0
- package/src/editor/server/media/memory.ts +184 -0
- package/src/editor/server/media/mux.ts +241 -0
- package/src/editor/server/media/sniff.ts +599 -0
- package/src/editor/server/media/upload.ts +175 -0
- package/src/editor/server/mode.ts +63 -0
- package/src/editor/server/move.ts +295 -0
- package/src/editor/server/render.tsx +9 -0
- package/src/editor/server/replace.ts +72 -0
- package/src/editor/server/settings.ts +35 -0
- package/src/editor/server/write.ts +366 -0
- package/src/editor/styles/editor.css +502 -0
- package/src/editor/styles/fonts.css +40 -0
- package/src/editor/styles/levels/README.md +4 -0
- package/src/editor/styles/levels/collections.css +99 -0
- package/src/editor/styles/levels/document-level.css +10 -0
- package/src/editor/styles/levels/documents.css +9 -0
- package/src/editor/styles/levels/fields.css +171 -0
- package/src/editor/styles/levels/files.css +95 -0
- package/src/editor/styles/levels/live.css +10 -0
- package/src/editor/styles/levels/m5a-documents.css +51 -0
- package/src/editor/styles/levels/m6.css +82 -0
- package/src/editor/styles/levels/media.css +175 -0
- package/src/editor/styles/levels/switcher.css +3 -0
- package/src/editor/styles/tokens.css +114 -0
- package/src/editor/tsconfig.json +16 -0
- package/src/editor/types.ts +881 -0
- package/src/editor/ui-state.ts +113 -0
- package/src/email.ts +67 -0
- package/src/fields.ts +1129 -0
- package/src/files-route.ts +201 -0
- package/src/files.ts +116 -0
- package/src/forms/email.ts +149 -0
- package/src/forms/endpoint.ts +347 -0
- package/src/forms/inbox.ts +273 -0
- package/src/forms/rate-limit.ts +130 -0
- package/src/forms/route.ts +24 -0
- package/src/forms/rules.ts +278 -0
- package/src/forms/store.ts +486 -0
- package/src/head.ts +125 -0
- package/src/index.ts +434 -0
- package/src/json-source.ts +116 -0
- package/src/links.ts +121 -0
- package/src/live/README.md +43 -0
- package/src/live/auth/allow-rules.ts +70 -0
- package/src/live/auth/allow.ts +128 -0
- package/src/live/auth/auth.ts +155 -0
- package/src/live/auth/email.ts +84 -0
- package/src/live/auth/guard.ts +111 -0
- package/src/live/auth/index.ts +68 -0
- package/src/live/auth/links.ts +101 -0
- package/src/live/auth/login.ts +245 -0
- package/src/live/auth/middleware.ts +53 -0
- package/src/live/auth/request.ts +56 -0
- package/src/live/auth/routes.ts +9 -0
- package/src/live/auth/session.ts +181 -0
- package/src/live/auth/views.ts +355 -0
- package/src/live/autosaves.ts +306 -0
- package/src/live/backend.ts +652 -0
- package/src/live/branches.ts +19 -0
- package/src/live/drafts-store.ts +591 -0
- package/src/live/editor.ts +465 -0
- package/src/live/git.ts +1021 -0
- package/src/live/github.ts +271 -0
- package/src/live/locals.ts +24 -0
- package/src/live/locks.ts +273 -0
- package/src/live/merge.ts +197 -0
- package/src/live/messages.ts +151 -0
- package/src/live/mode.ts +210 -0
- package/src/live/redis.ts +533 -0
- package/src/live/runtime.ts +164 -0
- package/src/live/status.ts +109 -0
- package/src/live/sweep.ts +228 -0
- package/src/live/timings.ts +47 -0
- package/src/live/webhook.ts +39 -0
- package/src/lockup-css.ts +58 -0
- package/src/measure.ts +145 -0
- package/src/media-value.ts +239 -0
- package/src/media.ts +255 -0
- package/src/read.ts +256 -0
- package/src/redirect-middleware.ts +49 -0
- package/src/redirects.ts +76 -0
- package/src/relink.ts +293 -0
- package/src/reserved.ts +24 -0
- package/src/rich-text.ts +690 -0
- package/src/schema-key.ts +63 -0
- package/src/seo.ts +124 -0
- package/src/serialize.ts +697 -0
- package/src/skipped.ts +35 -0
- package/src/slug.ts +121 -0
- package/src/text-styles.ts +62 -0
- package/src/virtual.d.ts +28 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/* M5b: the media field, the library, the focal point and the library's stage (notes/mockups/m2-editor.html,
|
|
2
|
+
lifted from its M5b CSS). The mockup draws a picture as .ph/.ph-in; here a .ph holds one <img class="ph-img">
|
|
3
|
+
with object-fit:cover and object-position (the focal point), which is what .ph-in stands in for. */
|
|
4
|
+
/* ── Media (M5b) ──
|
|
5
|
+
A picture is .ph (the box, which covers) holding .ph-in (the original at its own ratio --r, placed by the focal point
|
|
6
|
+
--fx/--fy). It's the mockup's stand-in for one <img> with object-fit:cover and object-position: every crop keeps the
|
|
7
|
+
point in view, and with no point it keeps the centre. .ph.contain shows the whole picture (a logo). */
|
|
8
|
+
.ph{position:relative;overflow:hidden;container-type:size;background:var(--surface-sunken)}
|
|
9
|
+
.ph-in{position:absolute;--W:max(100cqw,calc(100cqh * var(--r,1.5)));--H:max(100cqh,calc(100cqw / var(--r,1.5)));width:var(--W);height:var(--H);left:calc((100cqw - var(--W)) * var(--fx,.5));top:calc((100cqh - var(--H)) * var(--fy,.5));--tp:0}
|
|
10
|
+
.ph.contain .ph-in{--W:min(100cqw,calc(100cqh * var(--r,1)));--H:min(100cqh,calc(100cqw / var(--r,1)))}
|
|
11
|
+
.ph-in.svg{display:grid;place-items:center;padding:16%;background:var(--surface-sunken)}
|
|
12
|
+
.ph-in.svg svg{display:block;width:100%;height:100%}
|
|
13
|
+
.ph.pending{display:grid;place-items:center;color:var(--icon);font:var(--weight-semibold) var(--text-2xs)/1 var(--font-mono);letter-spacing:var(--tracking-caps)}
|
|
14
|
+
.ph.pending .i{width:20px;height:20px;stroke-width:1.3}
|
|
15
|
+
/* The focal point on a thumbnail: the overlay's two-tone ring, so it reads on any picture */
|
|
16
|
+
.fp-dot{position:absolute;width:10px;height:10px;margin:-5px 0 0 -5px;border:2px solid var(--ov);border-radius:50%;box-shadow:0 0 0 1px var(--ov-halo),inset 0 0 0 1px var(--ov-halo)}
|
|
17
|
+
/* The media field: what's in the slot (a card), its actions, then what it needs (focal point, alt text, a clip's settings) */
|
|
18
|
+
.media{border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--surface);overflow:hidden}
|
|
19
|
+
.media-main{display:flex;align-items:center;gap:var(--space-2-5);padding:var(--space-1-5)}
|
|
20
|
+
.thumb{position:relative;display:block;width:var(--thumb-w);height:var(--thumb-h);flex:none;padding:0;border:0;border-radius:var(--radius-sm);overflow:hidden}
|
|
21
|
+
.thumb.wide{width:calc(var(--thumb-h) * 16 / 9)}
|
|
22
|
+
.thumb.square{width:var(--thumb-h)}
|
|
23
|
+
button.thumb{transition:box-shadow var(--dur-fast)}
|
|
24
|
+
button.thumb:hover:not(:disabled){box-shadow:0 0 0 2px var(--border-hover)}
|
|
25
|
+
button.thumb:disabled{cursor:default}
|
|
26
|
+
.thumb .dur,.pbadge{position:absolute;right:3px;bottom:3px;z-index:1;display:inline-flex;align-items:center;gap:3px;height:16px;padding:0 4px;border-radius:var(--radius-xs);background:color-mix(in srgb,var(--tooltip-bg) 74%,transparent);color:var(--on-fill);font:var(--weight-medium) var(--text-2xs)/1 var(--font-mono)}
|
|
27
|
+
.media-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;line-height:1.35}
|
|
28
|
+
.media-txt b{display:block;font-weight:var(--weight-medium);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
29
|
+
.media-txt small{display:flex;align-items:center;gap:var(--space-1);min-width:0;color:var(--text-muted);font-size:var(--text-xs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
30
|
+
.media-txt small .i{flex:none;color:var(--icon)}
|
|
31
|
+
.media-txt small.fp-on{color:var(--select-strong)}
|
|
32
|
+
.media-txt small.fp-on .i{color:var(--select)}
|
|
33
|
+
.media-acts{display:flex;align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-1-5);border-top:1px solid var(--border);background:var(--surface-sunken)}
|
|
34
|
+
.media-acts .btn.sm{padding:0 var(--space-2)}
|
|
35
|
+
.media-acts .end{margin-left:auto}
|
|
36
|
+
.media-acts .btn[aria-expanded="true"]{background:var(--surface-pressed);border-color:var(--border-hover)}
|
|
37
|
+
.media-prog{padding:0 var(--space-2) var(--space-2)}
|
|
38
|
+
.media-prog p{margin-top:var(--space-1-5);font-size:var(--text-xs);color:var(--text-muted)}
|
|
39
|
+
/* Upload progress is real progress (a percentage), never a skeleton; Mux's processing has no percentage, so it runs */
|
|
40
|
+
.mbar{position:relative;height:4px;border-radius:2px;overflow:hidden;background:var(--surface-pressed)}
|
|
41
|
+
.mbar>i{position:absolute;left:0;top:0;bottom:0;width:var(--p,0%);border-radius:2px;background:var(--select);transition:width var(--dur-base) var(--ease-out)}
|
|
42
|
+
.mbar.busy>i{width:35%;animation:prog calc(var(--dur-pulse) * 2.4) var(--ease-in-out) infinite}
|
|
43
|
+
@media (prefers-reduced-motion:reduce){.mbar.busy>i{animation:none;width:100%;opacity:.45}}
|
|
44
|
+
/* An empty slot: a drop target, and Choose… for the library */
|
|
45
|
+
.mdrop{display:flex;flex-direction:column;align-items:center;gap:var(--space-1);padding:var(--space-4) var(--space-3) var(--space-3);border:1px dashed var(--border-strong);border-radius:var(--radius-md);background:var(--surface);text-align:center;font-size:var(--text-sm);color:var(--text-muted);transition:border-color var(--dur-fast),background var(--dur-fast),box-shadow var(--dur-fast)}
|
|
46
|
+
.mdrop>.i{width:22px;height:22px;margin-bottom:var(--space-0-5);stroke-width:1.3;color:var(--icon)}
|
|
47
|
+
.mdrop b{color:var(--text);font-size:var(--text-base);font-weight:var(--weight-semibold)}
|
|
48
|
+
.mdrop .or{display:inline-flex;align-items:center;gap:var(--space-1-5);margin-top:var(--space-1)}
|
|
49
|
+
.mdrop .fine{margin-top:var(--space-1);font-size:var(--text-xs);color:var(--text-subtle)}
|
|
50
|
+
.mdrop .when-over{display:none}
|
|
51
|
+
.mdrop.is-over{border-style:solid;border-color:var(--select);background:var(--select-wash);color:var(--select-strong);box-shadow:0 0 0 3px var(--select-halo)}
|
|
52
|
+
.mdrop.is-over>.i,.mdrop.is-over b{color:var(--select-strong)}
|
|
53
|
+
.mdrop.is-over .when-idle{display:none}
|
|
54
|
+
.mdrop.is-over .when-over{display:inline}
|
|
55
|
+
.mdrop.sm{flex-direction:row;align-items:center;gap:var(--space-2);padding:var(--space-1-5) var(--space-1-5) var(--space-1-5) var(--space-2-5);text-align:left}
|
|
56
|
+
.mdrop.sm>.i{width:16px;height:16px;margin:0;stroke-width:1.5}
|
|
57
|
+
.mdrop.sm .t{flex:1;min-width:0}
|
|
58
|
+
/* Alt text: asked for right after placing (the tool's blue), warned in amber when skipped. Neither blocks anything. */
|
|
59
|
+
.media-field .alt[aria-invalid="true"]{border-color:var(--status-warning-dot);box-shadow:0 0 0 3px var(--status-warning-wash)}
|
|
60
|
+
.media-field .alt[aria-invalid="true"]:focus{border-color:var(--select);box-shadow:0 0 0 3px var(--select-halo)}
|
|
61
|
+
/* Decorative (M5b, Decision 3): beside the alt text. Ticked, the alt input empties and turns off, and nothing warns */
|
|
62
|
+
.alt-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin:var(--space-2) 0 var(--space-1)}
|
|
63
|
+
.alt-head .sub-label{margin:0}
|
|
64
|
+
.deco{display:inline-flex;align-items:center;gap:var(--space-1-5);font-size:var(--text-xs);font-weight:var(--weight-medium);color:var(--text-muted);cursor:pointer;white-space:nowrap}
|
|
65
|
+
.deco input{width:14px;height:14px;margin:0;accent-color:var(--select);cursor:inherit}
|
|
66
|
+
.deco:has(input:checked){color:var(--text)}
|
|
67
|
+
.deco:has(input:disabled){cursor:not-allowed;opacity:.6}
|
|
68
|
+
.field-ask{display:flex;align-items:flex-start;gap:var(--space-1-5);margin-top:var(--space-1-5);font-size:var(--text-sm);color:var(--select-strong);font-weight:var(--weight-medium)}
|
|
69
|
+
.field-ask .i{flex:none;margin-top:2px}
|
|
70
|
+
.field-ask .linkbtn{margin-left:var(--space-1);font-weight:var(--weight-medium);white-space:nowrap}
|
|
71
|
+
/* The focal point, set on the image's own preview: a click or a drag puts it, the arrow keys move it 5% */
|
|
72
|
+
.fp{margin-top:var(--space-2)}
|
|
73
|
+
.fp-stage{display:grid;place-items:center;padding:var(--space-2);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface-sunken)}
|
|
74
|
+
.fp-img{position:relative;width:min(100%,calc(var(--focal-max-h) * var(--r,1.5)));aspect-ratio:var(--r,1.5);border-radius:var(--radius-xs);cursor:crosshair;touch-action:none;user-select:none}
|
|
75
|
+
.fp-img:focus-visible{outline:2px solid var(--focus);outline-offset:3px}
|
|
76
|
+
.fp-img[aria-disabled="true"]{cursor:default}
|
|
77
|
+
.fp-ring{position:absolute;width:var(--focal-ring);height:var(--focal-ring);margin:calc(var(--focal-ring) / -2) 0 0 calc(var(--focal-ring) / -2);border:2px solid var(--ov);border-radius:50%;box-shadow:0 0 0 1.5px var(--ov-halo),inset 0 0 0 1.5px var(--ov-halo);pointer-events:none;transition:left var(--dur-fast) var(--ease-out),top var(--dur-fast) var(--ease-out)}
|
|
78
|
+
.fp-ring::after{content:"";position:absolute;left:50%;top:50%;width:4px;height:4px;margin:-2px;border-radius:50%;background:var(--ov);box-shadow:0 0 0 1px var(--ov-halo)}
|
|
79
|
+
.fp-ring.unset{border-style:dashed}
|
|
80
|
+
.fp-img.is-dragging .fp-ring{transition:none}
|
|
81
|
+
.fp-row{display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-1-5);font-size:var(--text-xs);color:var(--text-muted);font-variant-numeric:tabular-nums}
|
|
82
|
+
.fp-row .linkbtn{margin-left:auto}
|
|
83
|
+
.fp-help{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1);margin-top:var(--space-1);font-size:var(--text-xs);color:var(--text-subtle)}
|
|
84
|
+
/* A clip's settings, and "Use this frame" for its poster */
|
|
85
|
+
.media-field .mini-seg{margin:0 0 var(--space-1)}
|
|
86
|
+
.fr{margin-top:var(--space-2)}
|
|
87
|
+
.fr-vid{aspect-ratio:16/9;border-radius:var(--radius-md)}
|
|
88
|
+
.fr-time{position:absolute;left:var(--space-2);bottom:var(--space-2);z-index:1;height:18px;padding:0 6px;display:inline-flex;align-items:center;border-radius:var(--radius-xs);background:color-mix(in srgb,var(--tooltip-bg) 74%,transparent);color:var(--on-fill);font:var(--weight-medium) var(--text-2xs)/1 var(--font-mono)}
|
|
89
|
+
.fr-range{display:block;width:100%;margin:var(--space-2) 0 0;accent-color:var(--select)}
|
|
90
|
+
.fr-row{display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-1);font-size:var(--text-xs);color:var(--text-muted);font-variant-numeric:tabular-nums}
|
|
91
|
+
.fr-row .btn{margin-left:auto}
|
|
92
|
+
/* A gallery's images in M5a's list rows: a small 4:5 picture in each summary */
|
|
93
|
+
.item-sum .mini{width:22px;height:28px;flex:none;border-radius:var(--radius-xs)}
|
|
94
|
+
.media-acts{flex-wrap:wrap}
|
|
95
|
+
/* The brand's logo and icon (Site Settings): image-only, no alt text, the whole picture shown */
|
|
96
|
+
.media.compact .media-main{padding:var(--space-1)}
|
|
97
|
+
.media.compact .thumb{width:40px;height:40px}
|
|
98
|
+
/* The library: a grid of pictures, newest first; a level of its own (Media) or a picker from a field */
|
|
99
|
+
.lib-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin-bottom:var(--space-3)}
|
|
100
|
+
.lib-bar .mini-seg{flex:none;margin:0}
|
|
101
|
+
.lib-bar .mini-seg button{flex:none;padding:0 var(--space-2-5)}
|
|
102
|
+
.lib-bar .mini-seg .n{font-weight:var(--weight-regular);color:var(--text-subtle);font-variant-numeric:tabular-nums}
|
|
103
|
+
.lib-bar .only{font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-muted)}
|
|
104
|
+
.switch.sm{height:26px;gap:var(--space-1-5);font-size:var(--text-sm);color:var(--text-muted)}
|
|
105
|
+
.switch.sm .track{width:26px;height:16px;border-radius:8px}
|
|
106
|
+
.switch.sm .track::after{width:12px;height:12px}
|
|
107
|
+
.switch.sm[aria-checked="true"] .track::after{translate:10px 0}
|
|
108
|
+
.lgrid{display:grid;grid-template-columns:repeat(var(--lib-cols),minmax(0,1fr));gap:var(--space-3) var(--space-2)}
|
|
109
|
+
.lgrid.clips{--lib-cols:2}
|
|
110
|
+
.mtile{position:relative;display:flex;flex-direction:column;gap:3px;min-width:0;padding:0;border:0;background:none;color:var(--text);text-align:left}
|
|
111
|
+
.mtile .ph{aspect-ratio:1;border-radius:var(--radius-md)}
|
|
112
|
+
.lgrid.clips .mtile .ph{aspect-ratio:16/9}
|
|
113
|
+
.mtile .ph::after{content:"";position:absolute;inset:0;z-index:2;border-radius:inherit;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--text) 10%,transparent);transition:box-shadow var(--dur-fast)}
|
|
114
|
+
.mtile:hover:not(:disabled) .ph::after{box-shadow:inset 0 0 0 2px var(--border-hover)}
|
|
115
|
+
.mtile.is-current .ph::after{box-shadow:inset 0 0 0 2px var(--select),inset 0 0 0 4px var(--surface)}
|
|
116
|
+
.mtile:focus-visible{outline:none}
|
|
117
|
+
/* Focus shows on a hovered tile too (the hover rule above is more specific than plain :focus-visible) */
|
|
118
|
+
.mtile:is(:focus-visible,:focus-visible:hover) .ph::after{box-shadow:inset 0 0 0 2px var(--focus),inset 0 0 0 4px var(--surface)}
|
|
119
|
+
.mtile:disabled{cursor:default}
|
|
120
|
+
.mtile .nm{font-size:var(--text-xs);font-weight:var(--weight-medium);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
121
|
+
.mtile .mt{margin-top:-2px;font-size:var(--text-2xs);color:var(--text-subtle);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
122
|
+
.mtile .mt.new{color:var(--status-live);font-weight:var(--weight-semibold)}
|
|
123
|
+
.mtile .mt.danger{color:var(--status-danger);font-weight:var(--weight-semibold)}
|
|
124
|
+
.mtile .pcheck{position:absolute;right:5px;top:5px;z-index:3;display:grid;place-items:center;width:18px;height:18px;border-radius:50%;background:var(--select);color:var(--on-fill);box-shadow:0 0 0 2px var(--surface)}
|
|
125
|
+
.mtile .mbar{position:absolute;left:6px;right:6px;bottom:6px;z-index:1}
|
|
126
|
+
.mtile .pbadge{right:4px;bottom:4px}
|
|
127
|
+
.mtile .pbadge.busy{left:4px;right:auto;bottom:auto;top:4px}
|
|
128
|
+
/* A clip that failed: across the grid, with a sentence a designer can act on */
|
|
129
|
+
.mfail{grid-column:1/-1;display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-2-5);align-items:start;padding:var(--space-1-5);border:1px solid var(--status-danger-border);border-radius:var(--radius-md);background:var(--status-danger-wash);font-size:var(--text-sm);color:var(--status-danger)}
|
|
130
|
+
.mfail .ph{width:calc(var(--thumb-h) * 16 / 9);height:var(--thumb-h);border-radius:var(--radius-sm);background:var(--surface)}
|
|
131
|
+
.mfail b{display:block;color:var(--status-danger-strong);font-weight:var(--weight-semibold);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
132
|
+
.mfail p{margin-top:2px;font-size:var(--text-xs);line-height:1.45}
|
|
133
|
+
/* Files the library refused, each with its sentence (a refused create: red, as M5a's address taken) */
|
|
134
|
+
.refused{display:flex;flex-direction:column;gap:var(--space-1);margin-bottom:var(--space-3)}
|
|
135
|
+
.refused .note{margin:0;padding:var(--space-2) var(--space-2) var(--space-2) var(--space-2-5)}
|
|
136
|
+
.refused .note b{font:var(--weight-semibold) var(--text-sm)/1.35 var(--font-mono);overflow-wrap:anywhere}
|
|
137
|
+
.refused .note .ib{width:24px;height:24px;margin:-2px -2px 0 0}
|
|
138
|
+
.refused .note.has-x{grid-template-columns:16px minmax(0,1fr) auto}
|
|
139
|
+
/* An image's own level: the picture, its facts, where it's used, the alt text already used for it */
|
|
140
|
+
.mdetail{display:grid;place-items:center;padding:var(--space-2);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface-sunken)}
|
|
141
|
+
.mdetail .ph{width:min(100%,calc(var(--focal-max-h) * var(--r,1.5)));aspect-ratio:var(--r,1.5);border-radius:var(--radius-xs)}
|
|
142
|
+
.kv{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-1) var(--space-3);margin:var(--space-3) 0 var(--space-1);font-size:var(--text-sm)}
|
|
143
|
+
.kv dt{color:var(--text-muted)}
|
|
144
|
+
.kv dd{margin:0;min-width:0;overflow-wrap:anywhere}
|
|
145
|
+
.kv dd .mono{font-size:var(--text-xs);color:var(--text-muted)}
|
|
146
|
+
.uses .drow{min-height:34px}
|
|
147
|
+
.uses .drow .meta{max-width:50%;overflow:hidden;text-overflow:ellipsis}
|
|
148
|
+
.alt-used{padding:var(--space-2) var(--space-2-5);border-radius:var(--radius-md);background:var(--surface-sunken);font-size:var(--text-sm)}
|
|
149
|
+
.alt-used q{display:block;color:var(--text);quotes:"“" "”"}
|
|
150
|
+
.alt-used small{display:block;margin-top:var(--space-1);font-size:var(--text-xs);color:var(--text-subtle)}
|
|
151
|
+
/* The real picture inside a .ph (the mockup's .ph-in): an <img> of the imgproxy thumbnail, covering, at its focal point */
|
|
152
|
+
.ph>.ph-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
|
|
153
|
+
.ph.contain>.ph-img{object-fit:contain}
|
|
154
|
+
.fp-img>.ph-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:inherit;pointer-events:none}
|
|
155
|
+
.fr-vid>video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
|
|
156
|
+
/* The library has no page of its own either (M5b): the stage holds the last page, dimmed, and is the big drop target */
|
|
157
|
+
.stage-aside{container-type:size}
|
|
158
|
+
.stage-drop{display:flex;flex-direction:column;align-items:center;gap:var(--space-1-5);width:min(420px,100%);padding:var(--space-8) var(--space-6);border:1.5px dashed var(--bar-border-hover);border-radius:var(--radius-xl);transition:border-color var(--dur-fast),background var(--dur-fast)}
|
|
159
|
+
.stage-drop>.i{width:26px;height:26px;margin-bottom:var(--space-1);stroke-width:1.3;color:var(--bar-muted)}
|
|
160
|
+
.stage-drop .fine{color:var(--bar-muted);font-size:var(--text-xs)}
|
|
161
|
+
.stage-drop .acts{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-2);margin-top:var(--space-3)}
|
|
162
|
+
.stage-drop .acts .btn{margin-top:0}
|
|
163
|
+
.stage-drop .acts .btn.ghost{background:none;border-color:var(--bar-border-strong);color:var(--bar-text)}
|
|
164
|
+
.stage-drop.is-over{border-style:solid;border-color:var(--focus-on-dark);background:color-mix(in srgb,var(--focus-on-dark) 12%,transparent)}
|
|
165
|
+
.stage-lb{display:flex;flex-direction:column;align-items:center;gap:var(--space-3)}
|
|
166
|
+
.stage-lb .ph{width:min(calc(100cqw - 4 * var(--space-10)),calc((100cqh - 200px) * var(--r,1.5)));aspect-ratio:var(--r,1.5);border-radius:var(--radius-md);box-shadow:var(--shadow-frame)}
|
|
167
|
+
.stage-lb .cap{color:var(--bar-muted);font-size:var(--text-sm)}
|
|
168
|
+
.stage-lb .cap b{color:var(--bar-text);font-weight:var(--weight-semibold)}
|
|
169
|
+
/* A slot's wrapper (MediaField.tsx → MediaSlot): it carries the slot's path for picking and focusing, and no look of its own */
|
|
170
|
+
.mslot{display:block}
|
|
171
|
+
.mslot:focus{outline:none}
|
|
172
|
+
/* The library level while a file is held over it: the same wash as a slot's drop target, as a full ring (never a side rail) */
|
|
173
|
+
.side-body[data-drop-lib].is-over{background:var(--select-wash);box-shadow:inset 0 0 0 2px var(--select)}
|
|
174
|
+
/* The empty library's Upload… sits a little below its sentence (the mockup's #library-empty) */
|
|
175
|
+
[data-library-empty] > .btn{margin-top:var(--space-2)}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The editor's design tokens, lifted as is from notes/mockups/m2-editor.html's
|
|
3
|
+
* :root (M2 → What's built: "lift it as is"). Semantic custom properties, light
|
|
4
|
+
* only (M2 Decision 7); components use these, never raw colours.
|
|
5
|
+
* The brand slots (--accent, --accent-ink, --accent-edge) are overridden per site
|
|
6
|
+
* on <html> by the admin route (ink and edge computed by contrast, brand.ts).
|
|
7
|
+
*/
|
|
8
|
+
/* ══════════════════════════════════════════════════════════════════════════
|
|
9
|
+
TOKENS — semantic custom properties M3 lifts as-is (Decision 1, 7).
|
|
10
|
+
Light only; a dark set would redefine these names, never the components.
|
|
11
|
+
══════════════════════════════════════════════════════════════════════════ */
|
|
12
|
+
:root{
|
|
13
|
+
/* Colour · neutral chrome */
|
|
14
|
+
--surface:#ffffff; /* sidebar, popovers, cards, inputs */
|
|
15
|
+
--surface-sunken:#f5f5f2; /* trail, strips, sign-in page */
|
|
16
|
+
--surface-tab:#ebebe7; /* levels stacked in the drill-down trail */
|
|
17
|
+
--surface-tab-near:#f0f0ec; /* the level just above the current one */
|
|
18
|
+
--surface-hover:#efefeb;
|
|
19
|
+
--surface-pressed:#e6e6e1;
|
|
20
|
+
--border:#e3e3de;
|
|
21
|
+
--border-strong:#cbcbc4; /* inputs and buttons */
|
|
22
|
+
--border-hover:#b1b1a9;
|
|
23
|
+
--text:#1b1b19;
|
|
24
|
+
--text-muted:#5e5e58; /* 6.3:1 on surface, 5.8:1 on sunken */
|
|
25
|
+
--text-subtle:#66665f; /* 5.8:1 on surface, 5.3 on sunken, 4.8 on tab, 4.6 on pressed: meta text only */
|
|
26
|
+
--icon:#6b6b64;
|
|
27
|
+
--ink-hover:#33332f; /* the ink button's hover */
|
|
28
|
+
--on-fill:#ffffff; /* text and icons on a filled colour: danger, phone, ink tags, avatars */
|
|
29
|
+
--scrim:rgba(20,20,18,.46);
|
|
30
|
+
--backdrop:#0e0e0d; /* behind the editor when it's sized smaller than the window */
|
|
31
|
+
--frame-bg:#ffffff; /* a preview frame before its page paints */
|
|
32
|
+
/* Colour · stage (behind the preview) and the one bar */
|
|
33
|
+
--stage:#2a2a27;
|
|
34
|
+
--stage-dim:rgba(42,42,39,.86); /* over the held preview when a document has none of its own (Site Settings, M5a) */
|
|
35
|
+
--bar-bg:#1b1b19;
|
|
36
|
+
--bar-raised:#2d2d2a;
|
|
37
|
+
--bar-raised-hover:#3a3a36;
|
|
38
|
+
--bar-border:#393934;
|
|
39
|
+
--bar-border-strong:#4d4d47;
|
|
40
|
+
--bar-border-hover:#6a6a62;
|
|
41
|
+
--tooltip-bg:#111110;
|
|
42
|
+
--bar-text:#f0f0ec;
|
|
43
|
+
--bar-muted:#adada5; /* 7.4:1 on bar-bg */
|
|
44
|
+
--bar-control:#f2f2ee; /* the off-white control on the dark bar */
|
|
45
|
+
--bar-control-text:#1b1b19;
|
|
46
|
+
--bar-off:#33332f; /* a control that's visibly off */
|
|
47
|
+
--bar-off-text:#a3a39b;
|
|
48
|
+
/* Colour · tool colours: fixed, never the brand */
|
|
49
|
+
--select:#1463f3; --select-strong:#0f56d9; --select-wash:#ebf2ff; --select-halo:rgba(20,99,243,.2);
|
|
50
|
+
--phone:#0a7266; --phone-strong:#075e54; --phone-wash:#e7f4f1; --phone-field:#f7fbfa; --phone-border:#9dd2c8; --phone-halo:rgba(10,114,102,.2);
|
|
51
|
+
--focus:#1463f3; --focus-on-dark:#8fb8ff;
|
|
52
|
+
/* Colour · status: fixed, never the brand (Decision 5) */
|
|
53
|
+
--status-warning:#94500a; --status-warning-strong:#6b3a06; --status-warning-dot:#e08a00; --status-warning-wash:#fff5e3; --status-warning-border:#edcb88;
|
|
54
|
+
--status-warning-on-dark:#ffc46b; --status-warning-dark-wash:#3a2a10; --status-warning-dark-border:#6b4a14;
|
|
55
|
+
--status-danger:#b42318; --status-danger-strong:#8a1a12; --status-danger-hover:#9a1d14; --status-danger-dot:#e5372a; --status-danger-wash:#fef1ef; --status-danger-border:#f1bdb6; --status-danger-halo:rgba(180,35,24,.14);
|
|
56
|
+
--status-danger-on-dark:#ff9a90; --status-danger-dark-border:#7a2a22;
|
|
57
|
+
--status-live:#17743d; --status-live-dot:#2fa45a; --status-live-wash:#eaf6ee; --status-live-border:#b3dfc1; --status-live-on-dark:#7bdb9c;
|
|
58
|
+
--status-waiting:#5b42c9; --status-waiting-dot:#7a5ae6; --status-waiting-wash:#f2eefd; --status-waiting-border:#d4c9f7; --status-waiting-on-dark:#bdabff;
|
|
59
|
+
--status-locked:#4f5866; --status-locked-wash:#eef0f3; --status-locked-border:#d2d7de;
|
|
60
|
+
/* Colour · preview overlays, drawn inside the iframes over any site (Decision 6) */
|
|
61
|
+
--ov:#1463f3; /* outline core */
|
|
62
|
+
--ov-text:#0f56d9;
|
|
63
|
+
--ov-halo:rgba(255,255,255,.95);/* the second tone, both sides of the core */
|
|
64
|
+
--ov-on:#ffffff; /* text on a filled overlay tag */
|
|
65
|
+
--ov-surface:#ffffff; /* hover tags and insert-point pills */
|
|
66
|
+
--ov-wash:rgba(20,99,243,.07); /* hover fill */
|
|
67
|
+
--ov-phone:#0a7266; /* phone lines */
|
|
68
|
+
--ov-warn:#e08a00; --ov-warn-text:#6e3c05; --ov-warn-wash:#fff6e3;
|
|
69
|
+
--ov-ring:rgba(20,99,243,.18); /* the soft ring while typing on the page */
|
|
70
|
+
--ov-lift:rgba(0,0,0,.28); /* shadow under insert points */
|
|
71
|
+
--ov-veil-a:rgba(255,255,255,.28); --ov-veil-b:rgba(17,17,15,.16); /* the lock veil's two-tone hatch */
|
|
72
|
+
--ov-pop:rgba(20,20,18,.2); --ov-pop-line:rgba(20,20,18,.12); /* on the page: the formatting bar's and its popovers' shadow and hairline (--shadow-pop's, the hairline a touch stronger over a busy page) */
|
|
73
|
+
/* Colour · people (avatars) */
|
|
74
|
+
--p-niamh:#4f6aa8; --p-aoife:#a24f7c; --p-ciaran:#8a6a2e;
|
|
75
|
+
/* Brand slots (Site Settings › Editor branding). Set by the brand switcher; ink and edge are computed by contrast */
|
|
76
|
+
--accent:#1f2f57; --accent-ink:#ffffff; --accent-edge:#1f2f57;
|
|
77
|
+
/* Type */
|
|
78
|
+
--font-ui:"Instrument Sans",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
|
|
79
|
+
--font-mono:"Geist Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
|
|
80
|
+
--text-2xs:10.5px; --text-xs:11px; --text-sm:12px; --text-base:13px; --text-md:14px; --text-lg:16px; --text-xl:19px; --text-2xl:24px;
|
|
81
|
+
--leading-tight:1.2; --leading:1.45; --leading-loose:1.55;
|
|
82
|
+
--weight-regular:400; --weight-medium:500; --weight-semibold:600; --weight-bold:700;
|
|
83
|
+
--tracking-caps:.06em; --tracking-tight:-.01em;
|
|
84
|
+
/* Space */
|
|
85
|
+
--space-0-5:2px; --space-1:4px; --space-1-5:6px; --space-2:8px; --space-2-5:10px; --space-3:12px; --space-4:16px; --space-5:20px; --space-6:24px; --space-8:32px; --space-10:40px;
|
|
86
|
+
/* Radius */
|
|
87
|
+
--radius-xs:3px; --radius-sm:5px; --radius-md:7px; --radius-lg:10px; --radius-xl:14px; --radius-pill:999px;
|
|
88
|
+
/* Shadow */
|
|
89
|
+
--shadow-control:0 1px 1px rgba(20,20,18,.05);
|
|
90
|
+
--shadow-raised:0 1px 2px rgba(20,20,18,.16); /* a switch knob, the chosen segment */
|
|
91
|
+
--shadow-pop:0 14px 36px rgba(20,20,18,.2),0 0 0 1px rgba(20,20,18,.07);
|
|
92
|
+
--shadow-drag:0 12px 28px rgba(20,20,18,.22),0 0 0 1px rgba(20,20,18,.08);
|
|
93
|
+
--shadow-modal:0 28px 70px rgba(20,20,18,.3),0 0 0 1px rgba(20,20,18,.06);
|
|
94
|
+
--shadow-frame:0 0 0 1px rgba(255,255,255,.07),0 10px 34px rgba(0,0,0,.42);
|
|
95
|
+
/* Motion (all zero under reduced motion) */
|
|
96
|
+
--dur-fast:120ms; --dur-base:180ms; --dur-slow:320ms; --dur-pulse:900ms;
|
|
97
|
+
--ease-out:cubic-bezier(.2,.8,.2,1); --ease-in-out:cubic-bezier(.45,0,.25,1);
|
|
98
|
+
/* Layout */
|
|
99
|
+
--bar-h:44px; --sidebar-w:320px; --row-h:30px; --control-h:32px; --control-h-sm:26px; --pop-gap:8px; --frame-pad:16px;
|
|
100
|
+
/* Pages tree (M3 Decision 8): the twisty's column, and one step of indent (the twisty plus the row's gap, so a child's icon sits under its parent's name) */
|
|
101
|
+
--tree-twisty:16px; --tree-indent:24px;
|
|
102
|
+
/* Media (M5b): a slot's thumbnail, the library's grid (columns at the sidebar's width), the focal point's ring */
|
|
103
|
+
--thumb-w:64px; --thumb-h:48px; --lib-cols:3; --focal-ring:22px; --focal-max-h:220px;
|
|
104
|
+
/* The grid (M6c G5): a card's narrowest width (the stage fits as many as it can), the gaps, the card's own padding,
|
|
105
|
+
the text card's paper and the picture's box while its image is on its way (the ratio is the collection's, set inline) */
|
|
106
|
+
--card-min:208px; --card-gap-x:var(--space-3); --card-gap-y:var(--space-4); --card-pad:var(--space-1-5);
|
|
107
|
+
--card-text-bg:var(--surface-tab-near); --card-loading-bg:var(--surface-sunken);
|
|
108
|
+
/* Submissions (M6): the unread mark, a submission's sheet in the stage, its label column */
|
|
109
|
+
--unread:var(--select); --sub-sheet-w:640px; --sub-label-w:168px;
|
|
110
|
+
/* Layers */
|
|
111
|
+
--z-frame:1; --z-bar:20; --z-pop:40; --z-toast:45; --z-modal:60; --z-screen:80;
|
|
112
|
+
}
|
|
113
|
+
@media (prefers-reduced-motion:reduce){:root{--dur-fast:0ms;--dur-base:0ms;--dur-slow:0ms;--dur-pulse:0ms}}
|
|
114
|
+
:root[data-motion="reduce"]{--dur-fast:0ms;--dur-base:0ms;--dur-slow:0ms;--dur-pulse:0ms}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// The editor's React files (M3 Decision 2). Vite takes its JSX settings from the
|
|
2
|
+
// nearest tsconfig, and a site's own is Astro's (JSX preserved), so the editor
|
|
3
|
+
// carries its own. Type-checking uses the package's tsconfig, which matches.
|
|
4
|
+
{
|
|
5
|
+
"compilerOptions": {
|
|
6
|
+
"jsx": "react-jsx",
|
|
7
|
+
"jsxImportSource": "react",
|
|
8
|
+
"target": "ESNext",
|
|
9
|
+
"module": "ESNext",
|
|
10
|
+
"moduleResolution": "Bundler",
|
|
11
|
+
"allowImportingTsExtensions": true,
|
|
12
|
+
"verbatimModuleSyntax": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"noEmit": true
|
|
15
|
+
}
|
|
16
|
+
}
|