From 2146d8501f9b448de83ef7b361f35b98fc3910c5 Mon Sep 17 00:00:00 2001 From: Riad Benguella Date: Sun, 25 Oct 2026 11:42:14 +0100 Subject: [PATCH 01/10] Agentic UI: Add spacing, line-height, type, radius, elevation and layer tokens, and use them instead of literals Co-Authored-By: Claude Opus 5.5 --- .../account/account-prompt/style.module.css | 16 +-- .../account/auth-actions/style.module.css | 12 +- .../account/gravatar/style.module.css | 2 +- .../account/user-menu/style.module.css | 10 +- .../src/features/annotations/style.module.css | 30 ++--- .../features/chats/markdown/style.module.css | 32 +++--- .../session-view/composer/style.module.css | 62 +++++----- .../conversation/style.module.css | 108 +++++++++--------- .../queued-prompts/style.module.css | 14 +-- .../chats/session-view/style.module.css | 28 ++--- .../commands/command-palette/style.module.css | 6 +- .../style.module.css | 8 +- .../style.module.css | 10 +- .../app-message-cards/style.module.css | 10 +- .../notifications/app-toasts/style.module.css | 8 +- .../notice-card/style.module.css | 26 ++--- .../notice-history/style.module.css | 20 ++-- .../onboarding-guide/style.module.css | 22 ++-- .../welcome-dialog/style.module.css | 32 +++--- .../agentic-signin-banner/style.module.css | 14 +-- .../settings/offline-banner/style.module.css | 8 +- .../settings/settings-dialog/style.module.css | 12 +- .../settings/settings-view/style.module.css | 72 ++++++------ .../site-settings-view/style.module.css | 10 +- .../settings/wapuu-world/style.module.css | 16 +-- .../sharing/share-dialog/style.module.css | 18 +-- .../collapsed-site-switcher/style.module.css | 12 +- .../sidebar/reorderable-list/style.module.css | 2 +- .../sidebar/sidebar-header/style.module.css | 6 +- .../sidebar/sidebar-layout/style.module.css | 14 +-- .../sidebar/sidebar-toggle/style.module.css | 2 +- .../sidebar/site-list/style.module.css | 42 +++---- .../blueprint-gallery.module.css | 14 +-- .../add-site-dialog/connect-panel.module.css | 36 +++--- .../add-site-dialog/create-panel.module.css | 28 ++--- .../add-site-dialog/import-panel.module.css | 10 +- .../sites/add-site-dialog/style.module.css | 10 +- .../sites/blueprint-upload/style.module.css | 6 +- .../sites/create-site-form/style.module.css | 32 +++--- .../sites/design-system-view/style.module.css | 100 ++++++++-------- .../preview-split-frame/style.module.css | 2 +- .../sites/site-fields/style.module.css | 6 +- .../site-header-actions/style.module.css | 2 +- .../sites/site-preview/address-bar.module.css | 12 +- .../sites/site-preview/style.module.css | 22 ++-- .../stopped-site-preview/style.module.css | 2 +- .../sync/publish-panel/style.module.css | 56 ++++----- apps/ui/src/index.css | 2 +- apps/ui/src/lib/theme/base.css | 2 +- apps/ui/src/lib/theme/tokens.css | 45 ++++++++ apps/ui/src/lib/ui/alert/style.module.css | 10 +- apps/ui/src/lib/ui/badge/style.module.css | 20 ++-- apps/ui/src/lib/ui/button/style.module.css | 20 ++-- apps/ui/src/lib/ui/checkbox/style.module.css | 2 +- .../ui/src/lib/ui/code-block/style.module.css | 4 +- apps/ui/src/lib/ui/command/style.module.css | 14 +-- apps/ui/src/lib/ui/dialog/style.module.css | 44 +++---- apps/ui/src/lib/ui/empty/style.module.css | 14 +-- apps/ui/src/lib/ui/field/style.module.css | 34 +++--- .../src/lib/ui/input-group/style.module.css | 14 +-- apps/ui/src/lib/ui/input/style.module.css | 6 +- apps/ui/src/lib/ui/kbd/style.module.css | 8 +- apps/ui/src/lib/ui/label/style.module.css | 4 +- apps/ui/src/lib/ui/menu/style.module.css | 6 +- apps/ui/src/lib/ui/popover/style.module.css | 4 +- apps/ui/src/lib/ui/progress/style.module.css | 4 +- .../src/lib/ui/resize-handle/style.module.css | 2 +- apps/ui/src/lib/ui/select/style.module.css | 16 +-- apps/ui/src/lib/ui/slider/style.module.css | 6 +- apps/ui/src/lib/ui/surface/style.module.css | 12 +- apps/ui/src/lib/ui/switch/style.module.css | 6 +- apps/ui/src/lib/ui/tabs/style.module.css | 12 +- apps/ui/src/lib/ui/textarea/style.module.css | 4 +- apps/ui/src/lib/ui/tooltip/style.module.css | 8 +- 74 files changed, 695 insertions(+), 650 deletions(-) diff --git a/apps/ui/src/features/account/account-prompt/style.module.css b/apps/ui/src/features/account/account-prompt/style.module.css index 5b2a67af74..f08ce41e3c 100644 --- a/apps/ui/src/features/account/account-prompt/style.module.css +++ b/apps/ui/src/features/account/account-prompt/style.module.css @@ -3,8 +3,8 @@ flex-direction: column; align-items: center; width: 100%; - margin-top: -16px; - padding-bottom: 32px; + margin-top: calc(var(--space-4) * -1); + padding-bottom: var(--space-8); text-align: center; text-wrap: pretty; } @@ -19,7 +19,7 @@ width: 100%; max-width: 448px; aspect-ratio: 2.6 / 1; - margin-bottom: 20px; + margin-bottom: var(--space-5); pointer-events: none; } @@ -86,23 +86,23 @@ .description { max-width: 320px; - margin: 4px 0 0; + margin: var(--space-1) 0 0; color: var(--muted-foreground); font-size: var(--text-sm); - line-height: 1.625; + line-height: var(--leading-relaxed); } .error { - margin: 12px 0 0; + margin: var(--space-3) 0 0; color: var(--destructive); font-size: var(--text-xs); } .createAccount { - margin-top: 28px; + margin-top: var(--space-7); } .logIn { - margin-top: 16px; + margin-top: var(--space-4); font-size: var(--text-xs); } diff --git a/apps/ui/src/features/account/auth-actions/style.module.css b/apps/ui/src/features/account/auth-actions/style.module.css index 6f401945cb..412ea9d354 100644 --- a/apps/ui/src/features/account/auth-actions/style.module.css +++ b/apps/ui/src/features/account/auth-actions/style.module.css @@ -1,17 +1,17 @@ .root { display: flex; flex-direction: column; - gap: 12px; + gap: var(--space-3); } .actions { display: flex; align-items: center; - gap: 16px; + gap: var(--space-4); } .arrow { - margin-inline-start: 4px; + margin-inline-start: var(--space-1); display: inline-block; } @@ -20,14 +20,14 @@ } .error { - padding: 10px 12px; + padding: var(--space-2_5) var(--space-3); border: 1px solid color-mix(in oklab, var(--destructive) 35%, transparent); - border-radius: 6px; + border-radius: var(--radius-lg); background: var(--destructive-surface); color: var(--destructive); } -@media (max-width: 600px) { +@media (width < 640px) { .actions { align-items: stretch; flex-direction: column; diff --git a/apps/ui/src/features/account/gravatar/style.module.css b/apps/ui/src/features/account/gravatar/style.module.css index 39f01b0c88..db99cc1d92 100644 --- a/apps/ui/src/features/account/gravatar/style.module.css +++ b/apps/ui/src/features/account/gravatar/style.module.css @@ -3,7 +3,7 @@ display: inline-flex; width: 20px; height: 20px; - border-radius: 50%; + border-radius: var(--radius-full); flex-shrink: 0; background-color: var(--chat); } diff --git a/apps/ui/src/features/account/user-menu/style.module.css b/apps/ui/src/features/account/user-menu/style.module.css index 5e4eeca373..158debb2a0 100644 --- a/apps/ui/src/features/account/user-menu/style.module.css +++ b/apps/ui/src/features/account/user-menu/style.module.css @@ -2,11 +2,11 @@ notification bell at the end, as 36px controls inset 12px. Pinning to the sidebar bottom is handled by the layout's `sidebarFooter` wrapper. */ .root { - padding: 0 12px 10px; + padding: 0 var(--space-3) var(--space-2_5); } .alert { - margin-block-end: 8px; + margin-block-end: var(--space-2); } .row { @@ -35,8 +35,8 @@ .account { display: flex; align-items: center; - gap: 6px; - padding: 8px 6px; + gap: var(--space-1_5); + padding: var(--space-2) var(--space-1_5); } .accountText { @@ -44,7 +44,7 @@ flex-direction: column; min-width: 0; font-size: var(--text-xs); - line-height: 1.25; + line-height: var(--leading-tight); } .accountName, diff --git a/apps/ui/src/features/annotations/style.module.css b/apps/ui/src/features/annotations/style.module.css index cccb0ab82c..8490da40c6 100644 --- a/apps/ui/src/features/annotations/style.module.css +++ b/apps/ui/src/features/annotations/style.module.css @@ -1,7 +1,7 @@ .overlay { position: absolute; inset: 0; - z-index: 20; + z-index: var(--z-overlay); pointer-events: none; } @@ -9,14 +9,14 @@ position: absolute; display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); width: 320px; max-width: calc(100% - 16px); max-height: calc(100% - 80px); - padding: 4px; + padding: var(--space-1); overflow-y: auto; border: 1px solid var(--input); - border-radius: 24px; + border-radius: var(--radius-3xl); background-color: var(--composer); color: var(--foreground); pointer-events: auto; @@ -33,15 +33,15 @@ .images { display: flex; flex-wrap: wrap; - gap: 12px; - padding: 8px 8px 4px; + gap: var(--space-3); + padding: var(--space-2) var(--space-2) var(--space-1); } .image { position: relative; width: 48px; height: 48px; - border-radius: 12px; + border-radius: var(--radius-xl); background-color: var(--muted); } @@ -63,8 +63,8 @@ .imageRemove { position: absolute; - top: -8px; - right: -8px; + top: calc(var(--space-2) * -1); + right: calc(var(--space-2) * -1); z-index: 1; display: inline-flex; align-items: center; @@ -72,7 +72,7 @@ width: 24px; height: 24px; border: 1px solid var(--border); - border-radius: 50%; + border-radius: var(--radius-full); background-color: var(--chrome); box-shadow: 0 1px 2px rgb(0 0 0 / 10%); color: var(--foreground); @@ -82,8 +82,8 @@ .toolbar { display: flex; align-items: center; - gap: 4px; - padding: 0 4px 4px; + gap: var(--space-1); + padding: 0 var(--space-1) var(--space-1); } .save { @@ -92,12 +92,12 @@ .bar { position: absolute; - bottom: 16px; + bottom: var(--space-4); left: 50%; display: flex; align-items: center; - gap: 4px; - padding: 6px; + gap: var(--space-1); + padding: var(--space-1_5); border-radius: var(--radius-xl); background-color: var(--popover); box-shadow: diff --git a/apps/ui/src/features/chats/markdown/style.module.css b/apps/ui/src/features/chats/markdown/style.module.css index 6155f298c0..f68f3758f5 100644 --- a/apps/ui/src/features/chats/markdown/style.module.css +++ b/apps/ui/src/features/chats/markdown/style.module.css @@ -5,7 +5,7 @@ min-width: 0; color: var(--foreground); font-size: var(--text-sm); - line-height: 1.625; + line-height: var(--leading-relaxed); overflow-wrap: break-word; } @@ -21,13 +21,13 @@ .h4 { margin-block: var(--markdown-gap); font-weight: var(--font-weight-semibold); - line-height: 20px; + line-height: var(--text-sm--line-height); color: var(--foreground); } .blockquote, .tableWrap { - margin-block: 16px; + margin-block: var(--space-4); } .hr { @@ -45,7 +45,7 @@ .ul, .ol { - padding-inline-start: 20px; + padding-inline-start: var(--space-5); list-style-position: outside; } @@ -58,13 +58,13 @@ } .li { - padding-block: 2px; + padding-block: var(--space-0_5); } .li > .ul, .li > .ol { - margin-block-start: 4px; - padding-inline-start: 24px; + margin-block-start: var(--space-1); + padding-inline-start: var(--space-6); } .a { @@ -84,7 +84,7 @@ } .blockquote { - padding-inline-start: 12px; + padding-inline-start: var(--space-3); border-inline-start: 2px solid color-mix(in oklab, var(--muted-foreground) 30%, transparent); color: var(--muted-foreground); } @@ -94,12 +94,12 @@ } .codeInline { - padding: 2px 4px; + padding: var(--space-0_5) var(--space-1); border-radius: var(--radius-sm); background-color: color-mix(in oklab, var(--foreground) 5%, transparent); font-family: var(--font-mono); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); -webkit-user-select: text; user-select: text; } @@ -108,19 +108,19 @@ display: flex; align-items: center; justify-content: space-between; - gap: 8px; - padding: 8px 12px; + gap: var(--space-2); + padding: var(--space-2) var(--space-3); border-bottom: 1px solid var(--border); background-color: color-mix(in oklab, var(--muted) 80%, transparent); color: var(--muted-foreground); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); } .tableWrap { display: flex; flex-direction: column; - padding: 8px; + padding: var(--space-2); border: 1px solid var(--border); border-radius: var(--radius-lg); } @@ -147,8 +147,8 @@ .th, .td { - padding: 8px 16px; - line-height: 20px; + padding: var(--space-2) var(--space-4); + line-height: var(--text-sm--line-height); text-align: start; } diff --git a/apps/ui/src/features/chats/session-view/composer/style.module.css b/apps/ui/src/features/chats/session-view/composer/style.module.css index c5d07b1d1c..a062678e91 100644 --- a/apps/ui/src/features/chats/session-view/composer/style.module.css +++ b/apps/ui/src/features/chats/session-view/composer/style.module.css @@ -5,13 +5,13 @@ /* A tab above the composer, which overlaps its bottom edge. */ .notice { - margin-bottom: -24px; - padding: 6px 10px 30px 16px; - border-radius: 24px 24px 0 0; + margin-bottom: calc(var(--space-6) * -1); + padding: var(--space-1_5) var(--space-2_5) 30px var(--space-4); + border-radius: var(--radius-3xl) var(--radius-3xl) 0 0; background-color: var(--muted); color: var(--muted-foreground); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); } .notice[data-feedback] { @@ -23,7 +23,7 @@ display: flex; min-height: 36px; align-items: center; - gap: 12px; + gap: var(--space-3); } .noticeContent[data-submit-feedback='shake'] { @@ -70,7 +70,7 @@ /* Text-input chrome, like the form inputs beside it, instead of the chat composer. */ .shellField { - border-radius: 9px; + border-radius: var(--radius-lg); background-color: color-mix( in srgb, var(--chrome) 60%, @@ -92,7 +92,7 @@ .dropOverlay { position: absolute; inset: 0; - z-index: 40; + z-index: var(--z-sidebar); display: flex; align-items: center; justify-content: center; @@ -107,8 +107,8 @@ } .dropOverlay span { - padding: 8px 16px; - border-radius: 13px; + padding: var(--space-2) var(--space-4); + border-radius: var(--radius-xl); background-color: var(--accent); color: var(--accent-foreground); font-size: var(--text-sm); @@ -123,8 +123,8 @@ display: flex; flex-wrap: wrap; align-items: flex-end; - gap: 12px; - padding: 14px 14px 6px; + gap: var(--space-3); + padding: var(--space-3_5) var(--space-3_5) var(--space-1_5); } .attachment { @@ -158,12 +158,12 @@ } .attachmentFile { - gap: 8px; + gap: var(--space-2); align-items: center; height: 36px; - padding: 0 12px; + padding: 0 var(--space-3); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); } .attachmentFile:hover { @@ -194,15 +194,15 @@ --button-background: var(--chrome); position: absolute; - top: -8px; - right: -8px; + top: calc(var(--space-2) * -1); + right: calc(var(--space-2) * -1); z-index: 1; box-shadow: var(--shadow-sm); } .attachmentRemove::after { position: absolute; - inset: -4px; + inset: calc(var(--space-1) * -1); content: ''; } @@ -247,10 +247,10 @@ .attachmentHoverText { min-height: var(--attachment-hover-artwork-height); - padding: 12px; + padding: var(--space-3); color: var(--foreground); font-family: var(--font-mono); - font-size: 11px; + font-size: var(--text-2xs); line-height: 1.35; white-space: pre-wrap; overflow-wrap: anywhere; @@ -260,8 +260,8 @@ display: flex; min-width: 0; flex-direction: column; - gap: 2px; - padding: 8px 10px; + gap: var(--space-0_5); + padding: var(--space-2) var(--space-2_5); color: var(--foreground); } @@ -269,7 +269,7 @@ overflow: hidden; font-size: var(--text-xxs); font-weight: var(--font-weight-semibold); - line-height: 1.25; + line-height: var(--leading-tight); text-overflow: ellipsis; white-space: nowrap; } @@ -277,7 +277,7 @@ .attachmentHoverMeta { overflow: hidden; color: var(--muted-foreground); - font-size: 11px; + font-size: var(--text-2xs); line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; @@ -292,7 +292,7 @@ .input { min-height: 0; max-height: calc(6lh + 28px); - padding: 14px; + padding: var(--space-3_5); overflow-y: auto; } @@ -302,13 +302,13 @@ .placeholder { position: absolute; - top: 14px; - right: 14px; - left: 14px; + top: var(--space-3_5); + right: var(--space-3_5); + left: var(--space-3_5); overflow: hidden; color: var(--muted-foreground); font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); text-overflow: ellipsis; white-space: nowrap; pointer-events: none; @@ -318,9 +318,9 @@ display: flex; align-items: center; justify-content: space-between; - gap: 8px; + gap: var(--space-2); min-width: 0; - padding: 6px 8px 8px; + padding: var(--space-1_5) var(--space-2) var(--space-2); } .leftActions, @@ -330,7 +330,7 @@ } .rightActions { - gap: 4px; + gap: var(--space-1); } .leftActions { diff --git a/apps/ui/src/features/chats/session-view/conversation/style.module.css b/apps/ui/src/features/chats/session-view/conversation/style.module.css index e86d657e86..4557a48c96 100644 --- a/apps/ui/src/features/chats/session-view/conversation/style.module.css +++ b/apps/ui/src/features/chats/session-view/conversation/style.module.css @@ -1,11 +1,11 @@ .root { display: flex; flex-direction: column; - gap: 24px; + gap: var(--space-6); } .root > [data-joined-above] { - margin-top: -20px; + margin-top: calc(var(--space-5) * -1); } .userTurn { @@ -17,10 +17,10 @@ align-self: flex-end; display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); max-width: 80%; - margin-top: 4px; - padding: 8px 12px; + margin-top: var(--space-1); + padding: var(--space-2) var(--space-3); border: 1px solid var(--border); border-radius: 12px; background-color: var(--chat); @@ -44,7 +44,7 @@ .assistantTurn { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .userTextRow { @@ -74,12 +74,12 @@ .assistantBubble { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); min-width: 0; max-width: min(85%, 32rem); - padding: 12px 16px; + padding: var(--space-3) var(--space-4); overflow: hidden; - border-radius: 16px; + border-radius: var(--radius-2xl); overflow-wrap: break-word; } @@ -118,16 +118,16 @@ .userAttachments { display: flex; flex-wrap: wrap; - gap: 8px; + gap: var(--space-2); } .userAttachment { display: inline-flex; align-items: center; - gap: 6px; + gap: var(--space-1_5); min-width: 0; max-width: 256px; - padding: 0 6px; + padding: 0 var(--space-1_5); border: 1px solid var(--border); border-radius: var(--radius-md); font-weight: var(--font-weight-medium); @@ -169,28 +169,28 @@ } .root > .toolRow + .toolRow { - margin-top: -16px; + margin-top: calc(var(--space-4) * -1); } .toolDetails { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); min-width: 0; - margin-block: 8px 4px; + margin-block: var(--space-2) var(--space-1); margin-inline-start: 7px; - padding-inline: 12px 4px; + padding-inline: var(--space-3) var(--space-1); border-inline-start: 1px solid var(--border); color: var(--muted-foreground); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); overflow-wrap: break-word; } .activityProgress { color: var(--muted-foreground); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); opacity: 0.8; overflow: hidden; text-overflow: ellipsis; @@ -200,12 +200,12 @@ .traceLine { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); min-width: 0; max-width: 100%; color: var(--muted-foreground); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); } .traceLine svg { @@ -223,7 +223,7 @@ appearance: none; display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); width: fit-content; max-width: 100%; min-width: 0; @@ -248,7 +248,7 @@ } .traceTrigger:focus-visible { - outline: 2px solid var(--ring); + outline: var(--focus-width) solid var(--ring); outline-offset: 2px; } @@ -270,7 +270,7 @@ } .toolCode pre { - padding: 8px; + padding: var(--space-2); } .toolOutput { @@ -281,7 +281,7 @@ .mediaArtifacts { display: flex; flex-direction: column; - gap: 12px; + gap: var(--space-3); } .mediaArtifactImage { @@ -292,23 +292,23 @@ .marker { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); min-height: 16px; color: var(--muted-foreground); font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); overflow-wrap: anywhere; } .questionBatch { display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); overflow-anchor: none; } .questionBatchStep { - animation: questionBatchStepEnter 120ms ease-out; + animation: questionBatchStepEnter var(--motion-duration-feedback) ease-out; } .questionBatchStep[data-state='answered'] { @@ -320,16 +320,16 @@ } .questionBatchStep[data-state='answered'] .questionProgress { - animation: questionAnsweredElementFade 180ms ease-out forwards; + animation: questionAnsweredElementFade var(--motion-duration-surface) ease-out forwards; } .questionCard { display: flex; flex-direction: column; - gap: 16px; + gap: var(--space-4); width: 100%; - padding: 16px; - border-radius: 16px; + padding: var(--space-4); + border-radius: var(--radius-2xl); background-color: var(--muted); } @@ -341,7 +341,7 @@ .questionText { color: var(--foreground); font-weight: var(--font-weight-medium); - line-height: 1.375; + line-height: var(--leading-snug); text-wrap: pretty; } @@ -366,16 +366,16 @@ } .questionSummary:focus-visible { - outline: 2px solid var(--ring); + outline: var(--focus-width) solid var(--ring); outline-offset: 2px; } .questionAnswer { display: flex; align-items: center; - gap: 6px; + gap: var(--space-1_5); min-height: 36px; - padding: 6px 8px; + padding: var(--space-1_5) var(--space-2); border-radius: var(--radius-md); color: var(--muted-foreground); } @@ -403,12 +403,12 @@ font-family: var(--font-mono); font-size: var(--text-sm); font-weight: var(--font-weight-medium); - line-height: 1; + line-height: var(--leading-none); } .questionChoices { display: grid; - margin-inline-start: -8px; + margin-inline-start: calc(var(--space-2) * -1); } .questionChoiceItem { @@ -419,10 +419,10 @@ .questionChoice { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); width: 100%; min-height: 36px; - padding: 8px; + padding: var(--space-2); border-radius: var(--radius-md); color: var(--foreground); text-align: start; @@ -452,9 +452,9 @@ display: flex; flex: 1; flex-direction: column; - gap: 2px; + gap: var(--space-0_5); min-width: 0; - line-height: 1.375; + line-height: var(--leading-snug); } .questionChoiceFreeForm .questionChoiceLabel > :first-child { @@ -463,7 +463,7 @@ .questionChoices[data-layout='grid'] { grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); - gap: 4px; + gap: var(--space-1); } .questionChoices[data-layout='grid'] .questionChoiceItem[data-wide='true'] { @@ -513,9 +513,9 @@ .questionOptionZoom { position: absolute; - top: 16px; - inset-inline-end: 16px; - box-shadow: 0 1px 3px rgb(0 0 0 / 20%); + top: var(--space-4); + inset-inline-end: var(--space-4); + box-shadow: var(--shadow-raised); } .questionOptionZoomPopup { @@ -534,7 +534,7 @@ .questionOptionZoomClose, .questionOptionZoomStep { position: absolute; - box-shadow: 0 1px 3px rgb(0 0 0 / 20%); + box-shadow: var(--shadow-raised); } .questionOptionZoom, @@ -544,8 +544,8 @@ } .questionOptionZoomClose { - top: 8px; - inset-inline-end: 8px; + top: var(--space-2); + inset-inline-end: var(--space-2); } .questionOptionZoomStep { @@ -554,24 +554,24 @@ } .questionOptionZoomPrevious { - inset-inline-start: 8px; + inset-inline-start: var(--space-2); } .questionOptionZoomNext { - inset-inline-end: 8px; + inset-inline-end: var(--space-2); } .questionOptionZoomChoose { position: absolute; inset-inline: 0; - bottom: 12px; + bottom: var(--space-3); width: fit-content; margin-inline: auto; - box-shadow: 0 1px 3px rgb(0 0 0 / 20%); + box-shadow: var(--shadow-raised); } .questionCard[data-state='folding'] .questionChoiceItem:not([data-picked='true']) { - animation: questionAnsweredElementFade 180ms ease-out forwards; + animation: questionAnsweredElementFade var(--motion-duration-surface) ease-out forwards; } @keyframes questionBatchStepEnter { diff --git a/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css b/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css index 3173e3a24c..ae92da17de 100644 --- a/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css +++ b/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css @@ -3,8 +3,8 @@ display: flex; flex-direction: column; max-height: 160px; - margin: 0 -2px 14px; - padding: 8px; + margin: 0 calc(var(--space-0_5) * -1) var(--space-3_5); + padding: var(--space-2); overflow-y: auto; border: 1px solid var(--border); border-radius: var(--radius-xl); @@ -14,17 +14,17 @@ .item { display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); min-width: 0; - padding: 4px 8px; + padding: var(--space-1) var(--space-2); border-radius: var(--radius-md); font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); } .row { display: flex; - gap: 8px; + gap: var(--space-2); align-items: center; } @@ -39,7 +39,7 @@ .actions { display: flex; - gap: 4px; + gap: var(--space-1); opacity: 0; transition: opacity var(--motion-duration-feedback) ease; } diff --git a/apps/ui/src/features/chats/session-view/style.module.css b/apps/ui/src/features/chats/session-view/style.module.css index f194701260..de5abef040 100644 --- a/apps/ui/src/features/chats/session-view/style.module.css +++ b/apps/ui/src/features/chats/session-view/style.module.css @@ -20,8 +20,8 @@ .header { display: flex; align-items: center; - gap: 4px; - padding-inline: 12px; + gap: var(--space-1); + padding-inline: var(--space-3); height: var(--band-height); transition: padding var(--motion-duration-layout) var(--motion-ease-layout); background-color: var(--chrome); @@ -35,12 +35,12 @@ .headerLead { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); min-width: 0; } .headerWithSiteActions { - padding-inline-end: 8px; + padding-inline-end: var(--space-2); } .headerSidebarCollapsed { @@ -52,19 +52,19 @@ } .headerSiteIcon { - margin-inline-end: calc(-1 * 4px); + margin-inline-end: calc(-1 * var(--space-1)); } .headerDot { width: 6px; height: 6px; - border-radius: 50%; + border-radius: var(--radius-full); background-color: var(--status-running); flex-shrink: 0; /* Extra horizontal margin around the dot only — keeps the toggle-to-title gap at the header's base 8px while giving the site/dot/local grouping more breathing room. */ - margin: 0 4px; + margin: 0 var(--space-1); } .headerEnv { @@ -78,7 +78,7 @@ .headerActions { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); -webkit-app-region: no-drag; } @@ -143,7 +143,7 @@ } .conversationSpacing { - padding-top: 16px; + padding-top: var(--space-4); padding-bottom: 30px; } @@ -152,7 +152,7 @@ above the composer without contributing to the measured composer height. */ .scrollToLatestWrap { position: absolute; - bottom: calc(100% + 18px); + bottom: calc(100% + var(--space-4_5)); inset-inline: 0; display: flex; justify-content: center; @@ -174,7 +174,7 @@ /* Composer fade-in after the entitlement check resolves. No fill mode: natural opacity is 1, and index.css's reduced-motion clamp covers it. */ .fadeInQuick { - animation: fade-in-quick 180ms ease-out; + animation: fade-in-quick var(--motion-duration-surface) ease-out; } @keyframes fade-in-quick { @@ -193,9 +193,9 @@ flex-direction: column; align-items: center; justify-content: center; - gap: 12px; + gap: var(--space-3); height: 100%; - padding: 24px; + padding: var(--space-6); color: var(--muted-foreground); font-size: var(--text-sm); } @@ -207,7 +207,7 @@ align-items: center; justify-content: center; /* Centred between the header and the composer. */ - padding: calc(var(--header-height) + 24px) 24px calc(24px + 2 * var(--composer-bottom-gap)); + padding: calc(var(--header-height) + var(--space-6)) var(--space-6) calc(var(--space-6) + 2 * var(--composer-bottom-gap)); transition: opacity var(--motion-duration-layout) var(--motion-ease-layout); } diff --git a/apps/ui/src/features/commands/command-palette/style.module.css b/apps/ui/src/features/commands/command-palette/style.module.css index ee9472498b..5f99aff33e 100644 --- a/apps/ui/src/features/commands/command-palette/style.module.css +++ b/apps/ui/src/features/commands/command-palette/style.module.css @@ -1,16 +1,16 @@ /* Sits a little above center, and stays put as results narrow. */ .popup { - top: max(16px, calc(50dvh - 168px)); + top: max(var(--space-4), calc(50dvh - 168px)); display: block; max-width: 448px; overflow: hidden; - padding: 10px; + padding: var(--space-2_5); transform: translateX(-50%); transition: none; } .inputGroup { - border-radius: 14px; + border-radius: calc(var(--radius-3xl) - var(--space-2_5)); } .icon { diff --git a/apps/ui/src/features/credits/ai-credits-details-dialog/style.module.css b/apps/ui/src/features/credits/ai-credits-details-dialog/style.module.css index 3de2cc010b..93d1368a47 100644 --- a/apps/ui/src/features/credits/ai-credits-details-dialog/style.module.css +++ b/apps/ui/src/features/credits/ai-credits-details-dialog/style.module.css @@ -1,13 +1,13 @@ .details { display: flex; flex-direction: column; - gap: 12px; + gap: var(--space-3); } .section { display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); } .section h3 { @@ -16,12 +16,12 @@ } .section ul { - padding-inline-start: 16px; + padding-inline-start: var(--space-4); list-style: disc; } .section li + li { - margin-block-start: 4px; + margin-block-start: var(--space-1); } .learnMoreButton, diff --git a/apps/ui/src/features/credits/ai-credits-purchase-dialog/style.module.css b/apps/ui/src/features/credits/ai-credits-purchase-dialog/style.module.css index aa26827f8f..5fc6e7f87d 100644 --- a/apps/ui/src/features/credits/ai-credits-purchase-dialog/style.module.css +++ b/apps/ui/src/features/credits/ai-credits-purchase-dialog/style.module.css @@ -1,7 +1,7 @@ .amountCards { display: grid; grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); - gap: 8px; + gap: var(--space-2); } .descriptionEmphasis { @@ -12,10 +12,10 @@ display: flex; flex-direction: column; align-items: flex-start; - gap: 4px; - padding: 12px; + gap: var(--space-1); + padding: var(--space-3); border: 1px solid var(--border); - border-radius: 16px; + border-radius: var(--radius-2xl); color: var(--foreground); cursor: pointer; text-align: start; @@ -37,7 +37,7 @@ } .optionPrice { - font-size: 15px; + font-size: var(--text-md); font-weight: var(--font-weight-semibold); } diff --git a/apps/ui/src/features/notifications/app-message-cards/style.module.css b/apps/ui/src/features/notifications/app-message-cards/style.module.css index 073d90c824..19b1d4763c 100644 --- a/apps/ui/src/features/notifications/app-message-cards/style.module.css +++ b/apps/ui/src/features/notifications/app-message-cards/style.module.css @@ -3,7 +3,7 @@ .stack { display: flex; flex-direction: column; - margin-top: calc(-1 * 8px); + margin-top: calc(-1 * var(--space-2)); } /* Collapsible row, same treatment as the toasts: @starting-style animates @@ -13,10 +13,10 @@ container-type: inline-size; display: grid; grid-template-rows: 1fr; - margin-top: 8px; + margin-top: var(--space-2); transition: - grid-template-rows 180ms ease, - margin-top 180ms ease; + grid-template-rows var(--motion-duration-surface) ease, + margin-top var(--motion-duration-surface) ease; } @starting-style { @@ -48,7 +48,7 @@ right: -1px; width: 6px; height: 6px; - border-radius: 50%; + border-radius: var(--radius-full); background-color: var(--accent-text); pointer-events: none; } diff --git a/apps/ui/src/features/notifications/app-toasts/style.module.css b/apps/ui/src/features/notifications/app-toasts/style.module.css index 76d8f791a0..ba94484dd5 100644 --- a/apps/ui/src/features/notifications/app-toasts/style.module.css +++ b/apps/ui/src/features/notifications/app-toasts/style.module.css @@ -3,8 +3,8 @@ hovering or focusing the deck spreads it into a list. */ .viewport { position: fixed; - inset-block-end: 12px; - inset-inline-end: 12px; + inset-block-end: var(--space-3); + inset-inline-end: var(--space-3); z-index: var(--z-toast); width: min(320px, calc(100vw - 24px)); pointer-events: none; @@ -85,8 +85,8 @@ clip for the dismiss button that overhangs the corner. */ .content { height: calc(100% + 24px); - margin: -12px; - padding: 12px; + margin: calc(var(--space-3) * -1); + padding: var(--space-3); overflow: clip; transition: opacity var(--motion-duration-feedback) var(--motion-ease-enter); } diff --git a/apps/ui/src/features/notifications/notice-card/style.module.css b/apps/ui/src/features/notifications/notice-card/style.module.css index 418a9c3e30..dfc4293936 100644 --- a/apps/ui/src/features/notifications/notice-card/style.module.css +++ b/apps/ui/src/features/notifications/notice-card/style.module.css @@ -2,7 +2,7 @@ .card { position: relative; pointer-events: auto; - padding: 16px; + padding: var(--space-4); border-radius: var(--radius-xl); background-color: var(--secondary); color: var(--secondary-foreground); @@ -10,7 +10,7 @@ 0 0 0 1px var(--border), var(--shadow-sm); font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); /* Toasts rewrite themselves in place — import progress ticks through a percentage — and this font's digits are not equal width, so a counter would shift the text by a few pixels on nearly every update. */ @@ -20,7 +20,7 @@ .row { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .status { @@ -30,7 +30,7 @@ justify-content: center; width: 14px; height: 14px; - border-radius: 50%; + border-radius: var(--radius-full); color: var(--secondary); } @@ -71,8 +71,8 @@ display: flex; flex-direction: column; align-items: flex-start; - gap: 8px; - margin-top: 2px; + gap: var(--space-2); + margin-top: var(--space-0_5); padding-inline-start: 22px; } @@ -92,7 +92,7 @@ } .toggle:focus-visible { - outline: 2px solid var(--ring); + outline: var(--focus-width) solid var(--ring); outline-offset: 2px; } @@ -108,7 +108,7 @@ overflow: hidden; color: var(--muted-foreground); font-size: var(--text-xs); - line-height: 1.625; + line-height: var(--leading-relaxed); white-space: pre-wrap; overflow-wrap: anywhere; interpolate-size: allow-keywords; @@ -160,10 +160,10 @@ --button-background: var(--chrome); position: absolute; - inset-block-start: -6px; - inset-inline-start: -6px; + inset-block-start: calc(var(--space-1_5) * -1); + inset-inline-start: calc(var(--space-1_5) * -1); opacity: 0; - transition: opacity 120ms ease; + transition: opacity var(--motion-duration-feedback) ease; } .card:hover .close, @@ -178,7 +178,7 @@ display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; - column-gap: 8px; + column-gap: var(--space-2); } .row { @@ -193,7 +193,7 @@ .row > button { grid-area: 3 / 2; justify-self: start; - margin-top: 12px; + margin-top: var(--space-3); } } diff --git a/apps/ui/src/features/notifications/notice-history/style.module.css b/apps/ui/src/features/notifications/notice-history/style.module.css index 6de34876a8..a641217cc0 100644 --- a/apps/ui/src/features/notifications/notice-history/style.module.css +++ b/apps/ui/src/features/notifications/notice-history/style.module.css @@ -13,34 +13,34 @@ inset-inline-end: 7.5px; width: 7px; height: 7px; - border-radius: 50%; + border-radius: var(--radius-full); background-color: var(--accent); pointer-events: none; } .empty { width: min(320px, calc(100vw - 24px)); - padding: 16px; + padding: var(--space-4); } .emptyTitle { font-size: var(--text-sm); font-weight: var(--font-weight-medium); - line-height: 20px; + line-height: var(--text-sm--line-height); } .emptyText { - margin: 4px 0 0; + margin: var(--space-1) 0 0; color: var(--muted-foreground); font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); } /* The entries float on their own, like the toasts they were. */ .history { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); width: min(320px, calc(100vw - 24px)); background: none; box-shadow: none; @@ -58,10 +58,10 @@ .list { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); max-height: min(440px, calc(100svh - 160px)); - margin: -8px; - padding: 8px; + margin: calc(var(--space-2) * -1); + padding: var(--space-2); overflow-y: auto; overscroll-behavior: contain; } @@ -70,7 +70,7 @@ flex: none; color: var(--muted-foreground); font-size: var(--text-xxs); - line-height: 1.25; + line-height: var(--leading-tight); white-space: nowrap; font-variant-numeric: tabular-nums; } diff --git a/apps/ui/src/features/onboarding/onboarding-guide/style.module.css b/apps/ui/src/features/onboarding/onboarding-guide/style.module.css index 04a8660ca4..96d53bee7b 100644 --- a/apps/ui/src/features/onboarding/onboarding-guide/style.module.css +++ b/apps/ui/src/features/onboarding/onboarding-guide/style.module.css @@ -7,8 +7,8 @@ .close { position: absolute; - top: 8px; - inset-inline-end: 8px; + top: var(--space-2); + inset-inline-end: var(--space-2); z-index: 1; } @@ -37,8 +37,8 @@ and stays there as the user advances. */ .content { display: grid; - padding: 20px 20px - 16px; + padding: var(--space-5) var(--space-5) + var(--space-4); text-align: start; } @@ -49,7 +49,7 @@ .page { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); } /* Hidden rather than unmounted: an inactive page still has to take up its space @@ -60,7 +60,7 @@ } .title { - font-size: 20px; + font-size: var(--text-2xl); font-weight: var(--font-weight-semibold); line-height: 1.3; text-wrap: balance; @@ -69,7 +69,7 @@ .description { color: var(--muted-foreground); font-size: var(--text-xs); - line-height: 1.5; + line-height: var(--leading-normal); text-wrap: pretty; } @@ -86,9 +86,9 @@ display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; - gap: 12px; - padding: 12px 20px - 20px; + gap: var(--space-3); + padding: var(--space-3) var(--space-5) + var(--space-5); } .footerStart { @@ -118,7 +118,7 @@ justify-self: center; display: flex; align-items: center; - gap: 6px; + gap: var(--space-1_5); } .dot { diff --git a/apps/ui/src/features/onboarding/welcome-dialog/style.module.css b/apps/ui/src/features/onboarding/welcome-dialog/style.module.css index 73f45e1f06..d2dfc34d48 100644 --- a/apps/ui/src/features/onboarding/welcome-dialog/style.module.css +++ b/apps/ui/src/features/onboarding/welcome-dialog/style.module.css @@ -1,32 +1,32 @@ .dialog { - gap: 20px; - padding: 24px; + gap: var(--space-5); + padding: var(--space-6); } .intro { display: flex; flex-direction: column; - gap: 6px; + gap: var(--space-1_5); } .appIcon { width: 44px; height: 44px; - margin-bottom: 8px; + margin-bottom: var(--space-2); } .actions { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); } .perks { display: flex; flex-direction: column; - gap: 8px; - margin-bottom: 6px; - padding-inline-start: 12px; + gap: var(--space-2); + margin-bottom: var(--space-1_5); + padding-inline-start: var(--space-3); border-inline-start: 2px solid var(--border); } @@ -39,7 +39,7 @@ .perksList { display: flex; flex-direction: column; - gap: 6px; + gap: var(--space-1_5); color: var(--muted-foreground); font-size: var(--text-xs); line-height: 18px; @@ -48,7 +48,7 @@ .perksList li { display: flex; align-items: center; - gap: 10px; + gap: var(--space-2_5); } .perksList svg { @@ -77,9 +77,9 @@ .account { display: flex; align-items: center; - gap: 10px; - margin-bottom: 4px; - padding: 8px 8px 8px 12px; + gap: var(--space-2_5); + margin-bottom: var(--space-1); + padding: var(--space-2) var(--space-2) var(--space-2) var(--space-3); border-radius: var(--radius-md); background: var(--muted); } @@ -112,9 +112,9 @@ .footer { display: flex; flex-direction: column; - gap: 12px; - margin-inline: -24px; - padding: 16px 24px 0; + gap: var(--space-3); + margin-inline: calc(var(--space-6) * -1); + padding: var(--space-4) var(--space-6) 0; border-top: 1px solid var(--border); } diff --git a/apps/ui/src/features/settings/agentic-signin-banner/style.module.css b/apps/ui/src/features/settings/agentic-signin-banner/style.module.css index 7318d12a90..57f820b0dd 100644 --- a/apps/ui/src/features/settings/agentic-signin-banner/style.module.css +++ b/apps/ui/src/features/settings/agentic-signin-banner/style.module.css @@ -3,11 +3,11 @@ flex-wrap: wrap; align-items: center; justify-content: space-between; - gap: 16px; - margin-bottom: calc(20px * 1.25); - padding: 16px 20px; + gap: var(--space-4); + margin-bottom: calc(var(--space-5) * 1.25); + padding: var(--space-4) var(--space-5); border: 1px solid var(--border); - border-radius: 16px; + border-radius: var(--radius-2xl); background: var(--muted); } @@ -17,7 +17,7 @@ } .heading { - margin: 0 0 8px; + margin: 0 0 var(--space-2); font-size: var(--text-xs); line-height: 24px; font-weight: var(--font-weight-semibold); @@ -25,11 +25,11 @@ } .benefits { - padding-inline-start: 16px; + padding-inline-start: var(--space-4); list-style: disc; display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); font-size: var(--text-xxs); line-height: 20px; color: var(--muted-foreground); diff --git a/apps/ui/src/features/settings/offline-banner/style.module.css b/apps/ui/src/features/settings/offline-banner/style.module.css index 4b8c12f152..6f8af6faaf 100644 --- a/apps/ui/src/features/settings/offline-banner/style.module.css +++ b/apps/ui/src/features/settings/offline-banner/style.module.css @@ -1,15 +1,15 @@ /* Keep in sync with agentic-signin-banner/style.module.css so the two banners read as one component wherever they stack. */ .root { - margin-bottom: calc(20px * 1.25); - padding: 16px 20px; + margin-bottom: calc(var(--space-5) * 1.25); + padding: var(--space-4) var(--space-5); border: 1px solid var(--border); - border-radius: 16px; + border-radius: var(--radius-2xl); background: var(--muted); } .heading { - margin: 0 0 8px; + margin: 0 0 var(--space-2); font-size: var(--text-xs); line-height: 24px; font-weight: var(--font-weight-semibold); diff --git a/apps/ui/src/features/settings/settings-dialog/style.module.css b/apps/ui/src/features/settings/settings-dialog/style.module.css index 6be1c4780a..b2d95ac2d1 100644 --- a/apps/ui/src/features/settings/settings-dialog/style.module.css +++ b/apps/ui/src/features/settings/settings-dialog/style.module.css @@ -1,15 +1,15 @@ .scopes { - margin: 12px 12px 0; + margin: var(--space-3) var(--space-3) 0; } .search { width: auto; - margin: 12px 12px 0; + margin: var(--space-3) var(--space-3) 0; } .empty { - padding: 16px 20px; + padding: var(--space-4) var(--space-5); text-align: center; color: var(--muted-foreground); font-size: var(--text-xs); @@ -25,8 +25,8 @@ /* The setting picked from the search results. */ .content :global([data-settings-match]) { - margin-inline: -12px; - padding-inline: 12px; + margin-inline: calc(var(--space-3) * -1); + padding-inline: var(--space-3); border-radius: 8px; background: color-mix(in srgb, var(--accent-text) 12%, transparent); transition: background-color var(--motion-duration-layout); @@ -35,7 +35,7 @@ .sections { display: flex; flex-direction: column; - gap: 32px; + gap: var(--space-8); } .error { diff --git a/apps/ui/src/features/settings/settings-view/style.module.css b/apps/ui/src/features/settings/settings-view/style.module.css index 955af2f2a2..00887fb643 100644 --- a/apps/ui/src/features/settings/settings-view/style.module.css +++ b/apps/ui/src/features/settings/settings-view/style.module.css @@ -1,5 +1,5 @@ .state { - padding: 20px; + padding: var(--space-5); color: var(--muted-foreground); font-size: var(--text-xxs); line-height: 24px; @@ -8,31 +8,31 @@ .preferencesPanel { display: flex; flex-direction: column; - gap: 32px; + gap: var(--space-8); } .instructionsHeader { display: flex; align-items: baseline; justify-content: space-between; - gap: 8px; + gap: var(--space-2); } .groupLegend { - margin-block-end: 2px; + margin-block-end: var(--space-0_5); } .groupDescription { - margin-block-end: 8px; - padding-inline: 20px; + margin-block-end: var(--space-2); + padding-inline: var(--space-5); } .rowTitle { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); } .linkButton { @@ -54,7 +54,7 @@ .settingsControl { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .settingsRow[data-orientation='vertical'] > .settingsControl { @@ -62,7 +62,7 @@ align-items: stretch; } -@media ( max-width: 640px ) { +@media (width < 640px) { .settingsRow[data-orientation='horizontal'] { flex-direction: column; align-items: stretch; @@ -79,14 +79,14 @@ align-items: center; inline-size: 100%; block-size: 36px; - padding: 0 10px; + padding: 0 var(--space-2_5); border: 1px solid var(--border); - border-radius: 9px; + border-radius: var(--radius-lg); color: var(--foreground); font-family: var(--font-sans); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); text-align: start; cursor: pointer; } @@ -118,14 +118,14 @@ .cliTooltip { max-inline-size: 280px; - line-height: 20px; + line-height: var(--text-sm--line-height); } .errorMessage { - margin-block-end: 12px; - padding: 8px 12px; + margin-block-end: var(--space-3); + padding: var(--space-2) var(--space-3); border: 1px solid color-mix( in srgb, var(--destructive) 35%, transparent ); - border-radius: 6px; + border-radius: var(--radius-lg); background: color-mix( in srgb, var(--destructive) 8%, @@ -140,15 +140,15 @@ .codeBlockCopyButton { position: absolute; - inset-block-start: 6px; - inset-inline-end: 6px; + inset-block-start: var(--space-1_5); + inset-inline-end: var(--space-1_5); z-index: 1; } .wapuuScoreHeading { display: inline-flex; align-items: center; - gap: 4px; + gap: var(--space-1); } .wapuuScoreIcon { @@ -157,7 +157,7 @@ .wapuuScoreMeter { - gap: 8px; + gap: var(--space-2); } @@ -171,7 +171,7 @@ .unavailableBar { inline-size: 100%; block-size: 4px; - border-radius: 999px; + border-radius: var(--radius-full); background: repeating-linear-gradient( 135deg, color-mix( in srgb, var(--muted-foreground) 22%, transparent ) 0 @@ -182,7 +182,7 @@ } .meterRow { - gap: 8px; + gap: var(--space-2); } .meterSummary { @@ -190,15 +190,15 @@ flex-wrap: wrap; align-items: center; justify-content: space-between; - gap: 4px 16px; + gap: var(--space-1) var(--space-4); } .meterSummary > [data-slot='field-label'] { - gap: 4px; + gap: var(--space-1); } .meterSummary > [data-slot='field-label'] > button { - margin-block: -4px; + margin-block: calc(var(--space-1) * -1); } /* Escalation colors for the AI credits meter (80% / 90% / exhausted). The @@ -220,7 +220,7 @@ .aiCreditsTrack { block-size: 4px; - border-radius: 999px; + border-radius: var(--radius-full); background: linear-gradient( 90deg, color-mix( in srgb, var(--accent-text) 32%, transparent ), @@ -236,8 +236,8 @@ .expiredToggle { - margin-inline: 16px; - margin-block-end: 16px; + margin-inline: var(--space-4); + margin-block-end: var(--space-4); } @@ -272,7 +272,7 @@ width: 176px; overflow: hidden; border: 1px solid var(--border); - border-radius: 12px; + border-radius: var(--radius-xl); background: var(--chrome); box-shadow: var(--shadow-xs); } @@ -280,15 +280,15 @@ .previewIllustrationBar { display: flex; justify-content: flex-end; - padding: 8px 12px; + padding: var(--space-2) var(--space-3); border-bottom: 1px solid var(--border); } .previewIllustrationButton { - padding: 2px 8px; + padding: var(--space-0_5) var(--space-2); border: 1px solid var(--border); - border-radius: 6px; + border-radius: var(--radius-lg); box-shadow: 0 0 0 3px color-mix( in srgb, var(--accent) 25%, transparent ); font-size: var(--text-xxs); @@ -308,13 +308,13 @@ .pathForm { display: flex; - gap: 8px; + gap: var(--space-2); } .keyForm { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .settingsControl:has( > .colorControl, > .sliderControl ) { @@ -326,7 +326,7 @@ display: flex; flex-wrap: wrap; align-items: center; - gap: 6px; + gap: var(--space-1_5); width: 100%; } @@ -334,7 +334,7 @@ flex-shrink: 0; width: 24px; height: 24px; - border-radius: 9999px; + border-radius: var(--radius-full); cursor: pointer; } diff --git a/apps/ui/src/features/settings/site-settings-view/style.module.css b/apps/ui/src/features/settings/site-settings-view/style.module.css index 45c484f3fc..1aa20040d0 100644 --- a/apps/ui/src/features/settings/site-settings-view/style.module.css +++ b/apps/ui/src/features/settings/site-settings-view/style.module.css @@ -1,12 +1,12 @@ .form { display: flex; flex-direction: column; - gap: 32px; + gap: var(--space-8); } .submitError { - padding: 10px 12px; - border-radius: 4px; + padding: var(--space-2_5) var(--space-3); + border-radius: var(--radius-lg); border: 1px solid color-mix(in oklab, var(--destructive) 35%, transparent); background: var(--destructive-surface); color: var(--destructive); @@ -16,7 +16,7 @@ .field { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); min-width: 224px; max-width: 100%; } @@ -27,7 +27,7 @@ .debugLogAction { display: flex; - margin-block-start: 4px; + margin-block-start: var(--space-1); } .busy { diff --git a/apps/ui/src/features/settings/wapuu-world/style.module.css b/apps/ui/src/features/settings/wapuu-world/style.module.css index 37a336ba16..657a4db616 100644 --- a/apps/ui/src/features/settings/wapuu-world/style.module.css +++ b/apps/ui/src/features/settings/wapuu-world/style.module.css @@ -22,8 +22,8 @@ display: flex; align-items: center; justify-content: space-between; - gap: 8px; - padding: 6px 12px; + gap: var(--space-2); + padding: var(--space-1_5) var(--space-3); background: var(--accent); border-radius: 4px 4px 0 0; } @@ -31,7 +31,7 @@ .title { display: flex; align-items: center; - gap: 6px; + gap: var(--space-1_5); color: var(--accent-foreground); font-family: monospace; font-weight: bold; @@ -45,14 +45,14 @@ .titleActions { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); color: color-mix(in srgb, var(--accent-foreground) 80%, transparent); font-family: monospace; - font-size: 11px; + font-size: var(--text-2xs); } .closeButton { - margin-inline-start: 8px; + margin-inline-start: var(--space-2); padding: 1px 7px; border-radius: 4px; background: color-mix(in srgb, var(--accent-foreground) 20%, transparent); @@ -68,11 +68,11 @@ } .controlsHint { - padding: 4px 12px; + padding: var(--space-1) var(--space-3); background: var(--accent); border-radius: 0 0 4px 4px; color: color-mix(in srgb, var(--accent-foreground) 80%, transparent); font-family: monospace; - font-size: 11px; + font-size: var(--text-2xs); text-align: center; } diff --git a/apps/ui/src/features/sharing/share-dialog/style.module.css b/apps/ui/src/features/sharing/share-dialog/style.module.css index cb3b4ad064..0d6cad1ea2 100644 --- a/apps/ui/src/features/sharing/share-dialog/style.module.css +++ b/apps/ui/src/features/sharing/share-dialog/style.module.css @@ -9,7 +9,7 @@ inset-inline-end: -1px; width: 7px; height: 7px; - border-radius: 50%; + border-radius: var(--radius-full); background: var(--accent); box-shadow: 0 0 0 2px var(--chat); pointer-events: none; @@ -18,14 +18,14 @@ .loading { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .error { display: flex; flex-direction: column; align-items: flex-start; - gap: 8px; + gap: var(--space-2); color: var(--destructive); } @@ -33,9 +33,9 @@ display: flex; min-width: 0; flex-direction: column; - gap: 8px; + gap: var(--space-2); font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); } .previewSelect { @@ -84,7 +84,7 @@ display: flex; align-items: center; justify-content: space-between; - gap: 8px; + gap: var(--space-2); } .expiry p { @@ -95,19 +95,19 @@ .confirm { display: flex; flex-direction: column; - gap: 12px; + gap: var(--space-3); } .confirmActions { display: flex; justify-content: flex-end; - gap: 8px; + gap: var(--space-2); } .inlineForm { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); } .notice { diff --git a/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css b/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css index 540bc67dd1..c29598ab2f 100644 --- a/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css +++ b/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css @@ -14,12 +14,12 @@ .scrollArea { max-height: min(236px, calc(100vh - 80px)); overflow-y: auto; - padding-block: 12px; + padding-block: var(--space-3); } /* Outranks site-list's own `.root` padding shorthand. */ .scrollArea .siteList { - padding-block-end: 8px; + padding-block-end: var(--space-2); } .surface svg { @@ -31,12 +31,12 @@ display: flex; align-items: center; justify-content: space-between; - gap: 8px; + gap: var(--space-2); flex-shrink: 0; width: 100%; - padding-block: 12px; - padding-inline-start: 20px; - padding-inline-end: 12px; + padding-block: var(--space-3); + padding-inline-start: var(--space-5); + padding-inline-end: var(--space-3); border-block-start: 1px solid var(--border); font-size: var(--text-xxs); cursor: pointer; diff --git a/apps/ui/src/features/sidebar/reorderable-list/style.module.css b/apps/ui/src/features/sidebar/reorderable-list/style.module.css index 32bb79060b..a3873b16be 100644 --- a/apps/ui/src/features/sidebar/reorderable-list/style.module.css +++ b/apps/ui/src/features/sidebar/reorderable-list/style.module.css @@ -37,7 +37,7 @@ inset-inline-start: 0; width: 8px; height: 8px; - border-radius: 50%; + border-radius: var(--radius-full); translate: -50% -50%; } diff --git a/apps/ui/src/features/sidebar/sidebar-header/style.module.css b/apps/ui/src/features/sidebar/sidebar-header/style.module.css index cba8cd3897..3afc444897 100644 --- a/apps/ui/src/features/sidebar/sidebar-header/style.module.css +++ b/apps/ui/src/features/sidebar/sidebar-header/style.module.css @@ -4,10 +4,10 @@ --toggle-start: var(--traffic-light-space); display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); height: var(--band-height); flex-shrink: 0; - padding-inline: var(--traffic-light-space) 12px; + padding-inline: var(--traffic-light-space) var(--space-3); box-shadow: inset 0 calc(-1 * 1px) 0 var(--border); -webkit-app-region: drag; @@ -24,7 +24,7 @@ .flush { --toggle-start: 12px; - padding-inline-start: 12px; + padding-inline-start: var(--space-3); } /* The toggle stays in the window's corner while the sidebar slides out, and diff --git a/apps/ui/src/features/sidebar/sidebar-layout/style.module.css b/apps/ui/src/features/sidebar/sidebar-layout/style.module.css index 561a18fde9..7d705deb8f 100644 --- a/apps/ui/src/features/sidebar/sidebar-layout/style.module.css +++ b/apps/ui/src/features/sidebar/sidebar-layout/style.module.css @@ -61,7 +61,7 @@ position: sticky; bottom: 0; z-index: 1; - padding-top: 24px; + padding-top: var(--space-6); background: linear-gradient(to bottom, transparent, var(--studio-sidebar-bg) 32px); pointer-events: none; -webkit-app-region: no-drag; @@ -95,7 +95,7 @@ top: var(--band-height); bottom: 0; inset-inline-start: 0; - z-index: 40; + z-index: var(--z-sidebar); } .sidebarOverlay .sidebar { @@ -106,7 +106,7 @@ .overlayBackdrop { position: absolute; inset: var(--band-height) 0 0; - z-index: 39; + z-index: calc(var(--z-sidebar) - 1); -webkit-app-region: no-drag; } @@ -121,7 +121,7 @@ /* Above the panels so the band's separator reads across them. */ .main::before { - z-index: 30; + z-index: var(--z-band); transition: opacity var(--motion-duration-layout) var(--motion-ease-layout); } @@ -135,9 +135,9 @@ above main (a later flex sibling) so its focus line sits on the border. */ .resizeHandle { position: relative; - z-index: 20; + z-index: var(--z-overlay); flex-shrink: 0; - margin-inline-end: -8px; + margin-inline-end: calc(var(--space-2) * -1); justify-content: flex-start; } @@ -154,6 +154,6 @@ } .sidebarCards { - padding: 0 8px 8px; + padding: 0 var(--space-2) var(--space-2); } diff --git a/apps/ui/src/features/sidebar/sidebar-toggle/style.module.css b/apps/ui/src/features/sidebar/sidebar-toggle/style.module.css index 9473b160a8..2cd027e6f2 100644 --- a/apps/ui/src/features/sidebar/sidebar-toggle/style.module.css +++ b/apps/ui/src/features/sidebar/sidebar-toggle/style.module.css @@ -21,7 +21,7 @@ display: inline-flex; flex-shrink: 0; width: 0; - margin-inline-end: calc(-1 * 4px); + margin-inline-end: calc(-1 * var(--space-1)); overflow: hidden; opacity: 0; transition: diff --git a/apps/ui/src/features/sidebar/site-list/style.module.css b/apps/ui/src/features/sidebar/site-list/style.module.css index 4152d7b21e..c6963762f7 100644 --- a/apps/ui/src/features/sidebar/site-list/style.module.css +++ b/apps/ui/src/features/sidebar/site-list/style.module.css @@ -15,13 +15,13 @@ resolved against whatever theme scope wraps the list. */ --sidebar-row-background: var(--hover); - padding: 12px 12px - 20px; + padding: var(--space-3) var(--space-3) + var(--space-5); display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); user-select: none; -webkit-app-region: no-drag; } @@ -37,7 +37,7 @@ carry only the site rows' visual treatment. */ .siteDragWrapper { - border-radius: 6px; + border-radius: var(--radius-md); } .siteDragPreview { @@ -54,7 +54,7 @@ flex-direction: column; /* Keep scrollIntoView targets clear of the sidebar's sticky header and footer, which paint over the scrollport's edges. */ - scroll-margin-block: 64px; + scroll-margin-block: var(--space-16); } .siteHeader { @@ -106,7 +106,7 @@ right: -1.5px; width: 7px; height: 7px; - border-radius: 50%; + border-radius: var(--radius-full); background-color: var(--accent); } @@ -136,7 +136,7 @@ pointer-events: none; transform: scale(0.75); transition: inline-size 160ms ease, flex-basis 160ms ease, margin-inline-start 160ms ease, - margin-inline-end 160ms ease, opacity 120ms ease, transform 160ms ease; + margin-inline-end 160ms ease, opacity var(--motion-duration-feedback) ease, transform 160ms ease; } .siteAgentActivitySlotVisible { @@ -183,7 +183,7 @@ .siteAgentActivitySyncDot { inline-size: 3px; block-size: 3px; - border-radius: 999px; + border-radius: var(--radius-full); background-color: currentColor; animation-name: siteAgentSyncDotBounce; animation-duration: 760ms; @@ -214,10 +214,10 @@ stays visible. The row's text makes room for them. */ .siteActions { position: absolute; - inset-block-start: 2px; - inset-inline-end: 2px; + inset-block-start: var(--space-0_5); + inset-inline-end: var(--space-0_5); display: flex; - gap: 2px; + gap: var(--space-0_5); } .siteActions .rowAction { @@ -286,18 +286,18 @@ } .empty { - padding: 4px var(--site-list-row-padding); + padding: var(--space-1) var(--site-list-row-padding); color: var(--muted-foreground); } .group { display: flex; flex-direction: column; - padding-block-start: 4px; + padding-block-start: var(--space-1); } .group[data-open] { - padding-block-end: 12px; + padding-block-end: var(--space-3); } .groupHeader { @@ -313,7 +313,7 @@ display: inline-flex; flex: 1; align-items: center; - gap: 4px; + gap: var(--space-1); height: 100%; padding: 0 var(--site-list-row-padding); border-radius: var(--radius-md); @@ -328,7 +328,7 @@ } .groupToggle:focus-visible { - outline: 2px solid var(--ring); + outline: var(--focus-width) solid var(--ring); outline-offset: -2px; } @@ -355,7 +355,7 @@ } .site .chats { - padding-block: 1px 8px; + padding-block: 1px var(--space-2); } .groupActions { @@ -448,7 +448,7 @@ .chatActions { position: absolute; - inset-inline-end: 2px; + inset-inline-end: var(--space-0_5); display: flex; opacity: 0; transition: opacity var(--motion-duration-surface) var(--motion-ease-enter); @@ -480,10 +480,10 @@ /* Sits in the archive button's slot, which takes over on hover. */ .unreadDot { position: absolute; - inset-inline-end: calc(2px + (var(--site-list-action-size) - 7px) / 2); + inset-inline-end: calc(var(--space-0_5) + (var(--site-list-action-size) - 7px) / 2); width: 7px; height: 7px; - border-radius: 50%; + border-radius: var(--radius-full); background-color: var(--accent); } diff --git a/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css b/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css index cd382dd7f9..0e2ecf1216 100644 --- a/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css +++ b/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css @@ -1,7 +1,7 @@ .root { display: flex; flex-direction: column; - gap: 24px; + gap: var(--space-6); } .notice { @@ -11,7 +11,7 @@ .grid { display: grid; grid-template-columns: 1fr; - gap: 28px 24px; + gap: var(--space-7) var(--space-6); } @container (min-width: 384px) { @@ -23,7 +23,7 @@ .card { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); min-width: 0; border: 1px solid transparent; color: var(--foreground); @@ -55,7 +55,7 @@ } .card:focus-visible :is(.thumbnail, .blank) { - outline: 2px solid var(--ring); + outline: var(--focus-width) solid var(--ring); outline-offset: 2px; } @@ -122,17 +122,17 @@ display: flex; align-items: center; height: 32px; - padding: 0 10px; + padding: 0 var(--space-2_5); border-radius: var(--radius-md); background: var(--accent); color: var(--accent-foreground); font-size: var(--text-xs); font-weight: var(--font-weight-medium); - line-height: 20px; + line-height: var(--text-xs--line-height); } .details { display: flex; flex-direction: column; - gap: 24px; + gap: var(--space-6); } diff --git a/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css b/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css index be19bcd88f..195147c948 100644 --- a/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css +++ b/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css @@ -1,11 +1,11 @@ .page { display: flex; flex-direction: column; - gap: 24px; + gap: var(--space-6); width: 100%; max-width: 448px; margin-inline: auto; - padding-block: 16px; + padding-block: var(--space-4); } .intro { @@ -15,19 +15,19 @@ .signedOut { display: flex; flex-direction: column; - gap: 24px; + gap: var(--space-6); } .benefits { display: grid; - gap: 12px; + gap: var(--space-3); color: var(--muted-foreground); } .benefits li { display: flex; align-items: center; - gap: 12px; + gap: var(--space-3); } .benefits svg { @@ -39,7 +39,7 @@ display: flex; flex-direction: column; align-items: flex-start; - gap: 12px; + gap: var(--space-3); } .state h2 { @@ -56,7 +56,7 @@ display: flex; flex-direction: column; align-items: flex-start; - gap: 8px; + gap: var(--space-2); } .search { @@ -66,24 +66,24 @@ .helperLinks { display: flex; align-items: center; - gap: 2px; + gap: var(--space-0_5); color: var(--muted-foreground); } .helperLinks button { - padding-inline: 2px; + padding-inline: var(--space-0_5); } .sections { display: flex; flex-direction: column; - gap: 32px; + gap: var(--space-8); } .section { display: flex; flex-direction: column; - gap: 12px; + gap: var(--space-3); } .sectionHeader h2 { @@ -92,7 +92,7 @@ } .sectionHeader p { - margin: 2px 0 0; + margin: var(--space-0_5) 0 0; color: var(--muted-foreground); font-size: var(--text-xs); } @@ -100,19 +100,19 @@ .siteList { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); } .site { display: flex; flex-direction: column; align-items: flex-start; - gap: 4px; + gap: var(--space-1); min-width: 0; } .siteRow { - gap: 12px; + gap: var(--space-3); } .siteThumb { @@ -142,15 +142,15 @@ .badges { display: flex; flex: none; - gap: 4px; + gap: var(--space-1); } .siteStatus { - padding-inline: 2px; + padding-inline: var(--space-0_5); color: var(--muted-foreground); font-size: var(--text-xs); } .siteAction { - padding-inline: 2px; + padding-inline: var(--space-0_5); } diff --git a/apps/ui/src/features/sites/add-site-dialog/create-panel.module.css b/apps/ui/src/features/sites/add-site-dialog/create-panel.module.css index c2e7286486..f0a186cc96 100644 --- a/apps/ui/src/features/sites/add-site-dialog/create-panel.module.css +++ b/apps/ui/src/features/sites/add-site-dialog/create-panel.module.css @@ -1,5 +1,5 @@ .blueprint { - margin-top: 32px; + margin-top: var(--space-8); } .summary { @@ -11,15 +11,15 @@ display: flex; align-items: center; justify-content: space-between; - gap: 16px; - margin-bottom: 12px; + gap: var(--space-4); + margin-bottom: var(--space-3); } /* A quiet section label, so the Blueprint's own name below stays dominant. */ .summaryHeader h2 { color: var(--muted-foreground); font-size: var(--text-xxs); - font-weight: 500; + font-weight: var(--font-weight-medium); } .summaryRemove { @@ -34,7 +34,7 @@ .summaryRemove:focus-visible { border-radius: 2px; - outline: 2px solid var(--ring); + outline: var(--focus-width) solid var(--ring); outline-offset: 2px; } @@ -42,7 +42,7 @@ display: grid; grid-template-columns: 112px minmax( 0, 1fr ); align-items: start; - gap: 16px; + gap: var(--space-4); } .summaryOverviewWithoutImage { @@ -54,7 +54,7 @@ width: 112px; aspect-ratio: 16 / 10; overflow: hidden; - border-radius: 6px; + border-radius: var(--radius-sm); background: var(--chat); } @@ -75,7 +75,7 @@ } .summaryExcerpt { - margin: 4px 0 0; + margin: var(--space-1) 0 0; color: var(--muted-foreground); font-size: var(--text-xxs); line-height: 1.4; @@ -84,12 +84,12 @@ .summaryPackages { display: grid; grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); - gap: 24px; - margin-top: 24px; + gap: var(--space-6); + margin-top: var(--space-6); } .summaryPackageGroup h3 { - margin: 0 0 6px; + margin: 0 0 var(--space-1_5); color: var(--foreground); font-size: var(--text-xxs); font-weight: var(--font-weight-semibold); @@ -100,7 +100,7 @@ } .summaryPackageGroup ul { - padding-left: 18px; + padding-left: var(--space-4_5); list-style: disc; } @@ -121,11 +121,11 @@ .summaryPackageGroup a:focus-visible { border-radius: 2px; - outline: 2px solid var(--ring); + outline: var(--focus-width) solid var(--ring); outline-offset: 2px; } -@media ( max-width: 520px ) { +@media (width < 640px) { .summaryOverview, .summaryPackages { grid-template-columns: 1fr; diff --git a/apps/ui/src/features/sites/add-site-dialog/import-panel.module.css b/apps/ui/src/features/sites/add-site-dialog/import-panel.module.css index b210a81221..1b0976f89d 100644 --- a/apps/ui/src/features/sites/add-site-dialog/import-panel.module.css +++ b/apps/ui/src/features/sites/add-site-dialog/import-panel.module.css @@ -8,10 +8,10 @@ display: flex; flex-direction: column; align-items: center; - gap: 16px; + gap: var(--space-4); max-width: 512px; - margin: 16px auto 0; - padding: 40px; + margin: var(--space-4) auto 0; + padding: var(--space-10); border: 1px dashed var(--border); border-radius: var(--radius-xl); text-align: center; @@ -28,7 +28,7 @@ .dropHelp { max-width: 512px; - margin: 12px auto 0; + margin: var(--space-3) auto 0; color: var(--muted-foreground); font-size: var(--text-xxs); line-height: 1.3; @@ -41,5 +41,5 @@ .dropError { max-width: 512px; - margin: 24px auto 0; + margin: var(--space-6) auto 0; } diff --git a/apps/ui/src/features/sites/add-site-dialog/style.module.css b/apps/ui/src/features/sites/add-site-dialog/style.module.css index cc81856ef6..78c4a2acdf 100644 --- a/apps/ui/src/features/sites/add-site-dialog/style.module.css +++ b/apps/ui/src/features/sites/add-site-dialog/style.module.css @@ -3,18 +3,18 @@ flex: none; align-items: center; height: 36px; - margin: 16px 0 0; - padding: 0 8px; + margin: var(--space-4) 0 0; + padding: 0 var(--space-2); color: var(--muted-foreground); font-size: var(--text-sm); font-weight: var(--font-weight-medium); - line-height: 20px; + line-height: var(--text-sm--line-height); } .leading { display: flex; align-items: center; - gap: 12px; + gap: var(--space-3); } .title { @@ -31,7 +31,7 @@ .progress { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); overflow: hidden; color: var(--muted-foreground); font-size: var(--text-xs); diff --git a/apps/ui/src/features/sites/blueprint-upload/style.module.css b/apps/ui/src/features/sites/blueprint-upload/style.module.css index be510c64f2..79c1e68106 100644 --- a/apps/ui/src/features/sites/blueprint-upload/style.module.css +++ b/apps/ui/src/features/sites/blueprint-upload/style.module.css @@ -13,7 +13,7 @@ .action { color: var(--accent-text); - font-weight: 500; + font-weight: var(--font-weight-medium); cursor: pointer; } @@ -30,14 +30,14 @@ .fullScreenDrop { position: fixed; inset: 0; - z-index: 20; + z-index: var(--z-overlay); display: flex; align-items: center; justify-content: center; border: 2px dashed var(--accent); background: var(--chrome); color: var(--foreground); - font-size: 1.25rem; + font-size: var(--text-2xl); font-weight: var(--font-weight-semibold); pointer-events: none; } diff --git a/apps/ui/src/features/sites/create-site-form/style.module.css b/apps/ui/src/features/sites/create-site-form/style.module.css index a90a6fe891..5008281a1a 100644 --- a/apps/ui/src/features/sites/create-site-form/style.module.css +++ b/apps/ui/src/features/sites/create-site-form/style.module.css @@ -5,19 +5,19 @@ .panel { display: flex; flex-direction: column; - gap: 24px; + gap: var(--space-6); } .actions { display: flex; justify-content: flex-end; - gap: 8px; - margin-top: 28px; + gap: var(--space-2); + margin-top: var(--space-7); } .pathRow { display: flex; - gap: 8px; + gap: var(--space-2); } .advancedToggle { @@ -27,7 +27,7 @@ .advancedCollapse { display: grid; grid-template-rows: 0fr; - margin-top: -24px; + margin-top: calc(var(--space-6) * -1); transition: grid-template-rows var(--motion-duration-layout) var(--motion-ease-layout), margin-top var(--motion-duration-layout) var(--motion-ease-layout); @@ -41,8 +41,8 @@ .advancedCollapseInner { overflow: hidden; min-height: 0; - padding: 4px; - margin: -4px; + padding: var(--space-1); + margin: calc(var(--space-1) * -1); } @media ( prefers-reduced-motion: reduce ) { @@ -52,42 +52,42 @@ } .advancedErrorCount { - margin-left: 8px; + margin-left: var(--space-2); font-size: var(--text-xxs); - font-weight: 500; + font-weight: var(--font-weight-medium); color: var(--destructive); } .submitErrorDetails { - margin-top: 6px; + margin-top: var(--space-1_5); } .submitErrorDetails summary { width: fit-content; - font-weight: 500; + font-weight: var(--font-weight-medium); cursor: pointer; } .submitErrorDetails pre { max-height: 160px; - padding-top: 6px; + padding-top: var(--space-1_5); overflow: auto; font-family: var(--font-mono); - font-size: 11px; + font-size: var(--text-2xs); white-space: pre-wrap; overflow-wrap: anywhere; } .panelFooter { - padding-top: 24px; + padding-top: var(--space-6); border-top: 1px solid var(--border); } .source { display: flex; align-items: center; - gap: 12px; - padding: 12px; + gap: var(--space-3); + padding: var(--space-3); border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--background); diff --git a/apps/ui/src/features/sites/design-system-view/style.module.css b/apps/ui/src/features/sites/design-system-view/style.module.css index 33c477166e..b42fa270e1 100644 --- a/apps/ui/src/features/sites/design-system-view/style.module.css +++ b/apps/ui/src/features/sites/design-system-view/style.module.css @@ -3,11 +3,11 @@ --ds-hairline: color-mix(in srgb, var(--ds-text) 18%, transparent); container-type: inline-size; min-height: 100%; - padding: 48px clamp(20px, 5cqi, 64px) 64px; + padding: var(--space-12) clamp(var(--space-5), 5cqi, var(--space-16)) var(--space-16); background-color: var(--ds-background); color: var(--ds-text); - font-size: 15px; - line-height: 1.5; + font-size: var(--text-md); + line-height: var(--leading-normal); } /* The app styles headings with its own theme color. */ @@ -18,8 +18,8 @@ .header { display: flex; flex-direction: column; - gap: 12px; - margin-bottom: 40px; + gap: var(--space-3); + margin-bottom: var(--space-10); } .eyebrow { @@ -45,8 +45,8 @@ display: flex; flex-wrap: wrap; align-items: baseline; - gap: 4px 16px; - margin: 8px 0 0; + gap: var(--space-1) var(--space-4); + margin: var(--space-2) 0 0; font-size: var(--text-xs); opacity: 0.75; } @@ -61,9 +61,9 @@ .driftList { display: grid; - gap: 6px; - margin: 12px 0 0; - padding: 12px 14px; + gap: var(--space-1_5); + margin: var(--space-3) 0 0; + padding: var(--space-3) var(--space-3_5); border: 1px solid var(--ds-hairline); border-radius: 8px; } @@ -71,7 +71,7 @@ .driftList div { display: flex; flex-wrap: wrap; - gap: 4px 12px; + gap: var(--space-1) var(--space-3); } .driftList dt { @@ -80,7 +80,7 @@ .driftList .driftActions { display: flex; - gap: 12px; + gap: var(--space-3); margin-inline-start: auto; } @@ -102,7 +102,7 @@ .sections { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 420px), 1fr)); - gap: 40px 48px; + gap: var(--space-10) var(--space-12); } .section { @@ -116,8 +116,8 @@ } .sectionTitle { - margin: 0 0 16px; - padding-top: 8px; + margin: 0 0 var(--space-4); + padding-top: var(--space-2); border-top: 1px solid var(--ds-hairline); font-size: var(--text-xxs); font-weight: var(--font-weight-semibold); @@ -130,7 +130,7 @@ display: flex; flex-wrap: wrap; align-items: flex-end; - gap: 32px; + gap: var(--space-8); } .aa { @@ -144,7 +144,7 @@ } .specimen figcaption { - margin-top: 12px; + margin-top: var(--space-3); font-size: var(--text-xs); opacity: 0.65; } @@ -152,7 +152,7 @@ .palette { display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); height: 320px; border-radius: min(var(--ds-small), 10px); overflow: hidden; @@ -161,7 +161,7 @@ .lead { flex: 2; display: flex; - gap: 4px; + gap: var(--space-1); min-height: 0; } @@ -173,13 +173,13 @@ flex: 1; display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); } .accents { flex: 1; display: flex; - gap: 4px; + gap: var(--space-1); } .pair > .tile, @@ -192,7 +192,7 @@ flex-direction: column; justify-content: flex-end; min-width: 0; - padding: 12px 14px; + padding: var(--space-3) var(--space-3_5); font-size: var(--text-xs); line-height: 1.35; } @@ -225,9 +225,9 @@ .scaleRow { display: grid; grid-template-columns: minmax(160px, 1fr) 3fr; - gap: 8px 32px; + gap: var(--space-2) var(--space-8); align-items: baseline; - padding: 16px 0; + padding: var(--space-4) 0; border-top: 1px solid var(--ds-hairline); } @@ -245,7 +245,7 @@ .scaleMeta { display: flex; flex-direction: column; - gap: 2px; + gap: var(--space-0_5); font-size: var(--text-xs); } @@ -266,13 +266,13 @@ display: flex; flex-wrap: wrap; align-items: flex-start; - gap: 32px; + gap: var(--space-8); } .stack { display: flex; flex-direction: column; - gap: 18px; + gap: var(--space-4_5); min-width: 0; } @@ -280,12 +280,12 @@ display: flex; flex-wrap: wrap; align-items: center; - gap: 14px; + gap: var(--space-3_5); } .button { border: 1px solid transparent; - font-size: 15px; + font-size: var(--text-md); line-height: 1.2; } @@ -302,14 +302,14 @@ .input { width: 240px; max-width: 100%; - padding: 12px 14px; + padding: var(--space-3) var(--space-3_5); border: 1px solid color-mix(in srgb, var(--ds-text) 35%, transparent); border-radius: var(--ds-small); opacity: 0.75; } .tag { - padding: 6px 12px; + padding: var(--space-1_5) var(--space-3); border-radius: var(--ds-tag-radius); background-color: color-mix(in srgb, var(--ds-primary) 16%, var(--ds-background)); font-size: var(--text-xxs); @@ -324,17 +324,17 @@ display: flex; flex-direction: column; align-items: flex-start; - gap: 10px; + gap: var(--space-2_5); flex-shrink: 0; width: 220px; min-height: 190px; - padding: 18px 20px; + padding: var(--space-4_5) var(--space-5); border-radius: var(--ds-card-radius); background-color: color-mix(in srgb, var(--ds-text) 6%, var(--ds-background)); } .card strong { - font-size: 20px; + font-size: var(--text-2xl); } .card u { @@ -347,13 +347,13 @@ .spacing { display: flex; flex-direction: column; - gap: 10px; + gap: var(--space-2_5); } .spacingRow { display: grid; grid-template-columns: 48px 1fr 64px; - gap: 12px; + gap: var(--space-3); align-items: center; font-size: var(--text-xs); } @@ -376,8 +376,8 @@ .corners { display: flex; flex-wrap: wrap; - gap: 20px; - margin-top: 28px; + gap: var(--space-5); + margin-top: var(--space-7); } .corner { @@ -393,19 +393,19 @@ } .corner figcaption { - margin-top: 8px; + margin-top: var(--space-2); opacity: 0.65; } .guidelines { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr)); - gap: 32px 48px; + gap: var(--space-8) var(--space-12); } .guideline h3 { - margin: 0 0 8px; - font-size: 20px; + margin: 0 0 var(--space-2); + font-size: var(--text-2xl); line-height: 1.2; } @@ -430,7 +430,7 @@ .guideline code { font-size: 0.9em; - padding: 1px 4px; + padding: 1px var(--space-1); border-radius: 4px; background-color: color-mix(in srgb, var(--ds-text) 10%, transparent); } @@ -440,9 +440,9 @@ flex-direction: column; align-items: center; justify-content: center; - gap: 8px; + gap: var(--space-2); height: 100%; - padding: 32px; + padding: var(--space-8); color: var(--foreground); text-align: center; } @@ -474,8 +474,8 @@ .annotationMarker { position: absolute; z-index: 1; - top: -12px; - inset-inline-end: -12px; + top: calc(var(--space-3) * -1); + inset-inline-end: calc(var(--space-3) * -1); display: inline-flex; box-sizing: content-box; align-items: center; @@ -483,7 +483,7 @@ width: 20px; height: 20px; border: 2px solid #fff; - border-radius: 50%; + border-radius: var(--radius-full); background: var(--accent); box-shadow: 0 0 0 1px var(--accent), @@ -496,7 +496,7 @@ /* The palette clips its tiles' corners, so their markers sit inside. */ .tile .annotationMarker { - top: 8px; - inset-inline-end: 8px; + top: var(--space-2); + inset-inline-end: var(--space-2); } diff --git a/apps/ui/src/features/sites/preview-split-frame/style.module.css b/apps/ui/src/features/sites/preview-split-frame/style.module.css index e918b2d182..d02aa8f646 100644 --- a/apps/ui/src/features/sites/preview-split-frame/style.module.css +++ b/apps/ui/src/features/sites/preview-split-frame/style.module.css @@ -113,7 +113,7 @@ inset-block: 0; inset-inline-start: var(--preview-frame-content-width); z-index: 3; - padding-inline-start: 4px; + padding-inline-start: var(--space-1); transform: translateX(-4px); justify-content: flex-start; } diff --git a/apps/ui/src/features/sites/site-fields/style.module.css b/apps/ui/src/features/sites/site-fields/style.module.css index 583d5bd5c3..867197fb62 100644 --- a/apps/ui/src/features/sites/site-fields/style.module.css +++ b/apps/ui/src/features/sites/site-fields/style.module.css @@ -1,5 +1,5 @@ .offlineTooltip { - gap: 8px; + gap: var(--space-2); } .offlineTooltip svg { @@ -8,12 +8,12 @@ .helpAction { display: flex; - margin-block-start: 4px; + margin-block-start: var(--space-1); } .textControl { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); min-width: min(224px, 100%); } diff --git a/apps/ui/src/features/sites/site-header-actions/style.module.css b/apps/ui/src/features/sites/site-header-actions/style.module.css index 61c008d5e2..86a8961545 100644 --- a/apps/ui/src/features/sites/site-header-actions/style.module.css +++ b/apps/ui/src/features/sites/site-header-actions/style.module.css @@ -13,7 +13,7 @@ .actions { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); } .item, diff --git a/apps/ui/src/features/sites/site-preview/address-bar.module.css b/apps/ui/src/features/sites/site-preview/address-bar.module.css index 33c4d18d82..c297df3c37 100644 --- a/apps/ui/src/features/sites/site-preview/address-bar.module.css +++ b/apps/ui/src/features/sites/site-preview/address-bar.module.css @@ -6,10 +6,10 @@ flex: 1 1 auto; min-width: 0; height: var(--control-size); - padding-inline: 12px; + padding-inline: var(--space-3); align-items: center; border: 1px solid var(--border); - border-radius: 999px; + border-radius: var(--radius-full); overflow: hidden; } @@ -36,7 +36,7 @@ .actions { position: absolute; inset-block: 0; - inset-inline-end: 2px; + inset-inline-end: var(--space-0_5); display: flex; align-items: center; opacity: 0; @@ -66,10 +66,10 @@ width: 100%; min-width: 0; /* Balances the realm icon, so the address centres on the whole field. */ - padding-inline: 4px 20px; + padding-inline: var(--space-1) var(--space-5); color: var(--foreground); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); text-align: center; outline: 0; } @@ -81,7 +81,7 @@ .shortcutsPopup { width: var(--anchor-width); max-width: calc(100vw - 16px); - padding: 6px; + padding: var(--space-1_5); } /* Rows rounded for the menu surface rather than the composer's. */ diff --git a/apps/ui/src/features/sites/site-preview/style.module.css b/apps/ui/src/features/sites/site-preview/style.module.css index d0cebb9ab1..5cc4e00721 100644 --- a/apps/ui/src/features/sites/site-preview/style.module.css +++ b/apps/ui/src/features/sites/site-preview/style.module.css @@ -18,8 +18,8 @@ position: relative; display: flex; align-items: center; - gap: 12px; - padding-inline: 12px 8px; + gap: var(--space-3); + padding-inline: var(--space-3) var(--space-2); height: var(--band-height); flex-shrink: 0; transition: padding var(--motion-duration-layout) var(--motion-ease-layout); @@ -45,7 +45,7 @@ display: flex; flex-shrink: 0; align-items: center; - gap: 4px; + gap: var(--space-1); } .browserLocation { @@ -69,9 +69,9 @@ height: var(--control-size); align-items: center; justify-content: center; - padding-inline: 12px; + padding-inline: var(--space-3); border: 1px solid var(--border); - border-radius: 999px; + border-radius: var(--radius-full); color: var(--muted-foreground); font-size: var(--text-xxs); white-space: nowrap; @@ -100,7 +100,7 @@ .historyPath { color: var(--muted-foreground); - font-size: 11px; + font-size: var(--text-2xs); } .disabledControlTooltipTarget { @@ -108,7 +108,7 @@ } .annotateButton { - gap: 4px; + gap: var(--space-1); } .annotateButtonActive { @@ -221,7 +221,7 @@ .spinner { width: 20px; height: 20px; - border-radius: 50%; + border-radius: var(--radius-full); border: 2px solid var(--border); border-top-color: var(--accent-text); animation: sitePreviewSpin 0.8s linear infinite; @@ -252,7 +252,7 @@ display: flex; align-items: center; justify-content: center; - padding: 20px; + padding: var(--space-5); background-color: var(--chat); color: var(--muted-foreground); font-size: var(--text-xxs); @@ -271,7 +271,7 @@ z-index: 1; display: flex; flex-direction: column; - gap: 12px; + gap: var(--space-3); align-items: center; width: min(100%, 420px); } @@ -293,7 +293,7 @@ .headerItem { display: flex; align-items: center; - gap: 4px; + gap: var(--space-1); flex-shrink: 0; } diff --git a/apps/ui/src/features/sites/stopped-site-preview/style.module.css b/apps/ui/src/features/sites/stopped-site-preview/style.module.css index 6c5e380019..029949d7cc 100644 --- a/apps/ui/src/features/sites/stopped-site-preview/style.module.css +++ b/apps/ui/src/features/sites/stopped-site-preview/style.module.css @@ -55,7 +55,7 @@ height: 64px; align-items: center; justify-content: center; - border-radius: 50%; + border-radius: var(--radius-full); background: color-mix(in srgb, var(--background) 90%, transparent); color: var(--foreground); } diff --git a/apps/ui/src/features/sync/publish-panel/style.module.css b/apps/ui/src/features/sync/publish-panel/style.module.css index c26c1a1817..6fb3bb1293 100644 --- a/apps/ui/src/features/sync/publish-panel/style.module.css +++ b/apps/ui/src/features/sync/publish-panel/style.module.css @@ -8,7 +8,7 @@ overflow-x: hidden; overflow-y: auto; font-size: var(--text-sm); - line-height: 20px; + line-height: var(--text-sm--line-height); } @media (prefers-reduced-motion: no-preference) { @@ -36,11 +36,11 @@ .errorDot { position: absolute; - inset-block-start: -2px; - inset-inline-end: -8px; + inset-block-start: calc(var(--space-0_5) * -1); + inset-inline-end: calc(var(--space-2) * -1); width: 6px; height: 6px; - border-radius: 50%; + border-radius: var(--radius-full); background: var(--destructive); } @@ -48,19 +48,19 @@ display: flex; flex: none; align-items: center; - gap: 12px; - padding: 14px 14px 14px 16px; + gap: var(--space-3); + padding: var(--space-3_5) var(--space-3_5) var(--space-3_5) var(--space-4); } .body { display: flex; flex-direction: column; - gap: 10px; - padding: 0 16px 16px; + gap: var(--space-2_5); + padding: 0 var(--space-4) var(--space-4); } .bodyInsetTop { - padding-top: 16px; + padding-top: var(--space-4); } .loading { @@ -76,7 +76,7 @@ overflow-wrap: anywhere; font-size: var(--text-sm); font-weight: var(--font-weight-medium); - line-height: 20px; + line-height: var(--text-sm--line-height); letter-spacing: -0.02em; } @@ -84,31 +84,31 @@ .description { color: var(--muted-foreground); font-size: var(--text-sm); - line-height: 1.625; + line-height: var(--leading-relaxed); } .description { font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); } .error { color: var(--destructive); font-size: var(--text-sm); - line-height: 1.625; + line-height: var(--leading-relaxed); } .errorMessage { display: flex; flex-direction: column; align-items: flex-start; - gap: 10px; + gap: var(--space-2_5); } .field { display: flex; flex-direction: column; - gap: 2px; + gap: var(--space-0_5); } .website { @@ -120,7 +120,7 @@ .include { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .include > .text { @@ -129,7 +129,7 @@ .footer { display: flex; - gap: 8px; + gap: var(--space-2); } .primary { @@ -139,7 +139,7 @@ .intro { display: flex; flex-direction: column; - gap: 10px; + gap: var(--space-2_5); } .introActions { @@ -150,13 +150,13 @@ .choice { display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-1); } .choiceButton { flex-direction: column; align-items: flex-start; - gap: 4px; + gap: var(--space-1); } .choiceName, @@ -174,14 +174,14 @@ .websiteRow { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .websiteRowText { display: flex; flex: 1; flex-direction: column; - gap: 2px; + gap: var(--space-0_5); min-width: 0; } @@ -191,7 +191,7 @@ overflow: hidden; font-size: var(--text-sm); font-weight: var(--font-weight-medium); - line-height: 20px; + line-height: var(--text-sm--line-height); letter-spacing: -0.02em; text-overflow: ellipsis; white-space: nowrap; @@ -201,13 +201,13 @@ .success { display: flex; flex-direction: column; - gap: 10px; + gap: var(--space-2_5); } .progressTitle { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .stack, @@ -215,17 +215,17 @@ .fileChildren { display: flex; flex-direction: column; - gap: 8px; + gap: var(--space-2); } .fileChildren { - padding-inline-start: 24px; + padding-inline-start: var(--space-6); } .selectionRow { display: flex; align-items: center; - gap: 8px; + gap: var(--space-2); } .disclosure { diff --git a/apps/ui/src/index.css b/apps/ui/src/index.css index 98c8fdca54..004bfa7add 100644 --- a/apps/ui/src/index.css +++ b/apps/ui/src/index.css @@ -11,7 +11,7 @@ pointer-events: none; } -@media ( max-width: 639px ) { +@media ( width < 640px ) { .studio-column-edge::before { content: none; } diff --git a/apps/ui/src/lib/theme/base.css b/apps/ui/src/lib/theme/base.css index 8448f78959..da21382ac3 100644 --- a/apps/ui/src/lib/theme/base.css +++ b/apps/ui/src/lib/theme/base.css @@ -30,7 +30,7 @@ body { font-family: var( --font-sans ); font-size: var( --text-sm ); - line-height: 20px; + line-height: var( --text-sm--line-height ); background-color: var( --chrome ); color: var( --foreground ); -webkit-font-smoothing: antialiased; diff --git a/apps/ui/src/lib/theme/tokens.css b/apps/ui/src/lib/theme/tokens.css index 4afeb56528..2c94db2cde 100644 --- a/apps/ui/src/lib/theme/tokens.css +++ b/apps/ui/src/lib/theme/tokens.css @@ -72,15 +72,29 @@ --radius-md: calc( var( --radius ) * 0.8 ); --radius-lg: var( --radius ); --radius-xl: calc( var( --radius ) * 1.4 ); + --radius-2xl: 1rem; + --radius-3xl: 1.5rem; + --radius-full: 9999px; --font-sans: 'Inter Variable', -apple-system, system-ui, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + --text-2xs: 0.6875rem; --text-xxs: 0.75rem; + --text-xxs--line-height: 1.1rem; --text-xs: 0.8125rem; + --text-xs--line-height: 1.25rem; --text-sm: 0.875rem; + --text-sm--line-height: 1.25rem; + --text-md: 0.9375rem; --text-base: 1rem; --text-xl: 1.125rem; + --text-2xl: 1.25rem; + --leading-none: 1; + --leading-tight: 1.25; + --leading-snug: 1.375; + --leading-normal: 1.5; + --leading-relaxed: 1.625; --font-weight-normal: 400; --font-weight-medium: 450; --font-weight-semibold: 600; @@ -88,6 +102,25 @@ --shadow-xs: 0 1px 2px 0 rgb( 0 0 0 / 5% ); --shadow-sm: 0 1px 3px 0 rgb( 0 0 0 / 10% ), 0 1px 2px -1px rgb( 0 0 0 / 10% ); --shadow-md: 0 4px 6px -1px rgb( 0 0 0 / 10% ), 0 2px 4px -2px rgb( 0 0 0 / 10% ); + --shadow-raised: 0 1px 3px rgb( 0 0 0 / 20% ); + + /* A 4px grid, numbered like Tailwind's spacing scale: `--space-1_5` is 1.5 × 4px. */ + --space-0_5: 2px; + --space-1: 4px; + --space-1_5: 6px; + --space-2: 8px; + --space-2_5: 10px; + --space-3: 12px; + --space-3_5: 14px; + --space-4: 16px; + --space-4_5: 18px; + --space-5: 20px; + --space-6: 24px; + --space-7: 28px; + --space-8: 32px; + --space-10: 40px; + --space-12: 48px; + --space-16: 64px; --focus-width: 2px; @@ -106,6 +139,14 @@ --motion-ease-layout: cubic-bezier( 0.645, 0.045, 0.355, 1 ); --motion-ease-enter: cubic-bezier( 0.165, 0.84, 0.44, 1 ); + /* Layers inside the workspace: a sticky row over its scroller, overlays and + handles over a pane, the band's separator over the panels, and the sidebar + opened over the content on a small window. */ + --z-sticky: 10; + --z-overlay: 20; + --z-band: 30; + --z-sidebar: 40; + /* Layers above the content, bottom to top. Toasts stay readable over a dialog; a drag in progress covers everything. */ --z-dialog: 700; @@ -147,6 +188,10 @@ --hover: var( --muted ); } +/* Media queries can't read custom properties, so the one breakpoint is written + out where it's used: `( width < 640px )`, a window too small for the sidebar + beside the content. */ + @media ( -webkit-min-device-pixel-ratio: 2 ), ( min-resolution: 192dpi ) { :root { --focus-width: 1.5px; diff --git a/apps/ui/src/lib/ui/alert/style.module.css b/apps/ui/src/lib/ui/alert/style.module.css index 9e27f9535f..35957b3548 100644 --- a/apps/ui/src/lib/ui/alert/style.module.css +++ b/apps/ui/src/lib/ui/alert/style.module.css @@ -5,15 +5,15 @@ position: relative; display: grid; grid-template-columns: minmax( 0, 1fr ) auto; - gap: 2px 8px; + gap: var( --space-0_5 ) var( --space-2 ); width: 100%; - padding: 8px 10px; + padding: var( --space-2 ) var( --space-2_5 ); border: 1px solid var( --border ); border-radius: var( --radius-lg ); background-color: var( --popover ); color: var( --popover-foreground ); font-size: var( --text-sm ); - line-height: 20px; + line-height: var( --text-sm--line-height ); text-align: start; } @@ -84,7 +84,7 @@ display: flex; grid-column: 1 / -1; flex-wrap: wrap; - gap: 8px; - margin-block-start: 6px; + gap: var( --space-2 ); + margin-block-start: var( --space-1_5 ); } } diff --git a/apps/ui/src/lib/ui/badge/style.module.css b/apps/ui/src/lib/ui/badge/style.module.css index 3ea536eb29..d2ebd73e8f 100644 --- a/apps/ui/src/lib/ui/badge/style.module.css +++ b/apps/ui/src/lib/ui/badge/style.module.css @@ -2,15 +2,15 @@ .badge { display: inline-flex; flex-shrink: 0; - gap: 4px; + gap: var( --space-1 ); align-items: center; justify-content: center; width: fit-content; height: 20px; overflow: hidden; - padding: 2px 8px; + padding: var( --space-0_5 ) var( --space-2 ); border: 1px solid transparent; - border-radius: 26px; + border-radius: var( --radius-full ); font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); white-space: nowrap; @@ -24,25 +24,25 @@ .badge[data-size='count'] { min-width: 20px; - padding-inline: 4px; - border-radius: 9999px; + padding-inline: var( --space-1 ); + border-radius: var( --radius-full ); font-variant-numeric: tabular-nums; } .badge[data-size='xs'] { - gap: 2px; + gap: var( --space-0_5 ); height: auto; - padding: 4px; + padding: var( --space-1 ); border: 0; border-radius: var( --radius-xs ); - font-size: 11px; - line-height: 1; + font-size: var( --text-2xs ); + line-height: var( --leading-none ); } .badge[data-size='icon'] { width: 24px; height: 24px; - padding: 4px; + padding: var( --space-1 ); border: 0; border-radius: var( --radius-xs ); } diff --git a/apps/ui/src/lib/ui/button/style.module.css b/apps/ui/src/lib/ui/button/style.module.css index f721f25d7e..d14fe416fd 100644 --- a/apps/ui/src/lib/ui/button/style.module.css +++ b/apps/ui/src/lib/ui/button/style.module.css @@ -4,7 +4,7 @@ display: inline-flex; flex-shrink: 0; - gap: 6px; + gap: var( --space-1_5 ); align-items: center; justify-content: center; max-width: 100%; @@ -16,7 +16,7 @@ background-clip: padding-box; font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); - line-height: 20px; + line-height: var( --text-xs--line-height ); white-space: nowrap; text-decoration: none; outline: none; @@ -80,16 +80,16 @@ } .button [data-dropdown-indicator] { - margin-inline: -4px -2px; + margin-inline: calc( var( --space-1 ) * -1 ) calc( var( --space-0_5 ) * -1 ); color: var( --muted-foreground ); } .button:has( > [data-icon='inline-start'] ) { - padding-inline-start: 8px; + padding-inline-start: var( --space-2 ); } .button:has( > [data-icon='inline-end'] ) { - padding-inline-end: 8px; + padding-inline-end: var( --space-2 ); } /* Variants. Hover only applies to enabled buttons. */ @@ -247,7 +247,7 @@ .button[data-size='2xs'] { --button-padding-inline: 6px; - gap: 4px; + gap: var( --space-1 ); height: 24px; border-radius: var( --radius-md ); } @@ -272,11 +272,11 @@ } .button[data-size='sm']:has( > [data-icon='inline-start'] ) { - padding-inline-start: 6px; + padding-inline-start: var( --space-1_5 ); } .button[data-size='sm']:has( > [data-icon='inline-end'] ) { - padding-inline-end: 6px; + padding-inline-end: var( --space-1_5 ); } .button[data-size='lg'] { @@ -343,14 +343,14 @@ } .button[data-shape='round'] { - border-radius: 9999px; + border-radius: var( --radius-full ); } .button[data-layout='row'] { justify-content: flex-start; width: 100%; height: auto; - padding-block: 8px; + padding-block: var( --space-2 ); text-align: start; white-space: normal; } diff --git a/apps/ui/src/lib/ui/checkbox/style.module.css b/apps/ui/src/lib/ui/checkbox/style.module.css index 86f1d7f58c..c499088f20 100644 --- a/apps/ui/src/lib/ui/checkbox/style.module.css +++ b/apps/ui/src/lib/ui/checkbox/style.module.css @@ -15,7 +15,7 @@ .checkbox::after { position: absolute; - inset: -8px -12px; + inset: calc( var( --space-2 ) * -1 ) calc( var( --space-3 ) * -1 ); content: ''; } diff --git a/apps/ui/src/lib/ui/code-block/style.module.css b/apps/ui/src/lib/ui/code-block/style.module.css index 5e2c6b261a..80f051c3a6 100644 --- a/apps/ui/src/lib/ui/code-block/style.module.css +++ b/apps/ui/src/lib/ui/code-block/style.module.css @@ -7,10 +7,10 @@ } .pre { - padding: 12px; + padding: var(--space-3); font-family: var(--font-mono); font-size: var(--text-xs); - line-height: 20px; + line-height: var(--text-xs--line-height); overflow-x: auto; -webkit-user-select: text; user-select: text; diff --git a/apps/ui/src/lib/ui/command/style.module.css b/apps/ui/src/lib/ui/command/style.module.css index 1dfbeecf67..f8aa91cbb1 100644 --- a/apps/ui/src/lib/ui/command/style.module.css +++ b/apps/ui/src/lib/ui/command/style.module.css @@ -1,7 +1,7 @@ @layer ui { /* Rows are rounded to sit inside a 24px surface, 10px in. */ .sheet { - padding: 10px; + padding: var( --space-2_5 ); } /* A sheet grows with its commands, up to the room above its anchor. */ @@ -15,18 +15,18 @@ max-height: 288px; overflow-x: hidden; overflow-y: auto; - scroll-padding-block: 4px; + scroll-padding-block: var( --space-1 ); outline: none; } .empty { - padding: 24px 0; + padding: var( --space-6 ) 0; font-size: var( --text-sm ); text-align: center; } .heading { - padding: 12px 8px 4px; + padding: var( --space-3 ) var( --space-2 ) var( --space-1 ); color: var( --muted-foreground ); font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); @@ -34,10 +34,10 @@ .item { display: flex; - gap: 6px; + gap: var( --space-1_5 ); align-items: center; height: 32px; - padding: 6px 8px; + padding: var( --space-1_5 ) var( --space-2 ); border-radius: var( --command-radius ); font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); @@ -66,7 +66,7 @@ .text { display: flex; flex: 1; - gap: 6px; + gap: var( --space-1_5 ); align-items: baseline; min-width: 0; } diff --git a/apps/ui/src/lib/ui/dialog/style.module.css b/apps/ui/src/lib/ui/dialog/style.module.css index ccdc147780..3f94e2c04d 100644 --- a/apps/ui/src/lib/ui/dialog/style.module.css +++ b/apps/ui/src/lib/ui/dialog/style.module.css @@ -28,15 +28,15 @@ left: 50%; z-index: var( --z-dialog ); display: grid; - gap: 16px; + gap: var( --space-4 ); width: calc( 100% - 2rem ); max-width: 384px; max-height: calc( 100dvh - 2rem ); overflow-y: auto; - padding: 16px; + padding: var( --space-4 ); border-radius: var( --radius-xl ); font-size: var( --text-sm ); - line-height: 20px; + line-height: var( --text-sm--line-height ); transform: translate( -50%, -50% ); transition-property: opacity, scale, filter; transition-duration: var( --motion-duration-layout ); @@ -74,7 +74,7 @@ .content[data-surface='composer'] { border: 1px solid var( --input ); - border-radius: 24px; + border-radius: var( --radius-3xl ); background-color: var( --composer ); box-shadow: none; color: var( --foreground ); @@ -86,7 +86,7 @@ .content[data-layout='confirmation'] { max-width: 420px; - padding: 20px; + padding: var( --space-5 ); } .content:is( [data-layout='settings'], [data-layout='creation'] ) { @@ -97,12 +97,12 @@ margin: auto; overflow: hidden; padding: 0; - border-radius: 16px; + border-radius: var( --radius-2xl ); transform: none; } .content[data-layout='settings'] { - inset: 70px 16px; + inset: 70px var( --space-4 ); max-width: 752px; max-height: 600px; } @@ -112,7 +112,7 @@ } .content[data-layout='creation'] { - inset: 16px; + inset: var( --space-4 ); gap: 0; max-width: 896px; height: calc( 100dvh - 2rem ); @@ -123,16 +123,16 @@ .panelHeader { flex-shrink: 0; align-items: center; - column-gap: 12px; + column-gap: var( --space-3 ); min-height: 60px; - padding: 14px 14px 14px 16px; + padding: var( --space-3_5 ) var( --space-3_5 ) var( --space-3_5 ) var( --space-4 ); } .header { display: grid; grid-template-columns: minmax( 0, 1fr ) auto; - row-gap: 8px; - margin: -16px -16px 0; + row-gap: var( --space-2 ); + margin: calc( var( --space-4 ) * -1 ) calc( var( --space-4 ) * -1 ) 0; } .header > [data-slot='dialog-title'] { @@ -150,9 +150,9 @@ } [data-layout='confirmation'] > .header { - margin: -20px -20px 0; + margin: calc( var( --space-5 ) * -1 ) calc( var( --space-5 ) * -1 ) 0; padding-block-end: 0; - padding-inline-start: 20px; + padding-inline-start: var( --space-5 ); } .title { @@ -161,7 +161,7 @@ [data-layout='settings'] .title { overflow: hidden; - font-weight: 500; + font-weight: var( --font-weight-medium ); text-overflow: ellipsis; white-space: nowrap; } @@ -172,7 +172,7 @@ } .description p + p { - margin-top: 8px; + margin-top: var( --space-2 ); } .description[data-tone='default'] { @@ -190,17 +190,17 @@ .footer { display: flex; - gap: 6px; + gap: var( --space-1_5 ); align-items: center; justify-content: flex-end; } [data-layout='confirmation'] > .footer { - margin: 8px -6px -6px; + margin: var( --space-2 ) calc( var( --space-1_5 ) * -1 ) calc( var( --space-1_5 ) * -1 ); } .footer[data-padding] { - padding: 12px; + padding: var( --space-3 ); } .footer[data-separator] { @@ -219,13 +219,13 @@ .panelTitle h1 { font-size: var( --text-sm ); font-weight: var( --font-weight-medium ); - line-height: 20px; + line-height: var( --text-sm--line-height ); } .panelActions { display: flex; flex-shrink: 0; - gap: 4px; + gap: var( --space-1 ); align-items: center; margin-inline-start: auto; } @@ -250,7 +250,7 @@ flex-direction: column; width: 100%; min-height: 100%; - padding: 0 16px 16px; + padding: 0 var( --space-4 ) var( --space-4 ); } .scrollArea { diff --git a/apps/ui/src/lib/ui/empty/style.module.css b/apps/ui/src/lib/ui/empty/style.module.css index df64e2ddd6..baba7ac62e 100644 --- a/apps/ui/src/lib/ui/empty/style.module.css +++ b/apps/ui/src/lib/ui/empty/style.module.css @@ -3,12 +3,12 @@ display: flex; flex: 1; flex-direction: column; - gap: 20px; + gap: var( --space-5 ); align-items: center; justify-content: center; width: 100%; min-width: 0; - padding: 24px; + padding: var( --space-6 ); text-align: center; text-wrap: balance; } @@ -16,7 +16,7 @@ .header { display: flex; flex-direction: column; - gap: 8px; + gap: var( --space-2 ); align-items: center; max-width: 384px; } @@ -24,7 +24,7 @@ .content { display: flex; flex-direction: column; - gap: 10px; + gap: var( --space-2_5 ); align-items: center; width: 100%; max-width: 384px; @@ -39,7 +39,7 @@ flex-shrink: 0; align-items: center; justify-content: center; - margin-block-end: 8px; + margin-block-end: var( --space-2 ); border-radius: var( --radius-lg ); background: var( --muted ); color: var( --foreground ); @@ -48,7 +48,7 @@ .title { font-size: var( --text-sm ); font-weight: var( --font-weight-medium ); - line-height: 20px; + line-height: var( --text-sm--line-height ); letter-spacing: -0.02em; } @@ -56,6 +56,6 @@ max-width: 384px; color: var( --muted-foreground ); font-size: var( --text-sm ); - line-height: 1.625; + line-height: var( --leading-relaxed ); } } diff --git a/apps/ui/src/lib/ui/field/style.module.css b/apps/ui/src/lib/ui/field/style.module.css index 4551b47501..c8666067e0 100644 --- a/apps/ui/src/lib/ui/field/style.module.css +++ b/apps/ui/src/lib/ui/field/style.module.css @@ -2,13 +2,13 @@ .set { display: flex; flex-direction: column; - gap: 8px; + gap: var( --space-2 ); min-width: 0; } .legend { - margin-block-end: 16px; - padding: 0 20px; + margin-block-end: var( --space-4 ); + padding: 0 var( --space-5 ); font-size: var( --text-base ); font-weight: var( --font-weight-medium ); } @@ -29,24 +29,24 @@ .group { display: flex; flex-direction: column; - gap: 24px; + gap: var( --space-6 ); width: 100%; } .group[data-variant='sections'] { - gap: 32px; + gap: var( --space-8 ); } .group[data-variant='inset'] { - gap: 16px; - padding: 14px; + gap: var( --space-4 ); + padding: var( --space-3_5 ); border-radius: var( --radius-md ); background-color: var( --background ); } .group[data-variant='settings'] { gap: 0; - padding: 20px; + padding: var( --space-5 ); border-radius: var( --radius-xl ); background-color: var( --muted ); } @@ -61,7 +61,7 @@ } .group[data-variant='settings'] > .field { - padding-block: 16px; + padding-block: var( --space-4 ); } .group[data-variant='settings'] > .field + .field { @@ -77,7 +77,7 @@ } .group[data-variant='settings'] > .field[data-orientation='horizontal'] { - gap: 24px; + gap: var( --space-6 ); } .group[data-variant='settings'] > .field > :last-child { @@ -90,7 +90,7 @@ .field { display: flex; - gap: 8px; + gap: var( --space-2 ); width: 100%; } @@ -111,9 +111,9 @@ display: flex; flex: 1; flex-direction: column; - gap: 2px; + gap: var( --space-0_5 ); min-width: 0; - line-height: 1.375; + line-height: var( --leading-snug ); } .title { @@ -122,11 +122,11 @@ width: fit-content; font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); - line-height: 1.375; + line-height: var( --leading-snug ); } .label { - gap: 8px; + gap: var( --space-2 ); } .label[data-tone='muted'] { @@ -138,7 +138,7 @@ color: var( --muted-foreground ); font-size: var( --text-xxs ); font-weight: var( --font-weight-normal ); - line-height: 1.1rem; + line-height: var( --text-xxs--line-height ); text-align: start; } @@ -167,7 +167,7 @@ .additional { display: block; - margin-top: 4px; + margin-top: var( --space-1 ); } .reserved { diff --git a/apps/ui/src/lib/ui/input-group/style.module.css b/apps/ui/src/lib/ui/input-group/style.module.css index 897d968973..e7efd74f6c 100644 --- a/apps/ui/src/lib/ui/input-group/style.module.css +++ b/apps/ui/src/lib/ui/input-group/style.module.css @@ -31,26 +31,26 @@ .group[data-variant='composer'] { border-color: var( --input ); - border-radius: 24px; + border-radius: var( --radius-3xl ); background-color: var( --composer ); color: var( --foreground ); } .group:has( > [data-align='inline-end'] ) > input { - padding-inline-end: 6px; + padding-inline-end: var( --space-1_5 ); } .group:has( > [data-align='inline-start'] ) > input { - padding-inline-start: 6px; + padding-inline-start: var( --space-1_5 ); } .addon { display: flex; - gap: 8px; + gap: var( --space-2 ); align-items: center; justify-content: center; height: auto; - padding-block: 6px; + padding-block: var( --space-1_5 ); color: var( --muted-foreground ); font-size: var( --text-sm ); font-weight: var( --font-weight-medium ); @@ -69,12 +69,12 @@ .addon[data-align='inline-start'] { order: -1; - padding-inline-start: 8px; + padding-inline-start: var( --space-2 ); } .addon[data-align='inline-end'] { order: 1; - padding-inline-end: 8px; + padding-inline-end: var( --space-2 ); } .addon[data-align='inline-start']:has( > button ) { diff --git a/apps/ui/src/lib/ui/input/style.module.css b/apps/ui/src/lib/ui/input/style.module.css index 05771747b8..7aacd48484 100644 --- a/apps/ui/src/lib/ui/input/style.module.css +++ b/apps/ui/src/lib/ui/input/style.module.css @@ -3,11 +3,11 @@ width: 100%; min-width: 0; height: var( --control-size ); - padding: 4px 10px; + padding: var( --space-1 ) var( --space-2_5 ); border: 1px solid var( --input ); border-radius: var( --radius-lg ); font-size: var( --text-sm ); - line-height: 20px; + line-height: var( --text-sm--line-height ); outline: none; } @@ -51,7 +51,7 @@ .adornment { position: absolute; top: 50%; - inset-inline-end: 4px; + inset-inline-end: var( --space-1 ); transform: translateY( -50% ); } } diff --git a/apps/ui/src/lib/ui/kbd/style.module.css b/apps/ui/src/lib/ui/kbd/style.module.css index f56e164a87..2bbce73021 100644 --- a/apps/ui/src/lib/ui/kbd/style.module.css +++ b/apps/ui/src/lib/ui/kbd/style.module.css @@ -1,13 +1,13 @@ @layer ui { .kbd { display: inline-flex; - gap: 4px; + gap: var( --space-1 ); align-items: center; justify-content: center; width: fit-content; min-width: 20px; height: 20px; - padding-inline: 4px; + padding-inline: var( --space-1 ); border-radius: var( --radius-sm ); background-color: var( --muted ); color: var( --muted-foreground ); @@ -31,7 +31,7 @@ .kbd[data-variant='settings'] { min-width: 24px; height: 24px; - padding-inline: 6px; + padding-inline: var( --space-1_5 ); border-radius: var( --radius-xs ); background-color: var( --secondary ); color: var( --foreground ); @@ -53,7 +53,7 @@ .group { display: inline-flex; - gap: 2px; + gap: var( --space-0_5 ); align-items: center; } } diff --git a/apps/ui/src/lib/ui/label/style.module.css b/apps/ui/src/lib/ui/label/style.module.css index d60f1b0a2d..c9a85df700 100644 --- a/apps/ui/src/lib/ui/label/style.module.css +++ b/apps/ui/src/lib/ui/label/style.module.css @@ -1,11 +1,11 @@ @layer ui { .label { display: flex; - gap: 8px; + gap: var( --space-2 ); align-items: center; font-size: var( --text-sm ); font-weight: var( --font-weight-medium ); - line-height: 1; + line-height: var( --leading-none ); user-select: none; } } diff --git a/apps/ui/src/lib/ui/menu/style.module.css b/apps/ui/src/lib/ui/menu/style.module.css index 57a1d8cd7a..4d1e35dfb5 100644 --- a/apps/ui/src/lib/ui/menu/style.module.css +++ b/apps/ui/src/lib/ui/menu/style.module.css @@ -28,17 +28,17 @@ .shortcut { margin-inline-start: auto; - padding-inline-start: 12px; + padding-inline-start: var( --space-3 ); color: var( --muted-foreground ); font-size: var( --text-xs ); letter-spacing: 0.1em; } .groupLabel { - padding: 4px 6px; + padding: var( --space-1 ) var( --space-1_5 ); color: var( --muted-foreground ); font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); - line-height: 20px; + line-height: var( --text-xs--line-height ); } } diff --git a/apps/ui/src/lib/ui/popover/style.module.css b/apps/ui/src/lib/ui/popover/style.module.css index c7791f3647..9af17b6e88 100644 --- a/apps/ui/src/lib/ui/popover/style.module.css +++ b/apps/ui/src/lib/ui/popover/style.module.css @@ -12,11 +12,11 @@ max-height: var( --available-height ); overflow: hidden; border: 1px solid var( --input ); - border-radius: 24px; + border-radius: var( --radius-3xl ); background-color: var( --composer ); color: var( --foreground ); font-size: var( --text-sm ); - line-height: 20px; + line-height: var( --text-sm--line-height ); outline: none; transform-origin: bottom; } diff --git a/apps/ui/src/lib/ui/progress/style.module.css b/apps/ui/src/lib/ui/progress/style.module.css index 6bd77764b5..e314a1b084 100644 --- a/apps/ui/src/lib/ui/progress/style.module.css +++ b/apps/ui/src/lib/ui/progress/style.module.css @@ -2,7 +2,7 @@ .root { display: flex; flex-wrap: wrap; - gap: 12px; + gap: var( --space-3 ); } .track { @@ -12,7 +12,7 @@ width: 100%; height: 4px; overflow-x: hidden; - border-radius: 9999px; + border-radius: var( --radius-full ); background-color: var( --muted ); } diff --git a/apps/ui/src/lib/ui/resize-handle/style.module.css b/apps/ui/src/lib/ui/resize-handle/style.module.css index 4ae28daf8f..6abb597e59 100644 --- a/apps/ui/src/lib/ui/resize-handle/style.module.css +++ b/apps/ui/src/lib/ui/resize-handle/style.module.css @@ -1,6 +1,6 @@ .resizeHandle { width: 8px; - z-index: 20; + z-index: var(--z-overlay); display: flex; align-items: stretch; justify-content: center; diff --git a/apps/ui/src/lib/ui/select/style.module.css b/apps/ui/src/lib/ui/select/style.module.css index 3d215bd5ea..8fb6535595 100644 --- a/apps/ui/src/lib/ui/select/style.module.css +++ b/apps/ui/src/lib/ui/select/style.module.css @@ -23,7 +23,7 @@ .value { display: flex; flex: 1; - gap: 6px; + gap: var( --space-1_5 ); align-items: center; overflow: hidden; text-align: start; @@ -48,12 +48,12 @@ .item { width: 100%; - padding-inline-end: 32px; + padding-inline-end: var( --space-8 ); } .item[data-described] { align-items: flex-start; - padding-block: 8px; + padding-block: var( --space-2 ); } .item svg:not( [data-size] ) { @@ -65,7 +65,7 @@ display: flex; flex: 1; flex-direction: column; - gap: 2px; + gap: var( --space-0_5 ); min-width: 0; } @@ -73,7 +73,7 @@ display: flex; flex: 1; flex-shrink: 0; - gap: 8px; + gap: var( --space-2 ); white-space: nowrap; } @@ -85,7 +85,7 @@ .indicator { position: absolute; - inset-inline-end: 8px; + inset-inline-end: var( --space-2 ); display: flex; align-items: center; justify-content: center; @@ -97,12 +97,12 @@ .arrow { position: sticky; bottom: 0; - z-index: 10; + z-index: var( --z-sticky ); display: flex; align-items: center; justify-content: center; width: 100%; - padding-block: 4px; + padding-block: var( --space-1 ); background-color: var( --popover ); cursor: default; } diff --git a/apps/ui/src/lib/ui/slider/style.module.css b/apps/ui/src/lib/ui/slider/style.module.css index c66e92a061..32a17ae801 100644 --- a/apps/ui/src/lib/ui/slider/style.module.css +++ b/apps/ui/src/lib/ui/slider/style.module.css @@ -21,7 +21,7 @@ flex-grow: 1; height: 6px; overflow: hidden; - border-radius: 9999px; + border-radius: var( --radius-full ); background-color: var( --border ); } @@ -37,7 +37,7 @@ width: 16px; height: 16px; border: 1px solid var( --accent-text ); - border-radius: 9999px; + border-radius: var( --radius-full ); background-color: var( --accent-text ); outline: none; transition: box-shadow var( --motion-duration-feedback ); @@ -45,7 +45,7 @@ .thumb::after { position: absolute; - inset: -8px; + inset: calc( var( --space-2 ) * -1 ); content: ''; } diff --git a/apps/ui/src/lib/ui/surface/style.module.css b/apps/ui/src/lib/ui/surface/style.module.css index 75e81bfc8f..a5682a5f8d 100644 --- a/apps/ui/src/lib/ui/surface/style.module.css +++ b/apps/ui/src/lib/ui/surface/style.module.css @@ -14,7 +14,7 @@ } .padded { - padding: 6px; + padding: var( --space-1_5 ); } .motion { @@ -48,14 +48,14 @@ .item { position: relative; display: flex; - gap: 6px; + gap: var( --space-1_5 ); align-items: center; min-height: 32px; - padding: 6px 8px; + padding: var( --space-1_5 ) var( --space-2 ); border-radius: var( --radius-md ); font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); - line-height: 20px; + line-height: var( --text-xs--line-height ); cursor: default; outline: none; user-select: none; @@ -78,12 +78,12 @@ .separator { height: 1px; - margin: 6px 8px; + margin: var( --space-1_5 ) var( --space-2 ); background-color: var( --border ); } .groupLabel { - padding: 4px 6px; + padding: var( --space-1 ) var( --space-1_5 ); color: var( --muted-foreground ); font-size: var( --text-xs ); font-weight: var( --font-weight-medium ); diff --git a/apps/ui/src/lib/ui/switch/style.module.css b/apps/ui/src/lib/ui/switch/style.module.css index 4abf38e7f3..55a96863f1 100644 --- a/apps/ui/src/lib/ui/switch/style.module.css +++ b/apps/ui/src/lib/ui/switch/style.module.css @@ -8,7 +8,7 @@ height: 20px; padding: 1px; border: 1px solid transparent; - border-radius: 9999px; + border-radius: var( --radius-full ); background-color: var( --border ); cursor: pointer; outline: none; @@ -17,7 +17,7 @@ .switch::after { position: absolute; - inset: -8px -12px; + inset: calc( var( --space-2 ) * -1 ) calc( var( --space-3 ) * -1 ); content: ''; } @@ -46,7 +46,7 @@ display: block; width: 16px; height: 16px; - border-radius: 9999px; + border-radius: var( --radius-full ); background-color: var( --background ); box-shadow: var( --shadow-sm ); pointer-events: none; diff --git a/apps/ui/src/lib/ui/tabs/style.module.css b/apps/ui/src/lib/ui/tabs/style.module.css index 79bf54aeac..e3e19de5c7 100644 --- a/apps/ui/src/lib/ui/tabs/style.module.css +++ b/apps/ui/src/lib/ui/tabs/style.module.css @@ -1,7 +1,7 @@ @layer ui { .tabs { display: flex; - gap: 8px; + gap: var( --space-2 ); } .tabs[data-orientation='horizontal'] { @@ -44,7 +44,7 @@ align-items: center; align-self: flex-start; height: 36px; - padding: 0 2px; + padding: 0 var( --space-0_5 ); border-radius: var( --radius-lg ); background-color: var( --muted ); } @@ -59,13 +59,13 @@ gap: 1px; width: 100%; min-width: 0; - padding: 12px; + padding: var( --space-3 ); } .trigger { position: relative; display: inline-flex; - gap: 6px; + gap: var( --space-1_5 ); align-items: center; border-radius: var( --radius-md ); color: var( --foreground ); @@ -92,7 +92,7 @@ [data-variant='scope'] > .trigger { height: 30px; - padding: 2px 10px; + padding: var( --space-0_5 ) var( --space-2_5 ); color: var( --muted-foreground ); font-weight: var( --font-weight-medium ); } @@ -103,7 +103,7 @@ [data-variant='sidebar'] > .trigger { height: 36px; - padding: 2px 8px; + padding: var( --space-0_5 ) var( --space-2 ); text-align: start; } diff --git a/apps/ui/src/lib/ui/textarea/style.module.css b/apps/ui/src/lib/ui/textarea/style.module.css index 8e697f2a53..033ba2bb61 100644 --- a/apps/ui/src/lib/ui/textarea/style.module.css +++ b/apps/ui/src/lib/ui/textarea/style.module.css @@ -3,11 +3,11 @@ display: flex; width: 100%; min-height: 64px; - padding: 8px 10px; + padding: var( --space-2 ) var( --space-2_5 ); border: 1px solid var( --input ); border-radius: var( --radius-lg ); font-size: var( --text-sm ); - line-height: 20px; + line-height: var( --text-sm--line-height ); outline: none; field-sizing: content; } diff --git a/apps/ui/src/lib/ui/tooltip/style.module.css b/apps/ui/src/lib/ui/tooltip/style.module.css index fc7033977a..9324891508 100644 --- a/apps/ui/src/lib/ui/tooltip/style.module.css +++ b/apps/ui/src/lib/ui/tooltip/style.module.css @@ -6,22 +6,22 @@ .content { display: inline-flex; - gap: 6px; + gap: var( --space-1_5 ); align-items: center; width: fit-content; max-width: 320px; - padding: 4px 8px; + padding: var( --space-1 ) var( --space-2 ); border-radius: var( --radius-sm ); background-color: var( --foreground ); color: var( --background ); font-size: var( --text-xxs ); - line-height: 1.25; + line-height: var( --leading-tight ); transform-origin: var( --transform-origin ); transition: opacity var( --motion-duration-feedback ) var( --motion-ease-enter ); } .content:has( [data-slot='kbd'] ) { - padding-inline-end: 4px; + padding-inline-end: var( --space-1 ); } .content:is( [data-starting-style], [data-ending-style] ) { From 002f9518c437f0dd2238062e396e578381a97695 Mon Sep 17 00:00:00 2001 From: Riad Benguella Date: Sun, 25 Oct 2026 11:44:23 +0100 Subject: [PATCH 02/10] Agentic UI: Share CSS recipes and keyframes, and size icons without a global svg rule Co-Authored-By: Claude Opus 5.5 --- apps/ui/README.md | 3 +- apps/ui/src/app/app-providers.tsx | 9 +++-- .../account/user-menu/style.module.css | 9 +---- .../src/features/annotations/style.module.css | 10 +---- .../session-view/composer/style.module.css | 33 +++-------------- .../conversation/style.module.css | 16 ++------ .../queued-prompts/style.module.css | 4 +- .../chats/session-view/style.module.css | 3 +- .../notice-card/style.module.css | 2 - .../notice-history/style.module.css | 11 +----- .../welcome-dialog/style.module.css | 6 +-- .../settings/settings-view/style.module.css | 12 ++---- .../sharing/share-dialog/style.module.css | 10 +---- .../collapsed-site-switcher/style.module.css | 5 --- .../sidebar/sidebar-header/style.module.css | 3 +- .../sidebar/site-list/style.module.css | 27 +++----------- .../blueprint-gallery.module.css | 4 +- .../add-site-dialog/connect-panel.module.css | 8 ++-- .../sites/add-site-dialog/import-panel.tsx | 2 +- .../sites/add-site-dialog/style.module.css | 4 +- .../sites/design-system-view/style.module.css | 9 +---- .../sites/site-preview/style.module.css | 24 +++--------- .../stopped-site-preview/style.module.css | 7 +--- .../sync/publish-panel/style.module.css | 12 ++---- apps/ui/src/lib/icons/README.md | 2 +- apps/ui/src/lib/icons/annotate-icon.tsx | 4 +- apps/ui/src/lib/icons/annotation-icon.tsx | 4 +- apps/ui/src/lib/icons/appearance-icon.tsx | 2 +- apps/ui/src/lib/icons/archive-icon.tsx | 4 +- apps/ui/src/lib/icons/arrow-left-icon.tsx | 4 +- apps/ui/src/lib/icons/arrow-right-icon.tsx | 4 +- apps/ui/src/lib/icons/bell-icon.tsx | 2 +- apps/ui/src/lib/icons/chat-icon.tsx | 4 +- apps/ui/src/lib/icons/claude-icon.tsx | 9 ++++- apps/ui/src/lib/icons/database-icon.tsx | 2 +- apps/ui/src/lib/icons/duplicate-icon.tsx | 2 +- .../src/lib/icons/exit-full-screen-icon.tsx | 2 +- apps/ui/src/lib/icons/export-icon.tsx | 2 +- apps/ui/src/lib/icons/export-site-icon.tsx | 2 +- apps/ui/src/lib/icons/external-link-icon.tsx | 4 +- apps/ui/src/lib/icons/folder-icon.tsx | 2 +- apps/ui/src/lib/icons/globe-icon.tsx | 4 +- apps/ui/src/lib/icons/import-icon.tsx | 2 +- apps/ui/src/lib/icons/intelligence-icon.tsx | 2 +- apps/ui/src/lib/icons/keyboard-icon.tsx | 2 +- apps/ui/src/lib/icons/language-icon.tsx | 4 +- apps/ui/src/lib/icons/link-icon.tsx | 4 +- apps/ui/src/lib/icons/mcp-icon.tsx | 2 +- apps/ui/src/lib/icons/needs-input-icon.tsx | 4 +- apps/ui/src/lib/icons/new-chat-icon.tsx | 2 +- apps/ui/src/lib/icons/php-icon.tsx | 2 +- apps/ui/src/lib/icons/pin-icon.tsx | 4 +- apps/ui/src/lib/icons/rename-icon.tsx | 2 +- apps/ui/src/lib/icons/rotate-cw-icon.tsx | 4 +- apps/ui/src/lib/icons/share-icon.tsx | 2 +- apps/ui/src/lib/icons/sidebar-icon.tsx | 2 + apps/ui/src/lib/icons/site-settings-icon.tsx | 2 +- apps/ui/src/lib/icons/skills-icon.tsx | 2 +- apps/ui/src/lib/icons/start-site-icon.tsx | 4 +- .../src/lib/icons/stop-other-sites-icon.tsx | 2 +- apps/ui/src/lib/icons/stop-site-icon.tsx | 4 +- apps/ui/src/lib/icons/sync-icon.tsx | 2 +- apps/ui/src/lib/icons/terminal-icon.tsx | 2 +- apps/ui/src/lib/icons/trash-icon.tsx | 2 +- apps/ui/src/lib/icons/unpin-icon.tsx | 4 +- apps/ui/src/lib/icons/wordpress-icon.tsx | 9 ++++- apps/ui/src/lib/theme/base.css | 15 ++++---- apps/ui/src/lib/theme/recipes.module.css | 37 +++++++++++++++++++ apps/ui/src/lib/ui/alert/style.module.css | 2 - apps/ui/src/lib/ui/button/style.module.css | 5 --- apps/ui/src/lib/ui/command/style.module.css | 4 +- .../src/lib/ui/input-group/style.module.css | 5 --- .../src/lib/ui/marquee-label/style.module.css | 8 +--- .../src/lib/ui/preview-frame/style.module.css | 7 +--- apps/ui/src/lib/ui/select/style.module.css | 5 --- apps/ui/src/lib/ui/skeleton/style.module.css | 8 +--- apps/ui/src/lib/ui/spinner/style.module.css | 8 +--- apps/ui/src/lib/ui/tabs/style.module.css | 2 - 78 files changed, 179 insertions(+), 290 deletions(-) create mode 100644 apps/ui/src/lib/theme/recipes.module.css diff --git a/apps/ui/README.md b/apps/ui/README.md index 3d065f0f9b..23c635af1e 100644 --- a/apps/ui/README.md +++ b/apps/ui/README.md @@ -82,7 +82,8 @@ UI is built on Base UI with its own primitives and theme. Icons come from `lucid The theme lives in `src/lib/theme/`: - `tokens.css`: every design token, below. -- `base.css`: the page and element defaults (fonts, body, headings, icon size, reduced motion and transparency). +- `base.css`: the page and element defaults (fonts, body, headings, shared keyframes, reduced motion and transparency). +- `recipes.module.css`: declaration groups that components pull in with `composes` (truncation, the band's hairline, the image outline, the dot on an icon). - `index.ts`: applies the color scheme and the Appearance settings to the root; `accent-contrast.ts` and `color.ts` keep the accent readable; `motion.ts` reads the motion tokens from script. `tokens.css` defines every token the UI uses: diff --git a/apps/ui/src/app/app-providers.tsx b/apps/ui/src/app/app-providers.tsx index e4969ff690..6cdf9bea92 100644 --- a/apps/ui/src/app/app-providers.tsx +++ b/apps/ui/src/app/app-providers.tsx @@ -1,6 +1,7 @@ import { QueryClientProvider } from '@tanstack/react-query'; import { defaultI18n } from '@wordpress/i18n'; import { I18nProvider } from '@wordpress/react-i18n'; +import { LucideProvider } from 'lucide-react'; import { useLayoutEffect } from 'react'; import { ConnectorProvider, queryClient } from '@/data/core'; import { useColorScheme } from '@/data/host/use-color-scheme'; @@ -48,9 +49,11 @@ function ThemedApp( { children }: PropsWithChildren ) { [ colorScheme, accentColor, tintIntensity, contrast ] ); return ( - - { children } - + + + { children } + + ); } diff --git a/apps/ui/src/features/account/user-menu/style.module.css b/apps/ui/src/features/account/user-menu/style.module.css index 5e4eeca373..508ae905f4 100644 --- a/apps/ui/src/features/account/user-menu/style.module.css +++ b/apps/ui/src/features/account/user-menu/style.module.css @@ -47,18 +47,13 @@ line-height: 1.25; } -.accountName, -.accountEmail { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - .accountName { + composes: truncate from '@/lib/theme/recipes.module.css'; font-weight: var(--font-weight-medium); } .accountEmail { + composes: truncate from '@/lib/theme/recipes.module.css'; color: var(--muted-foreground); } diff --git a/apps/ui/src/features/annotations/style.module.css b/apps/ui/src/features/annotations/style.module.css index cccb0ab82c..3d37c218ba 100644 --- a/apps/ui/src/features/annotations/style.module.css +++ b/apps/ui/src/features/annotations/style.module.css @@ -38,6 +38,7 @@ } .image { + composes: imageOutline from '@/lib/theme/recipes.module.css'; position: relative; width: 48px; height: 48px; @@ -45,15 +46,6 @@ background-color: var(--muted); } -.image::after { - position: absolute; - inset: 0; - border-radius: inherit; - box-shadow: inset 0 0 0 1px var(--border); - content: ''; - pointer-events: none; -} - .image img { width: 100%; height: 100%; diff --git a/apps/ui/src/features/chats/session-view/composer/style.module.css b/apps/ui/src/features/chats/session-view/composer/style.module.css index c5d07b1d1c..df7d96f928 100644 --- a/apps/ui/src/features/chats/session-view/composer/style.module.css +++ b/apps/ui/src/features/chats/session-view/composer/style.module.css @@ -31,11 +31,9 @@ } .noticeMessage { + composes: truncate from '@/lib/theme/recipes.module.css'; flex: 1; min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } @keyframes submitShake { @@ -128,6 +126,7 @@ } .attachment { + composes: imageOutline from '@/lib/theme/recipes.module.css'; position: relative; display: flex; background-color: var(--muted); @@ -136,16 +135,6 @@ user-select: none; } -/* The border sits inside the tile so images keep their full size. */ -.attachment::after { - position: absolute; - inset: 0; - border-radius: inherit; - box-shadow: inset 0 0 0 1px var(--border); - content: ''; - pointer-events: none; -} - .attachmentImage { width: 96px; height: 96px; @@ -172,8 +161,6 @@ .attachmentFile svg:not([data-size]) { flex: none; - width: 16px; - height: 16px; } .attachmentThumb { @@ -184,10 +171,8 @@ } .attachmentName { + composes: truncate from '@/lib/theme/recipes.module.css'; min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } .attachmentRemove { @@ -266,21 +251,17 @@ } .attachmentHoverName { - overflow: hidden; + composes: truncate from '@/lib/theme/recipes.module.css'; font-size: var(--text-xxs); font-weight: var(--font-weight-semibold); line-height: 1.25; - text-overflow: ellipsis; - white-space: nowrap; } .attachmentHoverMeta { - overflow: hidden; + composes: truncate from '@/lib/theme/recipes.module.css'; color: var(--muted-foreground); font-size: 11px; line-height: 1.2; - text-overflow: ellipsis; - white-space: nowrap; } .inputArea { @@ -301,16 +282,14 @@ } .placeholder { + composes: truncate from '@/lib/theme/recipes.module.css'; position: absolute; top: 14px; right: 14px; left: 14px; - overflow: hidden; color: var(--muted-foreground); font-size: var(--text-sm); line-height: 20px; - text-overflow: ellipsis; - white-space: nowrap; pointer-events: none; } diff --git a/apps/ui/src/features/chats/session-view/conversation/style.module.css b/apps/ui/src/features/chats/session-view/conversation/style.module.css index e86d657e86..1bbe92a797 100644 --- a/apps/ui/src/features/chats/session-view/conversation/style.module.css +++ b/apps/ui/src/features/chats/session-view/conversation/style.module.css @@ -35,9 +35,7 @@ } .annotationElementText { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + composes: truncate from '@/lib/theme/recipes.module.css'; } .userTextRow, @@ -158,9 +156,7 @@ } .userAttachmentName { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + composes: truncate from '@/lib/theme/recipes.module.css'; } .activity { @@ -188,13 +184,11 @@ } .activityProgress { + composes: truncate from '@/lib/theme/recipes.module.css'; color: var(--muted-foreground); font-size: var(--text-xs); line-height: 20px; opacity: 0.8; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } .traceLine { @@ -213,10 +207,8 @@ } .traceTitle { + composes: truncate from '@/lib/theme/recipes.module.css'; min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } .traceTrigger { diff --git a/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css b/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css index 3173e3a24c..61df99454f 100644 --- a/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css +++ b/apps/ui/src/features/chats/session-view/queued-prompts/style.module.css @@ -29,12 +29,10 @@ } .text { + composes: truncate from '@/lib/theme/recipes.module.css'; flex: 1; min-width: 0; - overflow: hidden; color: var(--muted-foreground); - text-overflow: ellipsis; - white-space: nowrap; } .actions { diff --git a/apps/ui/src/features/chats/session-view/style.module.css b/apps/ui/src/features/chats/session-view/style.module.css index f194701260..82a39687b5 100644 --- a/apps/ui/src/features/chats/session-view/style.module.css +++ b/apps/ui/src/features/chats/session-view/style.module.css @@ -18,6 +18,7 @@ } .header { + composes: bandEdge from '@/lib/theme/recipes.module.css'; display: flex; align-items: center; gap: 4px; @@ -25,8 +26,6 @@ height: var(--band-height); transition: padding var(--motion-duration-layout) var(--motion-ease-layout); background-color: var(--chrome); - box-shadow: inset 0 calc(-1 * 1px) 0 - var(--border); font-size: var(--text-xxs); color: var(--foreground); -webkit-app-region: drag; diff --git a/apps/ui/src/features/notifications/notice-card/style.module.css b/apps/ui/src/features/notifications/notice-card/style.module.css index 418a9c3e30..cbb7a41b5c 100644 --- a/apps/ui/src/features/notifications/notice-card/style.module.css +++ b/apps/ui/src/features/notifications/notice-card/style.module.css @@ -142,8 +142,6 @@ } .chevron svg { - width: 16px; - height: 16px; transition: rotate var(--motion-duration-layout) var(--motion-ease-layout); } diff --git a/apps/ui/src/features/notifications/notice-history/style.module.css b/apps/ui/src/features/notifications/notice-history/style.module.css index 6de34876a8..8ce772fbbf 100644 --- a/apps/ui/src/features/notifications/notice-history/style.module.css +++ b/apps/ui/src/features/notifications/notice-history/style.module.css @@ -1,20 +1,13 @@ .bell { + composes: dotted from '@/lib/theme/recipes.module.css'; position: relative; } -.bell:has(.dot) svg { - mask-image: radial-gradient(circle at calc(100% - 2px) 2px, transparent 5.5px, #000 6px); -} - .dot { - position: absolute; + composes: dot from '@/lib/theme/recipes.module.css'; /* Inside the button's 1px border. */ inset-block-start: 7.5px; inset-inline-end: 7.5px; - width: 7px; - height: 7px; - border-radius: 50%; - background-color: var(--accent); pointer-events: none; } diff --git a/apps/ui/src/features/onboarding/welcome-dialog/style.module.css b/apps/ui/src/features/onboarding/welcome-dialog/style.module.css index 73f45e1f06..38db68c11f 100644 --- a/apps/ui/src/features/onboarding/welcome-dialog/style.module.css +++ b/apps/ui/src/features/onboarding/welcome-dialog/style.module.css @@ -53,8 +53,6 @@ .perksList svg { flex: none; - width: 16px; - height: 16px; } .perksList b { @@ -97,10 +95,8 @@ } .accountName { + composes: truncate from '@/lib/theme/recipes.module.css'; font-weight: var(--font-weight-medium); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } .accountHint { diff --git a/apps/ui/src/features/settings/settings-view/style.module.css b/apps/ui/src/features/settings/settings-view/style.module.css index 955af2f2a2..e87dd87acc 100644 --- a/apps/ui/src/features/settings/settings-view/style.module.css +++ b/apps/ui/src/features/settings/settings-view/style.module.css @@ -100,15 +100,13 @@ outline-offset: 2px; } -.pathPickerValue, -.pathPickerPlaceholder { +.pathPickerValue { + composes: truncate from '@/lib/theme/recipes.module.css'; min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } .pathPickerPlaceholder { + composes: pathPickerValue; color: var(--muted-foreground); } @@ -251,12 +249,10 @@ .previewLink { + composes: truncate from '@/lib/theme/recipes.module.css'; max-width: 100%; - overflow: hidden; color: var(--accent-text); text-align: start; - text-overflow: ellipsis; - white-space: nowrap; cursor: pointer; } diff --git a/apps/ui/src/features/sharing/share-dialog/style.module.css b/apps/ui/src/features/sharing/share-dialog/style.module.css index cb3b4ad064..e009193e64 100644 --- a/apps/ui/src/features/sharing/share-dialog/style.module.css +++ b/apps/ui/src/features/sharing/share-dialog/style.module.css @@ -44,6 +44,7 @@ } .frame { + composes: imageOutline from '@/lib/theme/recipes.module.css'; position: relative; display: flex; align-items: center; @@ -54,15 +55,6 @@ background: var(--muted); } -.frame::after { - content: ''; - position: absolute; - inset: 0; - border-radius: inherit; - box-shadow: inset 0 0 0 1px var(--border); - pointer-events: none; -} - .frame img { width: 100%; height: 100%; diff --git a/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css b/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css index 540bc67dd1..87e7bda98b 100644 --- a/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css +++ b/apps/ui/src/features/sidebar/collapsed-site-switcher/style.module.css @@ -22,11 +22,6 @@ padding-block-end: 8px; } -.surface svg { - width: 16px; - height: 16px; -} - .openSidebarCta { display: flex; align-items: center; diff --git a/apps/ui/src/features/sidebar/sidebar-header/style.module.css b/apps/ui/src/features/sidebar/sidebar-header/style.module.css index cba8cd3897..89cbcba1f4 100644 --- a/apps/ui/src/features/sidebar/sidebar-header/style.module.css +++ b/apps/ui/src/features/sidebar/sidebar-header/style.module.css @@ -1,6 +1,7 @@ /* The sidebar's part of the workspace's top band: the app menu (Windows and Linux) and the sidebar toggle at its start, past the macOS traffic lights. */ .root { + composes: bandEdge from '@/lib/theme/recipes.module.css'; --toggle-start: var(--traffic-light-space); display: flex; align-items: center; @@ -8,8 +9,6 @@ height: var(--band-height); flex-shrink: 0; padding-inline: var(--traffic-light-space) 12px; - box-shadow: inset 0 calc(-1 * 1px) 0 - var(--border); -webkit-app-region: drag; /* Stay pinned while the sidebar scrolls. Opaque background so scrolling content doesn't bleed through. */ diff --git a/apps/ui/src/features/sidebar/site-list/style.module.css b/apps/ui/src/features/sidebar/site-list/style.module.css index 4152d7b21e..e1277fc70a 100644 --- a/apps/ui/src/features/sidebar/site-list/style.module.css +++ b/apps/ui/src/features/sidebar/site-list/style.module.css @@ -86,6 +86,7 @@ } .siteIcon { + composes: dotted from '@/lib/theme/recipes.module.css'; position: relative; display: inline-flex; flex-shrink: 0; @@ -96,18 +97,10 @@ height: 16px; } -.siteIcon:has(.runningDot) > svg { - mask-image: radial-gradient(circle at calc(100% - 2px) 2px, transparent 5.5px, #000 6px); -} - .runningDot { - position: absolute; + composes: dot from '@/lib/theme/recipes.module.css'; top: -1.5px; right: -1.5px; - width: 7px; - height: 7px; - border-radius: 50%; - background-color: var(--accent); } .siteText { @@ -200,12 +193,10 @@ } .siteName { + composes: truncate from '@/lib/theme/recipes.module.css'; --shimmer-highlight: var(--muted-foreground); color: var(--foreground); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; max-width: 100%; } @@ -395,7 +386,7 @@ height: 16px; border-radius: var(--radius-md); background-color: var(--muted); - animation: skeletonPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + animation: global(studio-pulse) 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } .skeleton:first-child { @@ -408,12 +399,6 @@ margin-inline: var(--site-list-row-padding); } -@keyframes skeletonPulse { - 50% { - opacity: 0.5; - } -} - .chatRow { position: relative; display: flex; @@ -467,13 +452,11 @@ } .chatTitle { + composes: truncate from '@/lib/theme/recipes.module.css'; --shimmer-highlight: var(--muted-foreground); flex: 1 1 auto; min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; text-align: start; } diff --git a/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css b/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css index cd382dd7f9..3e50999bd8 100644 --- a/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css +++ b/apps/ui/src/features/sites/add-site-dialog/blueprint-gallery.module.css @@ -38,10 +38,8 @@ } .cardTitle { + composes: truncate from '@/lib/theme/recipes.module.css'; min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } .image { diff --git a/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css b/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css index be19bcd88f..802e782ba2 100644 --- a/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css +++ b/apps/ui/src/features/sites/add-site-dialog/connect-panel.module.css @@ -127,14 +127,12 @@ min-width: 0; } -.siteName, -.siteUrl { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; +.siteName { + composes: truncate from '@/lib/theme/recipes.module.css'; } .siteUrl { + composes: siteName; color: var(--muted-foreground); font-weight: var(--font-weight-normal); } diff --git a/apps/ui/src/features/sites/add-site-dialog/import-panel.tsx b/apps/ui/src/features/sites/add-site-dialog/import-panel.tsx index eb056120ca..360d8c07bb 100644 --- a/apps/ui/src/features/sites/add-site-dialog/import-panel.tsx +++ b/apps/ui/src/features/sites/add-site-dialog/import-panel.tsx @@ -95,7 +95,7 @@ export function BackupDropZone( { onFile }: { onFile: ( file: File ) => void } ) handleFile( event.dataTransfer.files[ 0 ] ); } } > - +

{ __( 'Drop a WordPress backup here.' ) }

-icon.tsx`, re-exported from `index.ts`. - Drawn the same way as lucide: a 24px grid, `stroke="currentColor"`, `strokeWidth="2"`, round caps and joins, `aria-hidden`. -- Size and color come from CSS: `base.css` sizes icons, and `data-keep-size` opts out. +- Icons render at 16px, like lucide's under the app's `LucideProvider`; a component's CSS (or `size` on a lucide icon) sets another size. Color comes from CSS. diff --git a/apps/ui/src/lib/icons/annotate-icon.tsx b/apps/ui/src/lib/icons/annotate-icon.tsx index 0523d46d8d..825a660a5f 100644 --- a/apps/ui/src/lib/icons/annotate-icon.tsx +++ b/apps/ui/src/lib/icons/annotate-icon.tsx @@ -3,8 +3,8 @@ import type { ComponentProps } from 'react'; export function AnnotateIcon( props: ComponentProps< 'svg' > ) { return ( ) { return ( ) { return ( -