diff design_system/src/catalog.css @ 258:60a876c4587a

[ui] Add semantic primitive ownership Build a layered Zenbu token and sizing system, make authored controls use native-underneath primitives, migrate mrjunejune without imposing visual surfaces, and document/enforce HTML ownership in the catalog and wiki. Co-authored-by: Copilot <[email protected]>
author MrJuneJune <me@mrjunejune.com>
date Wed, 05 Aug 2026 05:25:40 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/design_system/src/catalog.css	Wed Aug 05 05:25:40 2026 -0700
@@ -0,0 +1,401 @@
+* {
+  box-sizing: border-box;
+}
+
+html {
+  min-height: 100%;
+  background: var(--zenbu-sys-color-surface-canvas);
+  color: var(--zenbu-sys-color-text-primary);
+  font-family: var(--zenbu-sys-font-family-ui);
+}
+
+body {
+  min-height: 100vh;
+  margin: 0;
+}
+
+button,
+input,
+select,
+textarea {
+  font: inherit;
+}
+
+.catalog-shell {
+  display: grid;
+  grid-template-columns: 17rem minmax(0, 1fr);
+  min-height: 100vh;
+}
+
+.catalog-sidebar {
+  position: sticky;
+  top: 0;
+  height: 100vh;
+  overflow: auto;
+  padding: var(--zenbu-sys-space-container);
+  border-right: var(--zenbu-sys-stroke-width-emphasis) solid var(--zenbu-sys-color-border-default);
+  background: var(--zenbu-sys-color-surface-default);
+}
+
+.catalog-brand {
+  display: inline-flex;
+  align-items: center;
+  gap: var(--zenbu-sys-space-control);
+  color: inherit;
+  font-size: var(--zenbu-sys-font-size-lg);
+  font-weight: 850;
+  text-decoration: none;
+}
+
+.catalog-search {
+  width: 100%;
+  margin-top: var(--zenbu-sys-space-container);
+}
+
+.catalog-search > zen-icon {
+  align-self: center;
+  margin-inline-start: var(--zenbu-sys-space-control);
+  color: var(--zenbu-sys-color-text-secondary);
+}
+
+.catalog-search > kbd {
+  align-self: center;
+  margin-inline-end: var(--zenbu-sys-space-related);
+  padding: 0 var(--zenbu-sys-space-icon-label);
+  border: 1px solid var(--zenbu-sys-color-border-subtle);
+  border-radius: var(--zenbu-sys-radius-control-small);
+  color: var(--zenbu-sys-color-text-secondary);
+  font: var(--zenbu-sys-font-size-xs)/1.5 var(--zenbu-sys-font-family-code);
+}
+
+.search-status {
+  min-height: 1.25rem;
+  margin: var(--zenbu-sys-space-icon-label) 0 0;
+  color: var(--zenbu-sys-color-text-secondary);
+  font-size: var(--zenbu-sys-font-size-xs);
+}
+
+.catalog-mark {
+  display: grid;
+  width: 2.5rem;
+  height: 2.5rem;
+  place-items: center;
+  border: var(--zenbu-sys-stroke-width-emphasis) solid var(--zenbu-sys-color-border-default);
+  border-radius: 50%;
+  background: var(--zenbu-sys-color-action-primary-background);
+  color: var(--zenbu-sys-color-action-primary-foreground);
+}
+
+.catalog-sidebar h2 {
+  margin: var(--zenbu-sys-space-content) 0 var(--zenbu-sys-space-related);
+  color: var(--zenbu-sys-color-text-secondary);
+  font-size: var(--zenbu-sys-font-size-xs);
+  letter-spacing: 0.12em;
+  text-transform: uppercase;
+}
+
+.catalog-nav {
+  display: grid;
+  gap: var(--zenbu-sys-space-icon-label);
+}
+
+.catalog-nav a {
+  padding: var(--zenbu-sys-space-related) var(--zenbu-sys-space-control);
+  border-radius: var(--zenbu-sys-radius-control-small);
+  color: inherit;
+  text-decoration: none;
+}
+
+.catalog-nav a[hidden],
+.component-grid > a[hidden] {
+  display: none;
+}
+
+.catalog-nav a:hover,
+.catalog-nav a[aria-current] {
+  background: var(--zenbu-sys-color-action-primary-background);
+  color: var(--zenbu-sys-color-action-primary-foreground);
+}
+
+.theme-toggle {
+  width: 100%;
+  margin-top: var(--zenbu-sys-space-content);
+  padding: var(--zenbu-sys-space-related);
+  border: var(--zenbu-sys-stroke-width-emphasis) solid var(--zenbu-sys-color-border-default);
+  border-radius: var(--zenbu-sys-radius-control);
+  background: transparent;
+  color: inherit;
+  cursor: pointer;
+}
+
+.theme-toggle-wrap {
+  display: flex;
+  width: 100%;
+}
+
+.catalog-main {
+  width: min(100%, var(--zenbu-sys-width-page));
+  min-width: 0;
+  padding: var(--zenbu-sys-space-section) clamp(1rem, 5vw, 5rem);
+  outline: none;
+}
+
+.catalog-page {
+  min-width: 0;
+}
+
+.catalog-page[hidden] {
+  display: none;
+}
+
+.page-heading {
+  max-width: 52rem;
+  margin-bottom: var(--zenbu-sys-space-section);
+}
+
+.eyebrow {
+  margin: 0 0 var(--zenbu-sys-space-related);
+  color: var(--zenbu-sys-color-info-foreground);
+  font-size: var(--zenbu-sys-font-size-sm);
+  font-weight: 800;
+  letter-spacing: 0.1em;
+  text-transform: uppercase;
+}
+
+.page-heading h1 {
+  margin: 0 0 var(--zenbu-sys-space-control);
+  font-size: var(--zenbu-sys-type-page-title-size);
+  line-height: 1.05;
+}
+
+.page-heading p {
+  color: var(--zenbu-sys-color-text-secondary);
+  font-size: var(--zenbu-sys-font-size-lg);
+}
+
+.principles,
+.component-grid,
+.token-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
+  gap: var(--zenbu-sys-space-container);
+}
+
+.principle,
+.token-group {
+  padding: var(--zenbu-sys-space-container);
+  border: var(--zenbu-sys-stroke-width-emphasis) solid var(--zenbu-sys-color-border-default);
+  border-radius: var(--zenbu-sys-radius-container);
+  background: var(--zenbu-sys-color-surface-default);
+}
+
+.principle h2,
+.token-group h2 {
+  margin-top: 0;
+}
+
+.component-grid a {
+  color: inherit;
+  text-decoration: none;
+}
+
+.component-grid zen-card {
+  height: 100%;
+}
+
+.component-grid code {
+  color: var(--zenbu-sys-color-info-foreground);
+  font-size: var(--zenbu-sys-font-size-xs);
+}
+
+.component-grid p {
+  color: var(--zenbu-sys-color-text-secondary);
+}
+
+.swatch-list {
+  display: grid;
+  gap: var(--zenbu-sys-space-related);
+  margin: 0;
+}
+
+.swatch-list div {
+  display: grid;
+  grid-template-columns: 2rem 1fr;
+  align-items: center;
+  gap: var(--zenbu-sys-space-related);
+}
+
+.swatch-list dt,
+.swatch-list dd {
+  margin: 0;
+  font-family: var(--zenbu-sys-font-family-code);
+  font-size: var(--zenbu-sys-font-size-xs);
+}
+
+.swatch {
+  --zenbu-color-swatch: transparent;
+  width: 2rem;
+  height: 2rem;
+  border: 1px solid var(--zenbu-sys-color-border-default);
+  border-radius: 50%;
+  background: var(--zenbu-color-swatch);
+}
+
+.token-group-wide {
+  grid-column: span 2;
+}
+
+.token-group > p {
+  color: var(--zenbu-sys-color-text-secondary);
+}
+
+.palette-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
+  gap: var(--zenbu-sys-space-control);
+}
+
+.palette-grid > div {
+  display: grid;
+  gap: var(--zenbu-sys-space-icon-label);
+}
+
+.palette-grid span {
+  --zenbu-color-swatch: transparent;
+  min-height: 3.5rem;
+  border: 1px solid var(--zenbu-sys-color-border-subtle);
+  border-radius: var(--zenbu-sys-radius-control);
+  background: var(--zenbu-color-swatch);
+}
+
+.palette-grid code {
+  font-size: var(--zenbu-sys-font-size-xs);
+}
+
+.data-palette {
+  display: grid;
+  grid-template-columns: repeat(10, minmax(1.75rem, 1fr));
+  min-height: 4rem;
+  overflow: hidden;
+  border: 1px solid var(--zenbu-sys-color-border-default);
+  border-radius: var(--zenbu-sys-radius-control);
+}
+
+.data-palette span {
+  --zenbu-color-swatch: transparent;
+  background: var(--zenbu-color-swatch);
+}
+
+.icon-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
+  gap: var(--zenbu-sys-space-control);
+}
+
+.icon-grid figure {
+  display: grid;
+  min-height: 7rem;
+  margin: 0;
+  padding: var(--zenbu-sys-space-control);
+  place-items: center;
+  gap: var(--zenbu-sys-space-related);
+  border: 1px solid var(--zenbu-sys-color-border-subtle);
+  border-radius: var(--zenbu-sys-radius-control);
+  background: var(--zenbu-sys-color-surface-default);
+}
+
+.icon-grid figcaption {
+  max-width: 100%;
+  overflow: hidden;
+  color: var(--zenbu-sys-color-text-secondary);
+  font-size: var(--zenbu-sys-font-size-xs);
+  text-overflow: ellipsis;
+}
+
+zen-story {
+  display: block;
+  max-width: 100%;
+  margin-bottom: var(--zenbu-sys-space-content);
+  overflow: hidden;
+  border: var(--zenbu-sys-stroke-width-emphasis) solid var(--zenbu-sys-color-border-default);
+  border-radius: var(--zenbu-sys-radius-container);
+  background: var(--zenbu-sys-color-surface-default);
+}
+
+zen-story > header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: var(--zenbu-sys-space-control);
+  padding: var(--zenbu-sys-space-control) var(--zenbu-sys-space-group);
+  border-bottom: 1px solid var(--zenbu-sys-color-border-default);
+}
+
+zen-story > header h3 {
+  margin: 0;
+}
+
+zen-story > header button {
+  padding: var(--zenbu-sys-space-icon-label) var(--zenbu-sys-space-related);
+  border: 0;
+  border-radius: var(--zenbu-sys-radius-control-small);
+  background: transparent;
+  color: var(--zenbu-sys-color-info-foreground);
+  cursor: pointer;
+}
+
+.story-canvas {
+  min-height: 8rem;
+  padding: clamp(1rem, 4vw, 3rem);
+  background:
+    linear-gradient(90deg, var(--zenbu-sys-color-gridline) 1px, transparent 1px),
+    linear-gradient(var(--zenbu-sys-color-gridline) 1px, transparent 1px);
+  background-size: 1rem 1rem;
+}
+
+zen-story > pre {
+  max-height: 24rem;
+  overflow: auto;
+  margin: 0;
+  padding: var(--zenbu-sys-space-group);
+  border-top: 1px solid var(--zenbu-sys-color-border-default);
+  background: var(--zenbu-sys-color-code-surface);
+  color: var(--zenbu-sys-color-code-text);
+  font: var(--zenbu-sys-font-size-sm)/1.55 var(--zenbu-sys-font-family-code);
+}
+
+.demo-card-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
+  gap: var(--zenbu-sys-space-container);
+}
+
+@media (max-width: 760px) {
+  .catalog-shell {
+    grid-template-columns: 1fr;
+  }
+
+  .catalog-sidebar {
+    position: static;
+    width: 100%;
+    height: auto;
+    border-right: 0;
+    border-bottom: var(--zenbu-sys-stroke-width-emphasis) solid var(--zenbu-sys-color-border-default);
+  }
+
+  .catalog-nav {
+    grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr));
+  }
+
+  .catalog-main {
+    padding: var(--zenbu-sys-space-content) var(--zenbu-sys-space-group);
+  }
+
+  .token-group-wide {
+    grid-column: auto;
+  }
+
+  .data-palette {
+    grid-template-columns: repeat(5, 1fr);
+  }
+}