Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

@smooai/ui — One design system, every runtime

Smoo AIlicensesmoo.ai open source

OKLCH tokensno_std, zero depsRust binding, in-repo

What it is · Feature tour · Quickstart · Honest status · client-shared · Platform


"Smoo green" should never depend on which runtime painted it. This repo holds the canonical Smoo AI design source — one CSS file of OKLCH tokens + base component classes, the smoo monogram, and a JSON token export — under shared/, with language bindings that embed those files at build time. Today that means one shipped binding: Rust (smooai-ui, consumed by smooblue as a git dependency); a TypeScript package lives in the SmooAI/smooai monorepo and other bindings are planned, not built.

What is this?

Smoo AI runs on more than one UI runtime — apps/web (Next.js / Tailwind), smooblue (Dioxus desktop), observability-studio (Dioxus viewer). Without a single source of truth, brand colors drift silently between them.

This repo is that source of truth:

  • shared/styles.css — the canonical OKLCH tokens + base component CSS (~425 lines). This file is the design system.
  • shared/monogram.svg — the smoo monogram, fill="currentColor".
  • shared/tokens.json — the tokens as plain JSON, and the input the Rust constants are generated from: rust/build.rs runs shared/tokens_codegen.rs over it at build time, so a token cannot exist in the design system and be missing from Rust. shared/tokens_css_check.rs then asserts it agrees with styles.css in both directions. A future binding in any language reads the same file.
  • rust/ — the smooai-ui crate: include_str! constants over the shared files, plus a mirrored tokens::* module for non-DOM frameworks. Zero dependencies, no_std.
