Stop naming classes before you have a product
++ Most early UI work is structure and hierarchy. Semantic HTML + gets you there faster than a utility soup. +
++ Continue reading +
+diff --git a/apps/docs/src/app.css b/apps/docs/src/app.css index 092ee4a..aaf5b5c 100644 --- a/apps/docs/src/app.css +++ b/apps/docs/src/app.css @@ -1,56 +1,74 @@ @import "launch.css"; -/* Syntax highlighting - works in light and dark mode */ +:root { + --site-font: "Outfit", var(--font-family); + --site-mono: "IBM Plex Mono", ui-monospace, monospace; + --site-ink: light-dark(#18181b, #fafafa); + --site-muted: light-dark(#52525b, #a1a1aa); + --site-line: light-dark(#e4e4e7, #27272a); + --site-panel: light-dark(#ffffff, #09090b); + --site-wash: light-dark(#f4f4f5, #0c0c0e); +} + +body { + display: flex; + flex-direction: column; + min-height: 100vh; + font-family: var(--site-font); +} + +/* Syntax highlighting */ .hljs { background: transparent; - color: light-dark(#24292e, #e1e4e8); + color: light-dark(#27272a, #e4e4e7); + font-family: var(--site-mono); } .hljs-comment, .hljs-quote { - color: light-dark(#6a737d, #6a737d); + color: light-dark(#71717a, #71717a); font-style: italic; } .hljs-keyword, .hljs-selector-tag, .hljs-tag { - color: light-dark(#d73a49, #f97583); + color: light-dark(#b45309, #fbbf24); } .hljs-string, .hljs-attr, .hljs-addition { - color: light-dark(#032f62, #9ecbff); + color: light-dark(#0f766e, #5eead4); } .hljs-number, .hljs-literal { - color: light-dark(#005cc5, #79b8ff); + color: light-dark(#1d4ed8, #93c5fd); } .hljs-name, .hljs-attribute { - color: light-dark(#22863a, #85e89d); + color: light-dark(#047857, #6ee7b7); } .hljs-function, .hljs-title { - color: light-dark(#6f42c1, #b392f0); + color: light-dark(#b45309, #fcd34d); } .hljs-built_in, .hljs-type { - color: light-dark(#005cc5, #79b8ff); + color: light-dark(#1d4ed8, #93c5fd); } .hljs-deletion { - color: light-dark(#b31d28, #fdaeb7); + color: light-dark(#b91c1c, #fca5a5); } .hljs-selector-class, .hljs-selector-id { - color: light-dark(#6f42c1, #b392f0); + color: light-dark(#a16207, #fde68a); } .hljs-emphasis { @@ -61,23 +79,31 @@ font-weight: bold; } -/* Documentation-specific styles */ - -/* Override body styling for docs layout */ -body { - display: flex; - flex-direction: column; - min-height: 100vh; -} - /* Header */ .docs-header { position: sticky; top: 0; z-index: 100; - border-bottom: 1px solid var(--border); - background: var(--background); - padding: 0.75rem 1.5rem; + border-bottom: 1px solid transparent; + background: color-mix(in srgb, var(--site-panel) 82%, transparent); + padding: 0.85rem 1.5rem; + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); + transition: + background 0.2s ease, + border-color 0.2s ease; +} + +.docs-header:not(.docs-header-home) { + border-bottom-color: var(--site-line); +} + +.docs-header-home { + position: absolute; + inset-inline: 0; + background: transparent; + backdrop-filter: none; + -webkit-backdrop-filter: none; } .docs-header nav { @@ -85,27 +111,50 @@ body { justify-content: space-between; align-items: center; margin: 0 auto; - max-width: 80rem; + max-width: 72rem; +} + +.docs-brand { + color: var(--site-ink); + font-weight: 700; + font-size: 1.05rem; + letter-spacing: -0.03em; + text-decoration: none; } .docs-header a { - color: inherit; + color: var(--site-muted); + font-weight: 500; + font-size: 0.9rem; text-decoration: none; + transition: color 0.15s ease; +} + +.docs-header a:hover, +.docs-header a[aria-current="page"] { + color: var(--site-ink); } .docs-header ul { display: flex; - gap: 1.5rem; + align-items: center; + gap: 1.25rem; margin: 0; padding: 0; list-style: none; } -/* Code preview component */ +.site-main-home { + flex: 1; +} + +/* Code preview */ .code-preview { - margin-block: 1rem; - border: 1px solid var(--border); - border-radius: 0.5rem; + margin-block: 1.25rem; + border: 1px solid var(--site-line); + border-radius: 0.75rem; + background: var(--site-panel); + overflow: hidden; } .code-preview-render { @@ -113,91 +162,107 @@ body { } .code-preview-code { - border-top: 1px solid var(--border); - background: var(--background-secondary); + border-top: 1px solid var(--site-line); + background: var(--site-wash); } .code-preview-code pre { margin: 0; - padding: 1rem; + padding: 1rem 1.25rem; overflow-x: auto; - font-size: 0.875rem; - line-height: 1.5; + font-size: 0.8125rem; + line-height: 1.6; + font-family: var(--site-mono); } .code-preview-code code { background: transparent; padding: 0; + font-family: inherit; } -/* Sidebar navigation */ +/* Sidebar */ .docs-sidebar { position: sticky; top: 3.5rem; - border-right: 1px solid var(--border); - padding: 1rem; + border-right: 1px solid var(--site-line); + padding: 1.25rem 0.75rem; height: calc(100vh - 3.5rem); overflow-y: auto; + background: var(--site-wash); } .docs-sidebar nav { display: flex; flex-direction: column; - gap: 0.25rem; + gap: 0.15rem; } .docs-sidebar a { - border-radius: 0.375rem; - padding: 0.5rem 0.75rem; - color: inherit; + border-radius: 0.5rem; + padding: 0.45rem 0.75rem; + color: var(--site-muted); + font-weight: 500; font-size: 0.875rem; text-decoration: none; + transition: + background 0.15s ease, + color 0.15s ease; } .docs-sidebar a:hover { - background: var(--background-secondary); + background: color-mix(in srgb, var(--site-panel) 70%, transparent); + color: var(--site-ink); } .docs-sidebar a[aria-current="page"] { - background: var(--background-secondary); - font-weight: 500; + background: var(--site-panel); + box-shadow: 0 0 0 1px var(--site-line); + color: var(--site-ink); + font-weight: 600; } .docs-sidebar h3 { - margin: 1rem 0 0.5rem 0.75rem; - color: var(--color-muted); + margin: 1.25rem 0 0.4rem 0.75rem; + color: var(--site-muted); font-weight: 600; - font-size: 0.75rem; - letter-spacing: 0.05em; + font-size: 0.7rem; + letter-spacing: 0.08em; text-transform: uppercase; } .docs-sidebar h3:first-child { - margin-top: 0; + margin-top: 0.25rem; } -/* Main content area */ +/* Content */ .docs-content { - padding: 2rem 3rem; + padding: 2.5rem 3rem 4rem; min-width: 0; - max-width: 48rem; + max-width: 46rem; } .docs-content h1 { - margin-bottom: 0.5rem; + margin-block: 0 0.5rem; + letter-spacing: -0.03em; } .docs-content > p:first-of-type { - margin-bottom: 2rem; - color: var(--color-muted); + margin-block: 0 2rem; + color: var(--site-muted); font-size: 1.125rem; + line-height: 1.65; +} + +.docs-content h2 { + margin-block-start: 2.75rem; } -/* Dashboard layout grid */ .docs-layout { display: grid; - grid-template-columns: 16rem 1fr; + grid-template-columns: 15.5rem 1fr; flex: 1; + background: var(--site-panel); } @media (max-width: 768px) { @@ -212,4 +277,14 @@ body { .docs-content { padding: 1.5rem; } + + .docs-header ul { + gap: 0.9rem; + } +} + +/* Full-height shells for immersive examples */ +[data-layout="website"], +[data-layout="dashboard"] { + min-height: 100vh; } diff --git a/apps/docs/src/app.html b/apps/docs/src/app.html index 36b964a..b2ac99c 100644 --- a/apps/docs/src/app.html +++ b/apps/docs/src/app.html @@ -8,6 +8,11 @@ name="description" content="launch.css - A classless CSS framework for semantic HTML" /> + + %sveltekit.head%
diff --git a/apps/docs/src/routes/+layout.svelte b/apps/docs/src/routes/+layout.svelte index 97baf6d..27a9a8f 100644 --- a/apps/docs/src/routes/+layout.svelte +++ b/apps/docs/src/routes/+layout.svelte @@ -58,13 +58,22 @@ title: "Accordion", href: "/docs/components/accordion", }, + { title: "Alert", href: "/docs/components/alert" }, + { title: "Avatar", href: "/docs/components/avatar" }, + { title: "Card", href: "/docs/components/card" }, { title: "Dialog", href: "/docs/components/dialog" }, - { title: "Tabs", href: "/docs/components/tabs" }, - { title: "Tables", href: "/docs/components/tables" }, + { title: "Kbd", href: "/docs/components/kbd" }, + { title: "Meter", href: "/docs/components/meter" }, { title: "Progress", href: "/docs/components/progress", }, + { title: "Tables", href: "/docs/components/tables" }, + { title: "Tabs", href: "/docs/components/tabs" }, + { + title: "Timeline", + href: "/docs/components/timeline", + }, { title: "Tooltip", href: "/docs/components/tooltip" }, ], }, @@ -81,25 +90,56 @@ let { children } = $props(); let isDocsPage = $derived(page.url.pathname.startsWith("/docs")); + let isHome = $derived(page.url.pathname === "/"); + let isExamplesIndex = $derived(page.url.pathname === "/examples"); + let isExampleDemo = $derived( + page.url.pathname.startsWith("/examples/") && + page.url.pathname !== "/examples", + );A classless CSS framework for semantic HTML
- +Classless CSS framework
++ Write semantic HTML. Get a finished interface. No class names, + no design system ceremony — just ship. +
++ Get Started + See examples +
+No classes required
+Product designer · Studio
++ + + +
++ Drop it in and keep writing HTML — + full install guide. +
+npx nypm add launch.css
+ + Notices and feedback messages using ARIA roles — no classes required. +
+ +
+ Use role="status" for non-critical updates that should be
+ announced politely to assistive technology.
+
+ Use role="alert" for important, time-sensitive messages.
+
+ Include error, danger, or warning in
+ the aria-label to get the danger surface.
+
Version 1.2.0 is ready. Refresh to get the latest styles.
+`} +/> diff --git a/apps/docs/src/routes/docs/components/avatar/+page.svelte b/apps/docs/src/routes/docs/components/avatar/+page.svelte new file mode 100644 index 0000000..197f765 --- /dev/null +++ b/apps/docs/src/routes/docs/components/avatar/+page.svelte @@ -0,0 +1,64 @@ + + +
+ Circular profile images triggered by alt text containing
+ “avatar” or “profile” — no classes needed.
+
img whose alt contains
+ avatar or profile (case-insensitive) is
+ styled as a circle
+ object-fit: cover
+ Every section is styled as a bordered, padded card — write
+ semantic HTML and get layout for free.
+
Install launch.css and write semantic HTML. No class names required.
+ +`} +/> + +Style elements directly with sensible defaults.
+Themes via color-scheme — no JavaScript needed.
+Website and dashboard layouts with a data attribute.
+Get product updates in your inbox.
+ +`} +/> diff --git a/apps/docs/src/routes/docs/components/kbd/+page.svelte b/apps/docs/src/routes/docs/components/kbd/+page.svelte new file mode 100644 index 0000000..60daaf5 --- /dev/null +++ b/apps/docs/src/routes/docs/components/kbd/+page.svelte @@ -0,0 +1,38 @@ + + +
+ Keyboard key affordances with the native kbd element.
+
+ Open search with ⌘ + K +
`} +/> + +
+ Scalar measurements with the native meter element — optimum
+ ranges get distinct colors automatically.
+
+ Set low, high, and optimum to drive
+ green / yellow / red fills based on the current value.
+
+ Vertical timelines using a list with
+ aria-label containing “timeline”.
+
Project started with the first design draft.
+Public beta with theme support and layouts.
+Alerts, switches, avatars, and refreshed docs.
+role="list" with an
+ aria-label that includes timeline
+ aria-current="step"
+ time children are muted and spaced above the
+ content
+ You can also download the CSS file directly from GitHub releases and include it in your project.
diff --git a/apps/docs/src/routes/examples/+page.svelte b/apps/docs/src/routes/examples/+page.svelte new file mode 100644 index 0000000..000ad64 --- /dev/null +++ b/apps/docs/src/routes/examples/+page.svelte @@ -0,0 +1,84 @@ + + +Built with launch.css
++ Full pages for different product shapes. No utility classes — just + layouts, ARIA, and semantic HTML. +
+{example.kind}
+{example.blurb}
++ Open example +
+Editorial example
++ Essays on shipping software with less ceremony — written in + plain HTML and styled by launch.css. +
++ Most early UI work is structure and hierarchy. Semantic HTML + gets you there faster than a utility soup. +
++ Continue reading +
++ Danger buttons, current nav items, and selected tabs + already have attributes you should be writing. +
+
+ data-layout keeps website and dashboard
+ shells honest while your content stays semantic.
+
+ Light and dark come from CSS variables and
+ light-dark() — no theme provider required.
+
+ launch.css is a starting surface. Replace tokens when + the brand catches up. +
+Production health for the orbit-web service.
| Version | +Environment | +Status | +Owner | +
|---|---|---|---|
| 1.2.0 | +production | +Healthy | +Nova | +
| 1.2.1-rc.3 | +staging | +Pending review | +Sam | +
| 1.1.9 | +production | +Superseded | +Riley | +
+ + +
+
+
+ Sam Rivera is primary · press ⌘ + K to
+ page backup.
+
Launch operations software
++ Northline gives growing teams a calm control plane for releases, + incidents, and handoffs — styled entirely with launch.css. +
++ + See how it works +
++ Turn tribal knowledge into repeatable launch steps with + owners and due times. +
++ Capture what changed, who acted, and what customers saw — + without another status page. +
++ Keep support, eng, and success aligned with one shared + source of truth. +
+Import services, on-call rotations, and release channels.
+Ship behind a flag with a guided launch path.
+Export the incident story for your next postmortem.
+$29 / seat / month
+$59 / seat / month
++ No. This entire page is semantic HTML plus ARIA attributes + styled by launch.css. +
+
+ Yes. Use color-scheme and CSS variables — or
+ try the Theme Builder on the docs site.
+
+ Northline is a fictional example built to demonstrate + website layout patterns. +
+