- ↑↓
+ ↑↓
navigate
- ↵
+ ↵
open
diff --git a/frontend/src/components/react/admin/Editor.tsx b/frontend/src/components/react/admin/Editor.tsx
index 70feae0..b1bc1ae 100644
--- a/frontend/src/components/react/admin/Editor.tsx
+++ b/frontend/src/components/react/admin/Editor.tsx
@@ -18,43 +18,48 @@ interface Props {
const salonTheme = EditorView.theme({
'&': {
- backgroundColor: 'var(--crust)',
+ backgroundColor: 'var(--rosewater)',
color: 'var(--text)',
- border: '1px solid var(--surface1)',
- borderRadius: '0.75rem',
+ border: '1px solid var(--surface2)',
+ borderRadius: '2px',
fontSize: '14px',
+ boxShadow: 'inset 0 0 0 1px color-mix(in srgb, var(--surface1) 40%, transparent)',
},
'.cm-content': {
fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace',
padding: '1rem',
- caretColor: 'var(--text)',
- },
- '.cm-cursor': { borderLeftColor: 'var(--text)' },
- '.cm-selectionBackground': { backgroundColor: 'var(--surface2) !important' },
- '&.cm-focused .cm-selectionBackground': { backgroundColor: 'var(--surface2) !important' },
- '.cm-activeLine': { backgroundColor: 'var(--surface0)' },
- '.cm-gutters': {
- backgroundColor: 'var(--mantle)',
- color: 'var(--overlay0)',
- border: 'none',
- },
- '.cm-activeLineGutter': { backgroundColor: 'var(--surface0)' },
- '.cm-panels': {
- backgroundColor: 'var(--mantle)',
+ caretColor: 'var(--mauve)',
color: 'var(--text)',
- borderTop: '1px solid var(--surface1)',
},
- '.cm-searchMatch': { backgroundColor: 'var(--yellow)', opacity: '0.3' },
- '.cm-searchMatch-selected': { backgroundColor: 'var(--peach)', opacity: '0.4' },
+ '.cm-cursor': { borderLeftColor: 'var(--mauve)', borderLeftWidth: '2px' },
+ '.cm-selectionBackground': { backgroundColor: 'color-mix(in srgb, var(--mauve) 25%, transparent) !important' },
+ '&.cm-focused .cm-selectionBackground': { backgroundColor: 'color-mix(in srgb, var(--mauve) 30%, transparent) !important' },
+ '.cm-activeLine': { backgroundColor: 'color-mix(in srgb, var(--surface0) 55%, transparent)' },
+ '.cm-gutters': {
+ backgroundColor: 'var(--surface0)',
+ color: 'var(--subtext0)',
+ border: 'none',
+ borderRight: '1px solid var(--surface2)',
+ fontFamily: 'var(--font-display)',
+ fontStyle: 'italic',
+ },
+ '.cm-activeLineGutter': { backgroundColor: 'color-mix(in srgb, var(--mauve) 12%, transparent)', color: 'var(--mauve)' },
+ '.cm-panels': {
+ backgroundColor: 'var(--surface0)',
+ color: 'var(--text)',
+ borderTop: '1px solid var(--surface2)',
+ },
+ '.cm-searchMatch': { backgroundColor: 'color-mix(in srgb, var(--yellow) 45%, transparent)' },
+ '.cm-searchMatch-selected': { backgroundColor: 'color-mix(in srgb, var(--peach) 55%, transparent)' },
'.cm-fat-cursor': {
backgroundColor: 'var(--mauve) !important',
- color: 'var(--crust) !important',
+ color: 'var(--rosewater) !important',
},
'&:not(.cm-focused) .cm-fat-cursor': {
outline: '1px solid var(--mauve)',
backgroundColor: 'transparent !important',
},
-}, { dark: true });
+}, { dark: false });
// Compartment for hot-swapping vim mode without recreating the editor
const vimCompartment = new Compartment();
@@ -472,11 +477,11 @@ export default function Editor({ editSlug }: Props) {
{/* Autocomplete dropdown */}
{showAutocomplete && autocompleteAssets.length > 0 && (
e.stopPropagation()}
>
-
Assets Library
+
Assets
{autocompleteAssets.map(asset => {
const img = /\.(jpg|jpeg|png|webp|gif|svg)$/i.test(asset.name);
@@ -484,16 +489,16 @@ export default function Editor({ editSlug }: Props) {
insertAssetMarkdown(asset)}
- className="px-4 py-2 hover:bg-mauve/20 cursor-pointer text-sm truncate text-subtext1 hover:text-mauve flex items-center gap-3 transition-colors"
+ className="px-4 py-2 hover:bg-[var(--mauve)]/15 cursor-pointer text-sm truncate text-[var(--subtext1)] hover:text-[var(--mauve)] flex items-center gap-3 transition-colors"
>
-
+
{img ? (
) : (
)}
-
{asset.name}
+
{asset.name}
);
})}
@@ -505,11 +510,12 @@ export default function Editor({ editSlug }: Props) {
{/* Live Preview — stretches to match editor height on desktop, full-pane via tabs on mobile */}
{showPreview && (
-
+
Preview
@@ -520,18 +526,18 @@ export default function Editor({ editSlug }: Props) {
{/* Asset Modal */}
{showModal && (
-
-
-
+
+
+
-
diff --git a/frontend/src/layouts/Layout.astro b/frontend/src/layouts/Layout.astro
index dfed768..57c573c 100644
--- a/frontend/src/layouts/Layout.astro
+++ b/frontend/src/layouts/Layout.astro
@@ -76,7 +76,7 @@ const year = new Date().getFullYear();
-
+
-
+
-
+
✦
end of catalogue
diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css
index 075f937..6117cbc 100644
--- a/frontend/src/styles/global.css
+++ b/frontend/src/styles/global.css
@@ -142,13 +142,15 @@ body {
position: relative;
}
-/* Paper grain — applied as a fixed overlay so every page gets the texture. */
+/* Paper grain — applied as a fixed overlay so every page gets the texture.
+ * All three layers sit behind content (negative z-index) so fixed-positioned
+ * modals (e.g. the search palette) can escape ancestor stacking traps. */
body::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
- z-index: -2;
+ z-index: -3;
background-color: var(--base);
}
body::after {
@@ -156,8 +158,8 @@ body::after {
position: fixed;
inset: 0;
pointer-events: none;
- z-index: 0;
- opacity: 0.35;
+ z-index: -1;
+ opacity: 0.32;
mix-blend-mode: multiply;
background-image:
url("data:image/svg+xml;utf8, ");
@@ -171,7 +173,7 @@ html.salon-noir body::after {
.salon-atmosphere {
position: fixed;
inset: 0;
- z-index: -1;
+ z-index: -2;
pointer-events: none;
overflow: hidden;
}