LFM2-VL-WebGPU / src /index.css
mlabonne's picture
upload demo files (#1)
01488bc
@font-face {
font-family: "Sohne";
font-style: normal;
font-weight: 400;
src: url("/fonts/Söhne/Söhne-Buch.otf") format("opentype");
}
@font-face {
font-family: "Sohne";
font-style: normal;
font-weight: 300;
src: url("/fonts/Söhne/Söhne-Leicht.otf") format("opentype");
}
@font-face {
font-family: "Sohne";
font-style: normal;
font-weight: 700;
src: url("/fonts/Söhne/Söhne-Kräftig.otf") format("opentype");
}
@font-face {
font-family: "JetBrains Mono";
font-style: normal;
font-weight: 100 800;
src: url("/fonts/JetBrains/JetBrainsMono-VariableFont_wght.ttf")
format("truetype");
}
:root {
--bg: #050814;
--bg-soft: rgba(8, 13, 25, 0.72);
--panel: rgba(10, 15, 28, 0.68);
--panel-strong: rgba(255, 255, 255, 0.12);
--line: rgba(255, 255, 255, 0.12);
--line-strong: rgba(255, 255, 255, 0.22);
--text: #f3f7ff;
--text-soft: rgba(243, 247, 255, 0.72);
--text-muted: rgba(243, 247, 255, 0.54);
--accent: #9de0ff;
--accent-strong: #d7f4ff;
--shadow: 0 28px 80px rgba(2, 6, 17, 0.35);
--font-body: "Sohne", sans-serif;
--font-mono: "JetBrains Mono", monospace;
}
* {
box-sizing: border-box;
}
html,
body,
#root {
min-height: 100%;
}
html {
background: var(--bg);
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: var(--font-body);
font-synthesis: none;
overflow: hidden;
text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
}
button,
input,
textarea {
color: inherit;
font: inherit;
}
button {
border: 0;
cursor: pointer;
}
img {
display: block;
max-width: 100%;
}
.hidden-file-input,
.capture-canvas {
display: none;
}
.fluid-backdrop {
position: fixed;
inset: 0;
background: #000;
}
.fluid-backdrop canvas {
display: block;
}
.fluid-backdrop__scene {
width: 100%;
height: 100%;
opacity: 0;
transition:
opacity 900ms cubic-bezier(0.16, 1, 0.3, 1),
transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
transform: scale(1.02);
}
.fluid-backdrop__scene.is-ready {
opacity: 1;
transform: scale(1);
}
.fluid-backdrop__veil {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0);
pointer-events: none;
transition: background-color 320ms ease;
}
.fluid-backdrop__veil.is-subdued {
background: rgba(3, 7, 16, 0.26);
}
.landing-scene,
.scene-shell,
.capture-scene {
position: relative;
z-index: 1;
}
.landing-scene {
width: 100%;
min-height: 100vh;
padding: 28px;
background: transparent;
text-align: left;
}
.landing-inner {
width: min(1120px, 100%);
min-height: calc(100vh - 56px);
margin: 0 auto;
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 32px;
}
.brand-mark {
display: inline-flex;
align-items: center;
gap: 14px;
width: fit-content;
padding: 11px 17px 11px 11px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(7, 11, 22, 0.54);
box-shadow: var(--shadow);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
}
.brand-logo {
width: 36px;
height: 36px;
object-fit: contain;
}
.brand-copy {
display: flex;
flex-direction: column;
gap: 3px;
}
.brand-copy span {
color: var(--text-muted);
font-family: var(--font-mono);
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.brand-copy strong {
font-size: 0.95rem;
font-weight: 700;
letter-spacing: 0.01em;
}
.hero-copy {
max-width: 760px;
}
.eyebrow,
.dock-label {
display: inline-block;
color: var(--accent);
font-family: var(--font-mono);
font-size: 0.73rem;
letter-spacing: 0.22em;
text-transform: uppercase;
}
.hero-copy h1,
.loading-card h2,
.source-card h2 {
margin: 18px 0 0;
font-size: clamp(3.4rem, 9vw, 7.8rem);
font-weight: 700;
letter-spacing: -0.06em;
line-height: 0.95;
}
.hero-copy p,
.source-card p {
max-width: 620px;
margin: 20px 0 0;
color: var(--text-soft);
font-size: clamp(1.05rem, 2.6vw, 1.42rem);
line-height: 1.5;
}
.hero-inline-icon {
display: inline-block;
width: 1.6rem;
height: 1.6rem;
margin: 0 0.25rem 1px 0.35rem;
vertical-align: text-bottom;
}
.hero-inline-wordmark {
display: inline-block;
}
.begin-prompt {
display: inline-flex;
align-items: center;
gap: 12px;
width: fit-content;
margin: 0 auto;
padding: 14px 20px;
border: 1px solid var(--line-strong);
border-radius: 999px;
background: rgba(255, 255, 255, 0.08);
color: var(--accent-strong);
font-size: 0.96rem;
letter-spacing: 0.02em;
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
}
.scene-shell {
width: 100%;
min-height: 100vh;
padding: 28px;
display: flex;
flex-direction: column;
justify-content: center;
}
.scene-shell--centered {
align-items: center;
gap: 28px;
}
.scene-header {
position: absolute;
top: 28px;
left: 28px;
}
.loading-card,
.source-card,
.prompt-dock,
.floating-alert {
border: 1px solid var(--line);
background: var(--panel);
box-shadow: var(--shadow);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
}
.loading-card {
width: min(520px, 100%);
padding: 30px;
border-radius: 32px;
}
.loading-card h2 {
margin-top: 16px;
font-size: clamp(2.3rem, 6vw, 4.3rem);
}
.loading-card p {
margin: 16px 0 0;
color: var(--text-soft);
font-family: var(--font-mono);
font-size: 0.9rem;
}
.progress-track {
width: 100%;
height: 12px;
margin-top: 24px;
overflow: hidden;
border-radius: 999px;
background: rgba(255, 255, 255, 0.08);
}
.progress-fill {
height: 100%;
border-radius: inherit;
background: linear-gradient(
90deg,
rgba(128, 222, 255, 0.8),
rgba(245, 251, 255, 0.98)
);
box-shadow: 0 0 40px rgba(156, 228, 255, 0.4);
}
.source-card {
width: min(860px, 100%);
margin: 0 auto;
padding: 32px;
border-radius: 36px;
}
.source-card h2 {
margin-top: 16px;
font-size: clamp(2.2rem, 5vw, 4.8rem);
}
.source-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
margin-top: 30px;
}
.source-option,
.ghost-button,
.primary-button,
.prompt-chip {
transition:
transform 180ms ease,
border-color 180ms ease,
background-color 180ms ease,
opacity 180ms ease;
}
.source-option {
display: flex;
padding: 26px;
border: 1px solid var(--line);
border-radius: 28px;
background: rgba(255, 255, 255, 0.05);
flex-direction: column;
justify-content: space-between;
text-align: left;
gap: 8px;
}
.source-option strong {
font-size: 1.45rem;
font-weight: 700;
letter-spacing: -0.02em;
}
.source-option__header {
display: inline-flex;
align-items: center;
gap: 14px;
}
.source-option__icon,
.button-icon {
color: var(--accent);
}
.source-option span {
color: var(--text-soft);
font-size: 1.06rem;
line-height: 1.5;
}
.source-option:hover,
.ghost-button:hover,
.primary-button:hover,
.prompt-chip:hover {
transform: translateY(-2px);
}
.capture-scene {
min-height: 100vh;
background: #03050a;
overflow: hidden;
}
.capture-video,
.capture-scrim {
position: absolute;
inset: 0;
}
.capture-video {
width: 100%;
height: 100%;
object-fit: cover;
}
.capture-scrim {
background: linear-gradient(
180deg,
rgba(3, 5, 10, 0.15),
rgba(3, 5, 10, 0.28) 36%,
rgba(3, 5, 10, 0.68)
),
radial-gradient(
circle at top left,
rgba(146, 220, 255, 0.2),
transparent 34%
),
radial-gradient(
circle at bottom right,
rgba(255, 255, 255, 0.09),
transparent 24%
);
}
.capture-toolbar {
position: relative;
z-index: 2;
display: flex;
justify-content: space-between;
gap: 16px;
padding: 24px;
}
.capture-toolbar__left {
display: flex;
align-items: center;
gap: 14px;
flex-wrap: wrap;
}
.status-pill,
.ghost-button,
.primary-button {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(8, 13, 24, 0.44);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
}
.button-icon {
flex-shrink: 0;
}
.status-pill {
color: var(--text-soft);
font-family: var(--font-mono);
font-size: 0.78rem;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.3);
}
.status-dot.is-live {
background: #9ce5ff;
box-shadow: 0 0 16px rgba(156, 229, 255, 0.7);
}
.toolbar-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
flex-wrap: wrap;
}
.ghost-button {
color: var(--text);
}
.ghost-button--small {
padding: 8px 12px;
}
.primary-button {
width: fit-content;
margin-top: 18px;
background: rgba(255, 255, 255, 0.12);
}
.floating-alert {
position: absolute;
top: 96px;
left: 24px;
z-index: 3;
display: inline-flex;
align-items: center;
gap: 14px;
max-width: min(620px, calc(100vw - 48px));
padding: 14px 16px;
border-radius: 20px;
}
.floating-alert--secondary {
top: 156px;
}
.error-banner {
margin-top: 18px;
padding: 14px 16px;
border: 1px solid rgba(255, 160, 160, 0.3);
border-radius: 18px;
background: rgba(255, 120, 120, 0.08);
color: #ffd9d9;
line-height: 1.5;
}
.prompt-dock,
.capture-side-rail {
position: absolute;
bottom: 24px;
z-index: 2;
}
.prompt-dock {
left: 24px;
width: min(520px, calc(100vw - 48px));
padding: 18px;
border-radius: 30px;
}
.prompt-chip-row {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin: 14px 0 16px;
}
.prompt-chip {
padding: 10px 14px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(255, 255, 255, 0.05);
color: var(--text-soft);
}
.prompt-chip.is-active {
border-color: rgba(157, 224, 255, 0.42);
background: rgba(157, 224, 255, 0.14);
color: var(--accent-strong);
}
.prompt-input {
width: 100%;
min-height: 78px;
padding: 14px 16px;
border: 1px solid var(--line);
border-radius: 20px;
background: rgba(255, 255, 255, 0.04);
color: var(--text);
line-height: 1.5;
resize: none;
}
.prompt-input::placeholder {
color: var(--text-muted);
}
.prompt-input:focus {
outline: 1px solid rgba(157, 224, 255, 0.44);
border-color: rgba(157, 224, 255, 0.44);
}
.capture-side-rail {
right: 24px;
width: min(400px, calc(100vw - 48px));
display: flex;
flex-direction: column;
gap: 14px;
}
.capture-actions {
position: fixed;
top: 24px;
right: 24px;
z-index: 4;
display: flex;
justify-content: flex-end;
gap: 10px;
flex-wrap: wrap;
pointer-events: auto;
}
.caption-dock {
width: 100%;
display: flex;
flex-direction: column;
align-items: stretch;
gap: 12px;
}
.caption-bubble {
width: 100%;
padding: 16px 18px;
border-radius: 30px 30px 12px 30px;
color: #07101b;
line-height: 1.48;
box-shadow: 0 20px 48px rgba(3, 7, 17, 0.24);
}
.caption-bubble--history {
background: rgba(255, 255, 255, 0.78);
}
.caption-bubble--active {
min-height: 74px;
background: rgba(255, 255, 255, 0.98);
}
.caption-meta {
margin-bottom: 8px;
color: rgba(7, 16, 27, 0.54);
font-family: var(--font-mono);
font-size: 0.72rem;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.caption-placeholder {
color: rgba(7, 16, 27, 0.5);
}
@media (max-width: 900px) {
body {
overflow: auto;
}
.landing-scene,
.scene-shell {
padding: 22px;
}
.landing-inner {
min-height: calc(100vh - 44px);
}
.source-grid {
grid-template-columns: 1fr;
}
.capture-toolbar {
flex-direction: column;
align-items: flex-start;
}
.prompt-dock,
.capture-side-rail {
position: relative;
left: auto;
right: auto;
bottom: auto;
width: auto;
margin: 0 22px 22px;
}
.capture-actions {
top: 22px;
right: 22px;
left: 22px;
justify-content: flex-start;
}
.capture-scene {
display: flex;
flex-direction: column;
justify-content: flex-end;
min-height: 100dvh;
}
.capture-scrim {
background: linear-gradient(
180deg,
rgba(3, 5, 10, 0.2),
rgba(3, 5, 10, 0.42) 42%,
rgba(3, 5, 10, 0.84)
),
radial-gradient(
circle at top left,
rgba(146, 220, 255, 0.18),
transparent 30%
);
}
}
@media (max-width: 640px) {
.hero-copy h1,
.loading-card h2,
.source-card h2 {
letter-spacing: -0.05em;
}
.floating-alert {
top: auto;
left: 22px;
right: 22px;
bottom: 22px;
flex-direction: column;
align-items: flex-start;
}
.floating-alert--secondary {
bottom: 96px;
}
}