Files
paseo/packages/website/src/styles.css

883 lines
18 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import "tailwindcss";
* {
scrollbar-color: var(--color-scrollbar-handle) transparent;
scrollbar-width: thin;
}
*::-webkit-scrollbar {
width: 8px;
height: 8px;
}
*::-webkit-scrollbar-track {
background: transparent;
}
*::-webkit-scrollbar-thumb {
border: 2px solid transparent;
border-radius: 9999px;
background: var(--color-scrollbar-handle) content-box;
}
*::-webkit-scrollbar-button {
display: none;
width: 0;
height: 0;
}
@keyframes voice-bar {
0% {
transform: scaleY(1);
}
100% {
transform: scaleY(0.3);
}
}
@keyframes social-proof-scroll {
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
}
.social-proof-marquee {
margin-inline: calc(50% - 50cqw);
overflow-x: clip;
position: relative;
}
.landing-content {
container-type: inline-size;
}
.social-proof-marquee::before,
.social-proof-marquee::after {
content: "";
position: absolute;
top: 0;
bottom: 0;
width: max(4rem, 8vw);
z-index: 1;
pointer-events: none;
}
.social-proof-marquee::before {
left: 0;
background: linear-gradient(to right, var(--color-background), transparent);
}
.social-proof-marquee::after {
right: 0;
background: linear-gradient(to left, var(--color-background), transparent);
}
.social-proof-row {
display: flex;
width: 100%;
}
.social-proof-track {
display: flex;
width: max-content;
animation: social-proof-scroll 46s linear infinite;
will-change: transform;
}
.social-proof-track-reverse {
animation-direction: reverse;
animation-duration: 52s;
}
.social-proof-marquee:hover .social-proof-track {
animation-play-state: paused;
}
.social-proof-card-text {
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
@media (prefers-reduced-motion: reduce) {
.social-proof-track {
animation: none;
}
}
/* Title font - centralized for easy changes */
.font-title {
font-family: inherit;
}
/* Inline code styling - scoped to prose content */
.prose :not(pre) > code {
background-color: var(--color-muted);
color: var(--color-foreground);
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.875em;
}
/* Changelog */
.changelog-release {
padding-bottom: 3rem;
}
.changelog-release + .changelog-release {
border-top: 1px solid var(--color-border);
padding-top: 3rem;
}
.changelog-release-date {
display: block;
margin-bottom: 0.625rem;
color: var(--color-muted-foreground);
font-size: 0.8125rem;
}
.changelog-release-heading {
position: relative;
scroll-margin-top: 1.5rem;
margin-bottom: 1.75rem;
}
.changelog-release-title {
color: var(--color-foreground);
font-size: 1.25rem;
font-weight: 500;
letter-spacing: -0.01em;
line-height: 1.4;
}
.changelog-release-title span {
color: var(--color-muted-foreground);
font-weight: 400;
}
.changelog-heading-anchor {
position: absolute;
top: 0;
right: 100%;
bottom: 0;
display: inline-flex;
align-items: center;
padding-right: 0.375rem;
color: color-mix(in srgb, var(--color-foreground) 40%, transparent);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-weight: 400;
text-decoration: none;
opacity: 0;
transition: opacity 150ms ease;
}
.changelog-release-heading:hover .changelog-heading-anchor,
.changelog-patch-heading:hover .changelog-heading-anchor,
.changelog-heading-anchor:focus {
opacity: 1;
}
.changelog-heading-anchor:hover {
color: var(--color-foreground);
}
.changelog-patches {
display: grid;
gap: 2.5rem;
}
.changelog-patch + .changelog-patch {
border-top: 1px solid var(--color-border);
padding-top: 2.5rem;
}
.changelog-patch-heading {
position: relative;
display: flex;
align-items: baseline;
gap: 0.625rem;
scroll-margin-top: 1.5rem;
margin-bottom: 1.25rem;
}
.changelog-patch-title {
color: var(--color-foreground);
font-size: 1rem;
font-weight: 500;
line-height: 1.4;
}
.changelog-patch-heading .changelog-release-date {
margin-bottom: 0;
}
.changelog-release-notes {
color: color-mix(in srgb, var(--color-foreground) 76%, transparent);
font-size: 0.9375rem;
line-height: 1.7;
}
.changelog-release-notes h3,
.changelog-release-notes h4 {
margin-top: 1.75rem;
margin-bottom: 0.625rem;
color: var(--color-muted-foreground);
font-size: 0.875rem;
font-weight: 500;
line-height: 1.4;
}
.changelog-release-notes h3:first-child,
.changelog-release-notes h4:first-child {
margin-top: 0;
}
.changelog-release-notes p {
margin-block: 0.75rem;
}
.changelog-release-notes ul {
display: grid;
gap: 0.625rem;
margin-top: 0.75rem;
padding-left: 1.25rem;
list-style: disc;
}
.changelog-release-notes li::marker {
color: color-mix(in srgb, var(--color-primary) 65%, var(--color-muted-foreground));
}
.changelog-release-notes strong {
color: var(--color-foreground);
font-weight: 500;
}
.changelog-release-notes a {
color: var(--color-foreground);
text-decoration-color: color-mix(in srgb, var(--color-primary) 65%, transparent);
text-decoration-line: underline;
text-underline-offset: 3px;
}
.changelog-release-notes a:hover {
color: color-mix(in srgb, var(--color-foreground) 78%, var(--color-primary));
}
.changelog-release-notes code {
border-radius: 0.25rem;
background: var(--color-muted);
padding: 0.125rem 0.375rem;
color: var(--color-foreground);
font-size: 0.875em;
}
/* Docs page prose styles — mirrors the original docs/*.tsx components */
.docs-prose {
color: rgba(255, 255, 255, 0.6);
line-height: 1.625;
}
.docs-prose > :first-child {
margin-top: 0;
}
.docs-prose h1,
.docs-prose h2,
.docs-prose h3,
.docs-prose h4,
.docs-prose h5,
.docs-prose h6 {
position: relative;
scroll-margin-top: 1.5rem;
}
.docs-example {
border: 1px solid var(--color-border);
border-radius: 0.5rem;
padding: 0.875rem 1rem;
margin-top: 0.75rem;
margin-bottom: 0.75rem;
scroll-margin-top: 1.5rem;
}
.docs-example[open] {
background-color: rgba(255, 255, 255, 0.02);
}
.docs-example-summary {
display: flex;
align-items: baseline;
gap: 0.5rem;
margin: 0;
cursor: pointer;
list-style: none;
color: var(--color-foreground);
font-weight: 500;
}
.docs-example-summary::-webkit-details-marker {
display: none;
}
.docs-example-summary::before {
content: "+";
color: rgba(255, 255, 255, 0.4);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
flex-shrink: 0;
}
.docs-example[open] > .docs-example-summary::before {
content: "−";
}
.docs-example[open] > .docs-example-summary {
margin-bottom: 0.75rem;
}
.docs-example > :last-child {
margin-bottom: 0;
}
.docs-prose h1 {
color: var(--color-foreground);
font-size: 1.875rem;
line-height: 1.25;
font-weight: 500;
margin-top: 0;
margin-bottom: 2rem;
}
.docs-prose h2 {
color: var(--color-foreground);
font-size: 1.375rem;
line-height: 1.4;
font-weight: 500;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--color-border);
margin-top: 2rem;
margin-bottom: 1rem;
}
.docs-prose h3 {
color: var(--color-foreground);
font-size: 1.125rem;
line-height: 1.4;
font-weight: 500;
margin-top: 1.5rem;
margin-bottom: 0.75rem;
}
.docs-prose .heading-anchor {
position: absolute;
right: 100%;
top: 0;
bottom: 0;
display: inline-flex;
align-items: center;
padding-right: 0.375rem;
text-decoration: none;
color: rgba(255, 255, 255, 0.4);
opacity: 0;
transition: opacity 0.15s ease;
}
.docs-prose .heading-anchor:hover {
color: var(--color-foreground);
}
.docs-prose h1:hover .heading-anchor,
.docs-prose h2:hover .heading-anchor,
.docs-prose h3:hover .heading-anchor,
.docs-prose h4:hover .heading-anchor,
.docs-prose h5:hover .heading-anchor,
.docs-prose h6:hover .heading-anchor,
.docs-prose .heading-anchor:focus {
opacity: 1;
}
.docs-prose .heading-anchor-icon {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-weight: 400;
}
.docs-prose p {
margin-top: 1rem;
margin-bottom: 1rem;
}
.docs-prose a {
color: var(--color-foreground);
font-weight: 500;
text-decoration: underline;
text-decoration-thickness: 1px;
text-decoration-color: var(--color-primary);
text-underline-offset: 3px;
}
.docs-prose a:hover {
color: rgba(255, 255, 255, 0.8);
}
.docs-prose ul,
.docs-prose ol {
margin-top: 1rem;
margin-bottom: 1rem;
padding-left: 1.5rem;
}
.docs-prose ul {
list-style: disc;
}
.docs-prose ol {
list-style: decimal;
}
.docs-prose li {
margin-top: 0.25rem;
margin-bottom: 0.25rem;
}
.docs-prose strong {
color: rgba(255, 255, 255, 0.8);
font-weight: 600;
}
.changelog-release-notes blockquote,
.docs-prose blockquote {
background-color: color-mix(in srgb, var(--color-primary) 10%, transparent);
border: 1px solid color-mix(in srgb, var(--color-primary) 30%, transparent);
border-radius: 0.5rem;
padding: 1rem;
margin-top: 1rem;
margin-bottom: 1rem;
color: rgba(255, 255, 255, 0.8);
}
.changelog-release-notes blockquote > :first-child,
.docs-prose blockquote > :first-child {
margin-top: 0;
}
.changelog-release-notes blockquote > :last-child,
.docs-prose blockquote > :last-child {
margin-bottom: 0;
}
.docs-prose table {
width: 100%;
border-collapse: collapse;
margin-top: 1rem;
margin-bottom: 1rem;
font-size: 0.875rem;
display: block;
overflow-x: auto;
}
.docs-prose th,
.docs-prose td {
border: 1px solid var(--color-border);
padding: 0.625rem 0.75rem;
text-align: left;
vertical-align: top;
}
.docs-prose th {
background-color: var(--color-muted);
color: var(--color-foreground);
font-weight: 600;
}
.docs-prose tbody tr:nth-child(even) {
background-color: rgba(255, 255, 255, 0.02);
}
.docs-prose pre {
background-color: var(--color-card) !important;
border: 1px solid var(--color-border);
border-radius: 0.5rem;
padding: 1rem;
overflow-x: auto;
margin-top: 1rem;
margin-bottom: 1rem;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 0.875rem;
color: var(--color-foreground);
}
.docs-prose pre [data-line] {
display: inline-block;
min-width: 100%;
}
.docs-prose pre code {
background: transparent;
padding: 0;
border-radius: 0;
font-size: inherit;
}
.docs-prose :not(pre) > code {
background-color: var(--color-muted);
color: var(--color-foreground);
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.875em;
}
.docs-prose hr {
border-color: var(--color-border);
margin-top: 2rem;
margin-bottom: 2rem;
}
.docs-source-footer {
border-top: 1px solid var(--color-border);
margin-top: 3rem;
padding-top: 1.25rem;
font-size: 0.875rem;
}
.docs-source-footer a {
color: rgba(255, 255, 255, 0.5);
font-weight: 500;
text-decoration: none;
}
.docs-source-footer a:hover {
color: var(--color-foreground);
}
/* Blog post prose styles — adapted from moboudra.com */
.blog-prose {
color: rgba(250, 250, 250, 0.82);
line-height: 1.8;
font-size: 1.125rem;
}
.blog-prose h1,
.blog-prose h2,
.blog-prose h3 {
color: var(--color-foreground);
font-weight: 600;
text-decoration: underline;
text-decoration-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
text-decoration-thickness: 2px;
text-underline-offset: 4px;
}
.blog-prose h1,
.blog-prose h2 {
font-size: 1.5rem;
line-height: 1.3;
margin-top: 2.5rem;
margin-bottom: 0.75rem;
}
.blog-prose h3 {
font-size: 1.25rem;
line-height: 1.4;
margin-top: 2rem;
margin-bottom: 0.5rem;
}
.blog-prose p {
margin-top: 1rem;
margin-bottom: 1rem;
}
.blog-prose a {
color: var(--color-foreground);
text-decoration: underline;
text-underline-offset: 2px;
}
.blog-prose a:hover {
color: var(--color-primary);
}
.blog-prose ul,
.blog-prose ol {
margin-top: 1rem;
margin-bottom: 1rem;
padding-left: 1.5rem;
}
.blog-prose ul {
list-style: disc;
}
.blog-prose ol {
list-style: decimal;
}
.blog-prose li {
margin-top: 0.25rem;
margin-bottom: 0.25rem;
}
.blog-prose blockquote {
border-left: 3px solid var(--color-border);
padding-left: 1rem;
color: rgba(250, 250, 250, 0.6);
margin-top: 1rem;
margin-bottom: 1rem;
}
.blog-prose pre {
background-color: var(--color-card);
border: 1px solid var(--color-border);
border-radius: 0.5rem;
padding: 1rem;
overflow-x: auto;
margin-top: 1rem;
margin-bottom: 1rem;
}
.blog-prose :not(pre) > code {
background-color: var(--color-muted);
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.875em;
}
.blog-prose img {
max-width: 100%;
border-radius: 0.5rem;
margin-top: 1rem;
margin-bottom: 1rem;
}
.blog-prose hr {
border-color: var(--color-border);
margin-top: 2rem;
margin-bottom: 2rem;
}
@theme {
--color-background: #101615;
--color-foreground: #fafafa;
--color-muted: #1a1f1e;
--color-muted-foreground: #a8adac;
--color-extra-muted-foreground: #717574;
--color-card: #171d1c;
--color-border: #252b2a;
--color-scrollbar-handle: #717574;
--color-primary: #239956;
--color-primary-foreground: #ffffff;
--color-secondary: #252b2a;
--color-secondary-foreground: #fafafa;
/* Mockup palette. Every value below is copied from the app's default dark
theme — `paseoDarkColors` in packages/app/src/styles/theme.ts. Do not
eyeball these from a screenshot; re-read theme.ts and copy. */
/* Surfaces */
--color-mock-surface0: #181b1a;
--color-mock-surface1: #1e2120;
--color-mock-surface2: #272a29;
--color-mock-surface3: #434645;
--color-mock-surface4: #595b5b;
--color-mock-surface-diff-empty: #252827;
--color-mock-sidebar: #141716;
/* Foregrounds */
--color-mock-fg: #fafafa;
--color-mock-fg-muted: #a1a5a4;
--color-mock-fg-xmuted: #717574;
/* Borders and accent */
--color-mock-border: #252b2a;
--color-mock-border-accent: #2f3534;
--color-mock-accent: #20744a;
--color-mock-accent-bright: #7ccba0;
--color-mock-destructive: #c64f43;
/* Status band (dark: L=0.70). One token per signal — diff stats, PR state,
CI checks, badges. theme.ts:154-160. */
--color-mock-success: #6cb17b;
--color-mock-danger: #d8847b;
--color-mock-warning: #c09664;
--color-mock-merged: #a890d5;
/* Project identity tiles — the letter-avatar fills the mobile sidebar hashes
a project name into. Verbatim from the app's identity palette,
packages/app/src/styles/identity-colors.ts (white letter drawn on top). */
--color-mock-tile-red: #b06260;
--color-mock-tile-violet: #7a6aa8;
--color-mock-tile-amber: #8f7838;
--color-mock-tile-teal: #368080;
--color-mock-host-teal: #6cacab;
/* Status *dot* band (dark: L=0.72, chroma 90%). Sidebar row state dots only.
theme.ts:198-204. */
--color-mock-dot-success: #35c264;
--color-mock-dot-danger: #f7796d;
--color-mock-dot-warning: #db932e;
--color-mock-dot-running: #5caaf6;
/* Diff rows. The row fills are the status colors at the alphas the real diff
renderer uses — git/diff-document/palette.ts:14-15. The *-fg pair is the
diffAddition/diffDeletion tier from theme.ts:121-124. */
--color-mock-diff-add: rgba(108, 177, 123, 0.08);
--color-mock-diff-remove: rgba(216, 132, 123, 0.07);
--color-mock-diff-add-fg: #4ade80;
--color-mock-diff-remove-fg: #ef4444;
/* The one darkHighlightColors role the --color-syn-* block below is missing.
@getpaseo/highlight src/colors.ts, `class`. */
--color-mock-syn-class: #ffa657;
/* Terminal ANSI — darkTerminalAnsi, theme.ts:358-373 */
--color-mock-term-red: #e07070;
--color-mock-term-green: #5dba80;
--color-mock-term-yellow: #d4a44a;
--color-mock-term-blue: #6a9de0;
--color-mock-term-magenta: #b07ad0;
--color-mock-term-cyan: #4aabb8;
/* Syntax highlighting */
--color-syn-keyword: #ff7b72;
--color-syn-comment: #8b949e;
--color-syn-string: #a5d6ff;
--color-syn-number: #79c0ff;
--color-syn-function: #d2a8ff;
--color-syn-tag: #7ee787;
--color-syn-property: #79c0ff;
--color-syn-variable: #c9d1d9;
--color-syn-punctuation: #c9d1d9;
--color-syn-operator: #79c0ff;
--animate-flutter-left: flutter-left 0.6s ease-in-out infinite;
--animate-flutter-right: flutter-right 0.6s ease-in-out infinite;
--animate-float: float 8s ease-in-out infinite;
--animate-flutter-body: flutter-body 0.5s ease-in-out infinite;
--animate-synced-snake-dot: synced-snake-dot 950ms linear infinite;
}
/* Synced loader — 6-dot snake animation matching the real app.
Each dot runs this keyframe with a staggered delay so that at any moment
up to 4 dots are visible at decreasing opacity (head=1, trail=0.72/0.46/0.22).
steps(1,end) keeps each opacity level solid for its full 1/6-cycle slot. */
@keyframes synced-snake-dot {
0% {
opacity: 1;
animation-timing-function: steps(1, end);
}
16.667% {
opacity: 0.72;
animation-timing-function: steps(1, end);
}
33.333% {
opacity: 0.46;
animation-timing-function: steps(1, end);
}
50% {
opacity: 0.22;
animation-timing-function: steps(1, end);
}
66.667% {
opacity: 0;
animation-timing-function: steps(1, end);
}
83.333% {
opacity: 0;
animation-timing-function: steps(1, end);
}
}
@keyframes flutter-left {
0%,
100% {
transform: rotateY(0deg) rotateZ(0deg);
}
50% {
transform: rotateY(50deg) rotateZ(-5deg);
}
}
@keyframes flutter-right {
0%,
100% {
transform: rotateY(0deg) rotateZ(0deg);
}
50% {
transform: rotateY(-50deg) rotateZ(5deg);
}
}
@keyframes flutter-body {
0%,
100% {
transform: translateY(0) rotate(0deg);
}
50% {
transform: translateY(-2px) rotate(-3deg);
}
}
@keyframes float-1 {
0% {
transform: translate(0, 0) rotate(0deg);
}
20% {
transform: translate(12px, -18px) rotate(5deg);
}
40% {
transform: translate(-8px, -30px) rotate(-3deg);
}
60% {
transform: translate(-15px, -12px) rotate(2deg);
}
80% {
transform: translate(5px, 8px) rotate(-4deg);
}
100% {
transform: translate(0, 0) rotate(0deg);
}
}
@keyframes float-2 {
0% {
transform: translate(0, 0) rotate(0deg);
}
15% {
transform: translate(-10px, -12px) rotate(-4deg);
}
35% {
transform: translate(8px, -25px) rotate(3deg);
}
55% {
transform: translate(15px, -8px) rotate(-2deg);
}
75% {
transform: translate(-5px, 10px) rotate(5deg);
}
100% {
transform: translate(0, 0) rotate(0deg);
}
}
@keyframes float-3 {
0% {
transform: translate(0, 0) rotate(0deg);
}
25% {
transform: translate(18px, -10px) rotate(3deg);
}
50% {
transform: translate(5px, -35px) rotate(-5deg);
}
75% {
transform: translate(-12px, -15px) rotate(4deg);
}
100% {
transform: translate(0, 0) rotate(0deg);
}
}