%%{init: {'theme':'base','themeVariables':{
'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart LR
subgraph SRC["shared/ — canonical source"]
CSS["styles.css<br/>OKLCH tokens + base CSS"]
SVG["monogram.svg"]
JSON["tokens.json<br/>the token source"]
end
CSS -->|"include_str!"| RS["rust/ — smooai-ui crate<br/>STYLES · MONOGRAM_SVG · tokens::*"]
SVG -->|"include_str!"| RS
JSON -->|"build.rs codegen"| RS
RS -->|"git dependency"| BLUE["smooblue<br/>(Dioxus desktop)"]
CSS -.->|"planned bindings"| FUT["TS · .NET · Python · Go"]
classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
class CSS warm
class RS,BLUE teal
Loading

Feature tour

WhatWhere
🎨Canonical OKLCH tokens + base CSSshared/styles.csssmooai_ui::STYLES
🟢Token values as Rust constantssmooai_ui::tokens::* for egui / native chrome / charts
🔤The smoo monogramshared/monogram.svgsmooai_ui::MONOGRAM_SVG
🧪Drift-detector testscargo test -p smooai-ui fails if consts and CSS diverge

🎨 The canonical stylesheet

shared/styles.css carries the whole system — dark mode is the only mode, and every color is a token:

  • OKLCH brand palette--color-smooai-orange, --color-smooai-red, --color-smooai-green, the blue scale, the dark-blue scale
  • Semantic tokens--background, --foreground, --card, --muted, --border, --ring, --sidebar
  • Brand gradient--gradient-brand (the signature orange→red 135° gradient)
  • Geometry--radius, spacing scale, type stack
  • Base components — the .btn family, .card, .fab, .modal__sheet, .rail, .brand-badge, input classes
  • Reset + base + scrollbars

In a Dioxus app, inject it once at the root (real API — this is the whole integration):

use dioxus::prelude::*;fnApp() -> Element{rsx!{// Inject the canonical brand stylesheet once at the root component.
style {"{smooai_ui::STYLES}"}// Use the BEM classes everywhere.
div { class:"card",
button { class:"btn btn--primary","Save"}}}}

🟢 Tokens outside the DOM

For non-DOM frameworks (egui, iced, native menus, chart libraries), reference token values directly — mirrored from the CSS and guarded by the drift test:

let accent = smooai_ui::tokens::SMOOAI_GREEN;// "oklch(0.657 0.112 194.8)"let bg = smooai_ui::tokens::BACKGROUND;// "oklch(0.145 0.014 265)"let grad = smooai_ui::tokens::GRADIENT_BRAND;// orange→red 135° gradient stringlet radius = smooai_ui::tokens::RADIUS_PX;// 10

🔤 The monogram

MONOGRAM_SVG ships with fill="currentColor" so surrounding CSS controls the color. Pair with .brand-badge for the gradient pill backdrop:

rsx!{
div {
class:"brand-badge",
style:"width:32px;height:32px;",
dangerous_inner_html:"{smooai_ui::MONOGRAM_SVG}",}}

🧪 Drift detection

The tokens constants are generated from shared/tokens.json, so they cannot fall behind it. What still needs checking is the CSS, and the check runs in both directions:

cd rust && cargo test# tokens_match_css — each token equals the RESOLVED value of its custom# property in :root (var() references followed), not# merely "appears somewhere in the file"# css_colors_are_all_tokens — every colour :root declares has a token, so a new# colour can't reach the CSS and no language binding# semantic_classes_exist — .btn, .btn--primary, .card, .rail, .brand-badge, …

CI (.github/workflows/rust.yml) runs cargo fmt --check, clippy --all-targets -D warnings, the tests, a module-tree check (no .rs file unreachable from a mod declaration), and the shared/ drift gate below.


Quickstart (Rust)

smooai-ui is not published to crates.io. Consume it as a git dependency — this is exactly how smooblue consumes it today:

[dependencies]
smooai-ui = { git = "https://github.com/SmooAI/ui.git", branch = "main" }

The crate is a pure pub const &'static str carrier: zero dependencies, no_std, so it never pins your UI framework's version.


Status

The honest per-language picture — one binding exists, the rest are direction, not code:

LanguagePackageStatus
Rustsmooai-uiIn-repo, working — consumed by smooblue via git dependency. Not published to crates.io.
TypeScript@smooai/ui🚧 Lives today inside the SmooAI/smooai monorepo at packages/ui; graduating here is aspirational
.NETSmooAI.Ui📦 Planned — no code exists
Pythonsmooai-ui📦 Planned — no code exists
Gogithub.com/SmooAI/ui/go📦 Planned — no code exists

Relationship to client-shared

This repo owns the design system. SmooAI/client-shared is an auth library and carries no copy of it.

It used to. client-shared declared itself this crate's successor and kept a byte-identical shared/, with a CI gate here failing if the two diverged. That arrangement is retired: an org-wide search found nothing imported client_shared::ui — its only consumer, the th CLI, builds features = ["auth"] and never touched the design half. So the duplicate was deleted at the source rather than policed forever, and the gate went with it.

The duplication was not hypothetical. The two copies had already diverged: the monogram fix in f230808 ("restore the inner 'S' curve and the dot") never crossed, so client-shared served a monogram with no S and no dot, and its styles.css lost the whole .input family. Nothing was red. Deleting the copy removes the failure mode instead of detecting it.

Design changes land here, and only here. Consumers today are observability-studio and smooblue.

Versioning

Per-language packages share the same semver line so consumers can correlate versions across runtimes.

BumpTriggers
PatchToken value tweaks, CSS rule additions, bug fixes
MinorNew tokens, new component classes, new monogram variants — additive only
MajorToken renames, removed classes, breaking layout assumptions

🧩 Part of Smoo AI

@smooai/ui is built and open-sourced by Smoo AI — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.

🤝 Contributing

PRs welcome. Keep this surface narrow — only add a token or class when at least two apps need it. Design-system changes land here — this repo is the single source. Add tokens to shared/tokens.json (the Rust constants generate from it) rather than to the CSS alone.

📄 License

MIT — see LICENSE.


Built by Smoo AI — AI built into every product.

About

SmooAI cross-language design system — shared tokens, CSS, monogram for Rust + TS + .NET + Python + Go

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages