Vendored Augani/openreel-video (MIT) into services/editor and wired it to the MAM. Editor runs as its own container on port 47435. Library assets pull in via ?asset=<uuid>; render exports route back via POST /api/v1/upload/simple. Sidebar Editor link on every page; Edit button on every preview modal. See services/editor/INTEGRATION.md for the patch map.
188 lines
4.8 KiB
CSS
188 lines
4.8 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
@layer base {
|
|
:root {
|
|
--background: 0 0% 100%;
|
|
--foreground: 0 0% 3.9%;
|
|
--card: 0 0% 100%;
|
|
--card-foreground: 0 0% 3.9%;
|
|
--popover: 0 0% 100%;
|
|
--popover-foreground: 0 0% 3.9%;
|
|
--primary: 142.1 76.2% 36.3%;
|
|
--primary-foreground: 355.7 100% 97.3%;
|
|
--secondary: 240 4.8% 95.9%;
|
|
--secondary-foreground: 240 5.9% 10%;
|
|
--muted: 240 4.8% 95.9%;
|
|
--muted-foreground: 240 3.8% 46.1%;
|
|
--accent: 240 4.8% 95.9%;
|
|
--accent-foreground: 240 5.9% 10%;
|
|
--destructive: 0 84.2% 60.2%;
|
|
--destructive-foreground: 0 0% 98%;
|
|
--border: 240 5.9% 90%;
|
|
--input: 240 5.9% 90%;
|
|
--ring: 142.1 76.2% 36.3%;
|
|
--radius: 0.5rem;
|
|
|
|
--color-background-secondary: 250 250 250;
|
|
--color-background-tertiary: 245 245 245;
|
|
--color-background-elevated: 255 255 255;
|
|
--color-text-primary: 10 10 10;
|
|
--color-text-secondary: 115 115 115;
|
|
--color-text-muted: 163 163 163;
|
|
--color-border-hover: 212 212 212;
|
|
--color-border-active: 163 163 163;
|
|
}
|
|
|
|
.dark {
|
|
--background: 0 0% 7%;
|
|
--foreground: 0 0% 95%;
|
|
--card: 0 0% 9%;
|
|
--card-foreground: 0 0% 95%;
|
|
--popover: 0 0% 9%;
|
|
--popover-foreground: 0 0% 95%;
|
|
--primary: 142.1 70.6% 45.3%;
|
|
--primary-foreground: 144.9 80.4% 10%;
|
|
--secondary: 240 3.7% 15.9%;
|
|
--secondary-foreground: 0 0% 98%;
|
|
--muted: 0 0% 15%;
|
|
--muted-foreground: 240 5% 64.9%;
|
|
--accent: 0 0% 15%;
|
|
--accent-foreground: 0 0% 98%;
|
|
--destructive: 0 62.8% 50.6%;
|
|
--destructive-foreground: 0 0% 98%;
|
|
--border: 240 3.7% 20%;
|
|
--input: 240 3.7% 20%;
|
|
--ring: 142.1 70.6% 45.3%;
|
|
|
|
--color-background-secondary: 23 23 23;
|
|
--color-background-tertiary: 38 38 38;
|
|
--color-background-elevated: 32 32 32;
|
|
--color-text-primary: 250 250 250;
|
|
--color-text-secondary: 163 163 163;
|
|
--color-text-muted: 115 115 115;
|
|
--color-border-hover: 64 64 64;
|
|
--color-border-active: 82 82 82;
|
|
}
|
|
}
|
|
|
|
@layer base {
|
|
* {
|
|
@apply border-border;
|
|
}
|
|
|
|
body {
|
|
@apply bg-background text-foreground;
|
|
font-feature-settings: "rlig" 1, "calt" 1;
|
|
}
|
|
}
|
|
|
|
html, body, #root {
|
|
height: 100%;
|
|
width: 100%;
|
|
margin: 0;
|
|
padding: 0;
|
|
overflow: hidden;
|
|
}
|
|
|
|
body {
|
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
height: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: hsl(var(--muted-foreground) / 0.3);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: hsl(var(--muted-foreground) / 0.5);
|
|
}
|
|
|
|
::selection {
|
|
background: hsl(var(--primary) / 0.3);
|
|
}
|
|
|
|
input[type="number"]::-webkit-inner-spin-button,
|
|
input[type="number"]::-webkit-outer-spin-button {
|
|
-webkit-appearance: none;
|
|
margin: 0;
|
|
}
|
|
|
|
input[type="number"] {
|
|
-moz-appearance: textfield;
|
|
}
|
|
|
|
.canvas-container {
|
|
background-image:
|
|
linear-gradient(45deg, hsl(var(--muted)) 25%, transparent 25%),
|
|
linear-gradient(-45deg, hsl(var(--muted)) 25%, transparent 25%),
|
|
linear-gradient(45deg, transparent 75%, hsl(var(--muted)) 75%),
|
|
linear-gradient(-45deg, transparent 75%, hsl(var(--muted)) 75%);
|
|
background-size: 20px 20px;
|
|
background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
|
|
}
|
|
|
|
.layer-drag-ghost {
|
|
opacity: 0.8;
|
|
background: hsl(var(--primary) / 0.2);
|
|
border: 2px dashed hsl(var(--primary));
|
|
border-radius: var(--radius);
|
|
}
|
|
|
|
.resize-handle {
|
|
width: 10px;
|
|
height: 10px;
|
|
background: white;
|
|
border: 2px solid hsl(var(--primary));
|
|
border-radius: 2px;
|
|
position: absolute;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.resize-handle-nw { top: -5px; left: -5px; cursor: nwse-resize; }
|
|
.resize-handle-n { top: -5px; left: 50%; transform: translateX(-50%); cursor: ns-resize; }
|
|
.resize-handle-ne { top: -5px; right: -5px; cursor: nesw-resize; }
|
|
.resize-handle-e { top: 50%; right: -5px; transform: translateY(-50%); cursor: ew-resize; }
|
|
.resize-handle-se { bottom: -5px; right: -5px; cursor: nwse-resize; }
|
|
.resize-handle-s { bottom: -5px; left: 50%; transform: translateX(-50%); cursor: ns-resize; }
|
|
.resize-handle-sw { bottom: -5px; left: -5px; cursor: nesw-resize; }
|
|
.resize-handle-w { top: 50%; left: -5px; transform: translateY(-50%); cursor: ew-resize; }
|
|
|
|
.rotation-handle {
|
|
width: 12px;
|
|
height: 12px;
|
|
background: white;
|
|
border: 2px solid hsl(var(--primary));
|
|
border-radius: 50%;
|
|
position: absolute;
|
|
top: -30px;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
cursor: grab;
|
|
}
|
|
|
|
.rotation-handle:active {
|
|
cursor: grabbing;
|
|
}
|
|
|
|
@keyframes pulse-selection {
|
|
0%, 100% { box-shadow: 0 0 0 2px hsl(var(--primary)); }
|
|
50% { box-shadow: 0 0 0 4px hsl(var(--primary) / 0.5); }
|
|
}
|
|
|
|
.selection-box {
|
|
border: 2px solid hsl(var(--primary));
|
|
animation: pulse-selection 2s ease-in-out infinite;
|
|
}
|