upstream imports through a @/ alias, and this platform already binds @/* to src/apps/officer-web and @/components/* to its own shared components — so an unrewritten import resolves to the WRONG module rather than failing. the rewrite is mechanical and lives in scripts/vendor.sh so a re-vendor produces a readable diff. lib/ai.ts and AiPanel are vendored despite being unwanted: deleting them meant editing vendored code, and Canvas.tsx references them throughout. a faithful copy carrying an unused module beats a doctored one. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
198 lines
4.4 KiB
CSS
198 lines
4.4 KiB
CSS
@import "tailwindcss";
|
|
|
|
html,
|
|
body {
|
|
height: 100%;
|
|
}
|
|
/* in-app browsers (X, Instagram, LINE) may not know dvh; fall back to vh
|
|
and let JS override with the measured visual viewport when available */
|
|
.app-root {
|
|
height: 100vh;
|
|
height: 100dvh;
|
|
height: var(--app-h, 100dvh);
|
|
}
|
|
body {
|
|
background: #ffffff;
|
|
color: #1d1b20;
|
|
overscroll-behavior: none;
|
|
}
|
|
|
|
/* Material Symbols Rounded (variable font) */
|
|
.msr {
|
|
font-family: "Material Symbols Rounded";
|
|
font-weight: normal;
|
|
font-style: normal;
|
|
line-height: 1;
|
|
letter-spacing: normal;
|
|
text-transform: none;
|
|
display: inline-block;
|
|
white-space: nowrap;
|
|
word-wrap: normal;
|
|
direction: ltr;
|
|
-webkit-font-feature-settings: "liga";
|
|
-webkit-font-smoothing: antialiased;
|
|
font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24;
|
|
user-select: none;
|
|
}
|
|
.msr[data-fill="1"] {
|
|
font-variation-settings: "FILL" 1, "wght" 400, "GRAD" 0, "opsz" 24;
|
|
}
|
|
|
|
.no-scrollbar {
|
|
scrollbar-width: thin;
|
|
scrollbar-color: var(--sb, #d6cfe0) transparent;
|
|
}
|
|
.no-scrollbar::-webkit-scrollbar {
|
|
width: 6px;
|
|
}
|
|
.no-scrollbar::-webkit-scrollbar-thumb {
|
|
background: var(--sb, #d6cfe0);
|
|
border-radius: 999px;
|
|
}
|
|
.no-scrollbar::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
|
|
/* press feedback shared by toolbar and inspector buttons */
|
|
.m3-press {
|
|
transition: transform 120ms cubic-bezier(0.2, 0, 0, 1), background 120ms, color 120ms;
|
|
}
|
|
.m3-press:active:not(:disabled) {
|
|
transform: scale(0.94);
|
|
}
|
|
|
|
/* parts palette tiles: the star only shows on hover */
|
|
.m3-tile {
|
|
transition: transform 140ms cubic-bezier(0.2, 0, 0, 1), background 120ms;
|
|
}
|
|
.m3-tile:hover {
|
|
transform: translateY(-1px);
|
|
}
|
|
.m3-tile:active {
|
|
transform: scale(0.96);
|
|
}
|
|
.m3-tile .m3-star {
|
|
opacity: 0;
|
|
transition: opacity 120ms;
|
|
}
|
|
.m3-tile:hover .m3-star,
|
|
.m3-tile .m3-star[style*="opacity: 1"] {
|
|
opacity: 1;
|
|
}
|
|
|
|
/* range input, themed per palette via CSS vars */
|
|
input[type="range"].m3-range {
|
|
-webkit-appearance: none;
|
|
appearance: none;
|
|
width: 100%;
|
|
height: 28px;
|
|
background: transparent;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
input[type="range"].m3-range::-webkit-slider-runnable-track {
|
|
height: 10px;
|
|
border-radius: 5px;
|
|
background: var(--track, #e8def8);
|
|
}
|
|
input[type="range"].m3-range::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
appearance: none;
|
|
width: 6px;
|
|
height: 26px;
|
|
margin-top: -8px;
|
|
border-radius: 3px;
|
|
background: var(--thumb, #6750a4);
|
|
border: none;
|
|
}
|
|
input[type="range"].m3-range::-moz-range-track {
|
|
height: 10px;
|
|
border-radius: 5px;
|
|
background: var(--track, #e8def8);
|
|
}
|
|
input[type="range"].m3-range::-moz-range-thumb {
|
|
width: 6px;
|
|
height: 26px;
|
|
border-radius: 3px;
|
|
background: var(--thumb, #6750a4);
|
|
border: none;
|
|
}
|
|
|
|
input.m3-number::-webkit-outer-spin-button,
|
|
input.m3-number::-webkit-inner-spin-button {
|
|
-webkit-appearance: none;
|
|
margin: 0;
|
|
}
|
|
input.m3-number {
|
|
-moz-appearance: textfield;
|
|
appearance: textfield;
|
|
}
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.m3-press,
|
|
.m3-tile {
|
|
transition: none;
|
|
}
|
|
.m3-spin,
|
|
.m3e-reveal [data-screen] > * {
|
|
animation: none;
|
|
}
|
|
.m3e-reveal,
|
|
.m3e-reveal * {
|
|
transition: none !important;
|
|
}
|
|
[style*="m3e-drift"] {
|
|
animation: none;
|
|
}
|
|
}
|
|
|
|
/* a design arriving from a model or a link: colours ease over instead of snapping,
|
|
and the screens fade in. The class stays on the root only for the moment it takes. */
|
|
.m3e-reveal,
|
|
.m3e-reveal * {
|
|
transition:
|
|
background-color 700ms ease,
|
|
background 700ms ease,
|
|
color 700ms ease,
|
|
border-color 700ms ease,
|
|
box-shadow 700ms ease,
|
|
fill 700ms ease !important;
|
|
}
|
|
@keyframes m3e-fadein {
|
|
from { opacity: 0; }
|
|
to { opacity: 1; }
|
|
}
|
|
.m3e-reveal [data-screen] > * {
|
|
animation: m3e-fadein 600ms cubic-bezier(0.2, 0, 0, 1) both;
|
|
}
|
|
|
|
/* the screens while a model drafts: a gradient that drifts across them */
|
|
@keyframes m3e-drift {
|
|
0% { background-position: 0% 50%; }
|
|
50% { background-position: 100% 50%; }
|
|
100% { background-position: 0% 50%; }
|
|
}
|
|
|
|
/* the AI button while a request is in flight */
|
|
@keyframes m3-spin {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
.m3-spin {
|
|
animation: m3-spin 1.1s linear infinite;
|
|
}
|
|
|
|
/* buttons inside a run share fused corners, like a connected button group */
|
|
.m3-run > * {
|
|
border-radius: 8px !important;
|
|
}
|
|
.m3-run > :first-child {
|
|
border-top-left-radius: 22px !important;
|
|
border-bottom-left-radius: 22px !important;
|
|
}
|
|
.m3-run > :last-child {
|
|
border-top-right-radius: 22px !important;
|
|
border-bottom-right-radius: 22px !important;
|
|
}
|