@rackbops/styles 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/all.css +14 -0
  2. package/arcane-obsidian/base.css +46 -0
  3. package/arcane-obsidian/components/alert.css +28 -0
  4. package/arcane-obsidian/components/badge.css +33 -0
  5. package/arcane-obsidian/components/button.css +73 -0
  6. package/arcane-obsidian/components/card.css +14 -0
  7. package/arcane-obsidian/components/dialog.css +31 -0
  8. package/arcane-obsidian/components/eyebrow.css +12 -0
  9. package/arcane-obsidian/components/form.css +70 -0
  10. package/arcane-obsidian/components/link.css +46 -0
  11. package/arcane-obsidian/components/progress.css +40 -0
  12. package/arcane-obsidian/components/table.css +27 -0
  13. package/arcane-obsidian/components/tabs.css +45 -0
  14. package/arcane-obsidian/components/tabstrip.css +35 -0
  15. package/arcane-obsidian/components/wordmark.css +23 -0
  16. package/arcane-obsidian/design.md +133 -0
  17. package/arcane-obsidian/index.css +16 -0
  18. package/arcane-obsidian/tokens.css +81 -0
  19. package/arcane-parchment/base.css +46 -0
  20. package/arcane-parchment/components/alert.css +28 -0
  21. package/arcane-parchment/components/badge.css +33 -0
  22. package/arcane-parchment/components/button.css +75 -0
  23. package/arcane-parchment/components/card.css +14 -0
  24. package/arcane-parchment/components/dialog.css +31 -0
  25. package/arcane-parchment/components/eyebrow.css +12 -0
  26. package/arcane-parchment/components/form.css +70 -0
  27. package/arcane-parchment/components/link.css +46 -0
  28. package/arcane-parchment/components/progress.css +40 -0
  29. package/arcane-parchment/components/table.css +27 -0
  30. package/arcane-parchment/components/tabs.css +45 -0
  31. package/arcane-parchment/components/tabstrip.css +35 -0
  32. package/arcane-parchment/components/wordmark.css +23 -0
  33. package/arcane-parchment/design.md +89 -0
  34. package/arcane-parchment/index.css +16 -0
  35. package/arcane-parchment/tokens.css +78 -0
  36. package/luminous-precision/base.css +58 -0
  37. package/luminous-precision/components/alert.css +26 -0
  38. package/luminous-precision/components/badge.css +19 -0
  39. package/luminous-precision/components/button.css +88 -0
  40. package/luminous-precision/components/card.css +12 -0
  41. package/luminous-precision/components/dialog.css +31 -0
  42. package/luminous-precision/components/form.css +126 -0
  43. package/luminous-precision/components/link.css +46 -0
  44. package/luminous-precision/components/progress.css +41 -0
  45. package/luminous-precision/components/table.css +28 -0
  46. package/luminous-precision/components/tabs.css +33 -0
  47. package/luminous-precision/design.md +124 -0
  48. package/luminous-precision/index.css +13 -0
  49. package/luminous-precision/tokens.css +89 -0
  50. package/manifest.json +39 -0
  51. package/neon-butterfly/assets/butterfly-circuit.png +0 -0
  52. package/neon-butterfly/base.css +49 -0
  53. package/neon-butterfly/components/alert.css +26 -0
  54. package/neon-butterfly/components/badge.css +17 -0
  55. package/neon-butterfly/components/button.css +54 -0
  56. package/neon-butterfly/components/card.css +11 -0
  57. package/neon-butterfly/components/dialog.css +29 -0
  58. package/neon-butterfly/components/form.css +124 -0
  59. package/neon-butterfly/components/link.css +55 -0
  60. package/neon-butterfly/components/progress.css +41 -0
  61. package/neon-butterfly/components/table.css +27 -0
  62. package/neon-butterfly/components/tabs.css +33 -0
  63. package/neon-butterfly/design.md +103 -0
  64. package/neon-butterfly/index.css +13 -0
  65. package/neon-butterfly/tokens.css +89 -0
  66. package/package.json +60 -0
  67. package/rackbops-noir/base.css +53 -0
  68. package/rackbops-noir/components/alert.css +30 -0
  69. package/rackbops-noir/components/badge.css +39 -0
  70. package/rackbops-noir/components/button.css +79 -0
  71. package/rackbops-noir/components/card.css +37 -0
  72. package/rackbops-noir/components/dialog.css +33 -0
  73. package/rackbops-noir/components/eyebrow.css +21 -0
  74. package/rackbops-noir/components/form.css +70 -0
  75. package/rackbops-noir/components/link.css +31 -0
  76. package/rackbops-noir/components/principle.css +31 -0
  77. package/rackbops-noir/components/progress.css +40 -0
  78. package/rackbops-noir/components/rack.css +93 -0
  79. package/rackbops-noir/components/table.css +31 -0
  80. package/rackbops-noir/components/tabs.css +45 -0
  81. package/rackbops-noir/components/tag.css +20 -0
  82. package/rackbops-noir/design.md +85 -0
  83. package/rackbops-noir/index.css +17 -0
  84. package/rackbops-noir/tokens.css +66 -0
  85. package/rackbops-studio/assets/boppy.svg +17 -0
  86. package/rackbops-studio/base.css +53 -0
  87. package/rackbops-studio/components/alert.css +30 -0
  88. package/rackbops-studio/components/badge.css +39 -0
  89. package/rackbops-studio/components/button.css +78 -0
  90. package/rackbops-studio/components/card.css +37 -0
  91. package/rackbops-studio/components/dialog.css +33 -0
  92. package/rackbops-studio/components/eyebrow.css +21 -0
  93. package/rackbops-studio/components/form.css +70 -0
  94. package/rackbops-studio/components/link.css +31 -0
  95. package/rackbops-studio/components/principle.css +31 -0
  96. package/rackbops-studio/components/progress.css +40 -0
  97. package/rackbops-studio/components/rack.css +94 -0
  98. package/rackbops-studio/components/table.css +31 -0
  99. package/rackbops-studio/components/tabs.css +45 -0
  100. package/rackbops-studio/components/tag.css +20 -0
  101. package/rackbops-studio/design.md +157 -0
  102. package/rackbops-studio/index.css +17 -0
  103. package/rackbops-studio/tokens.css +77 -0
  104. package/summer-cloud/base.css +58 -0
  105. package/summer-cloud/components/alert.css +29 -0
  106. package/summer-cloud/components/badge.css +49 -0
  107. package/summer-cloud/components/button.css +109 -0
  108. package/summer-cloud/components/card.css +35 -0
  109. package/summer-cloud/components/dialog.css +30 -0
  110. package/summer-cloud/components/form.css +146 -0
  111. package/summer-cloud/components/link.css +60 -0
  112. package/summer-cloud/components/progress.css +43 -0
  113. package/summer-cloud/components/table.css +34 -0
  114. package/summer-cloud/components/tabs.css +38 -0
  115. package/summer-cloud/design.md +165 -0
  116. package/summer-cloud/index.css +13 -0
  117. package/summer-cloud/tokens.css +103 -0
@@ -0,0 +1,45 @@
1
+ /* arcane-parchment — tabs
2
+ * The active tab carries accent text + a faint wash, and the ONE gradient is
3
+ * rationed here as a 2px underline indicator — the console's signature flair. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabs {
5
+ display: flex;
6
+ gap: var(--rb-space-2);
7
+ border-bottom: 1px solid var(--rb-border);
8
+ }
9
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab {
10
+ position: relative;
11
+ padding: var(--rb-space-2) var(--rb-space-4);
12
+ background: transparent;
13
+ border: 0;
14
+ color: var(--rb-text-soft);
15
+ font-family: var(--rb-font-body);
16
+ font-weight: var(--rb-font-weight-medium);
17
+ font-size: var(--rb-text-sm);
18
+ cursor: pointer;
19
+ transition: color var(--rb-transition);
20
+ }
21
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab:hover {
22
+ color: var(--rb-text);
23
+ }
24
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab.rb-tab--active {
25
+ color: var(--rb-accent);
26
+ }
27
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab.rb-tab--active::after {
28
+ content: "";
29
+ position: absolute;
30
+ left: var(--rb-space-3);
31
+ right: var(--rb-space-3);
32
+ bottom: -1px;
33
+ height: 2px;
34
+ border-radius: 2px 2px 0 0;
35
+ background: var(--rb-accent-grad);
36
+ }
37
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabpanel {
38
+ padding: var(--rb-space-4) 0;
39
+ }
40
+
41
+ @media (prefers-reduced-motion: reduce) {
42
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab {
43
+ transition: none;
44
+ }
45
+ }
@@ -0,0 +1,35 @@
1
+ /* arcane-parchment — tabstrip (theme extra)
2
+ * The console's top-level view nav: natural-width bordered pill buttons.
3
+ * The active button gets accent text + a faint wash and an accent-tinted
4
+ * border; distinct from the text-underline .rb-tabs used inside a panel. */
5
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip {
6
+ display: flex;
7
+ gap: var(--rb-space-2);
8
+ padding: var(--rb-space-2) 0;
9
+ }
10
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab {
11
+ position: relative;
12
+ padding: var(--rb-space-2) var(--rb-space-4);
13
+ background: var(--rb-surface-2);
14
+ border: 1px solid var(--rb-border);
15
+ border-radius: var(--rb-radius);
16
+ color: var(--rb-text);
17
+ font-size: var(--rb-text-sm);
18
+ font-weight: var(--rb-font-weight-medium);
19
+ cursor: pointer;
20
+ transition: border-color var(--rb-transition);
21
+ }
22
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab:hover {
23
+ border-color: var(--rb-accent);
24
+ }
25
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab.rb-tabstrip__tab--active {
26
+ color: var(--rb-accent);
27
+ border-color: color-mix(in srgb, var(--rb-accent) 40%, var(--rb-border));
28
+ background: var(--rb-accent-wash);
29
+ }
30
+
31
+ @media (prefers-reduced-motion: reduce) {
32
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab {
33
+ transition: none;
34
+ }
35
+ }
@@ -0,0 +1,23 @@
1
+ /* arcane-parchment — wordmark (theme extra)
2
+ * The brand voice: a mono display h1 with the ONE gradient clipped into the
3
+ * text, and a solid-accent spark mark that stays un-clipped. This and the
4
+ * active tab underline are the only two places the gradient is spent. */
5
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-wordmark {
6
+ display: inline-flex;
7
+ align-items: baseline;
8
+ gap: 0.4em;
9
+ margin: 0;
10
+ font-family: var(--rb-font-display);
11
+ font-weight: var(--rb-font-weight-medium);
12
+ font-size: 15px;
13
+ letter-spacing: var(--rb-heading-tracking);
14
+ background-image: var(--rb-accent-grad);
15
+ background-clip: text;
16
+ -webkit-background-clip: text;
17
+ color: transparent;
18
+ -webkit-text-fill-color: transparent;
19
+ }
20
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-wordmark__spark {
21
+ color: var(--rb-accent);
22
+ -webkit-text-fill-color: var(--rb-accent);
23
+ }
@@ -0,0 +1,89 @@
1
+ # arcane-parchment
2
+
3
+ The light, AA-tuned counterpart of **arcane-obsidian** — artifact-console's
4
+ "Parchment" scheme. Same developer-console language (monospace display voice over
5
+ a `system-ui` body, tabular numerals, the sole arcane-violet accent, the one
6
+ rationed violet→gold gradient, flat shadow-based depth) rendered on a cool
7
+ off-white ground instead of obsidian. It ships the identical `rb-*` component set
8
+ as arcane-obsidian — the components are token-driven, so only the palette differs
9
+ — and swaps in with a single attribute flip. Derived from artifact-console#31.
10
+
11
+ ## Color
12
+
13
+ Palette values match artifact-console's light scheme. Unlike the studio themes,
14
+ the arcane accent (a darker violet) stays **above WCAG AA as text on white**
15
+ (~5.5:1), so accent labels, body text, and the muted ramp all clear AA. The one
16
+ exception — inherited from artifact-console itself — is the semantic chip colours
17
+ (`--rb-success/--rb-warning/...`) used as small text on their faint tint, which
18
+ sit below 4.5:1; treat those as status accents, not body copy.
19
+
20
+ | Role | Value | Usage |
21
+ | --- | --- | --- |
22
+ | Background | `#f6f7f9` (cool parchment) | Page canvas |
23
+ | Surface | `#ffffff` | Cards, header, panels |
24
+ | Surface 2 | `#f1f3f7` | Raised/hover surface, active-tab wash base |
25
+ | Surface sunken | `#edeff3` | Inset fields, log wells, progress troughs |
26
+ | Text | `#191d26` | Body text |
27
+ | Text soft | `#4a5261` | Secondary text |
28
+ | Text faint | `#5f6b7d` | Labels, headers, meta (tuned darker than report's `#7c8598` for AA) |
29
+ | Border | `#e2e6ec` | Resting hairline borders |
30
+ | Border strong | `#cbd2dc` | Dialog edges, header rules |
31
+ | Accent | `#6a4fe0` (arcane-violet) | The sole brand voice: emphasis, active state, focus (~5.5:1 on white) |
32
+ | Accent fg | `#ffffff` | White on the solid violet fill |
33
+ | Accent wash | `rgba(106,79,224,.12)` | Active/hover tint behind accent text |
34
+ | Info | `#1e6fd0` | Informational chips |
35
+ | Success | `#1f9d57` | Healthy/live status |
36
+ | Warning | `#c07d12` | Caution status |
37
+ | Danger | `#d64550` | Destructive actions, errors |
38
+
39
+ **Rules.** Colour is functional. Resting UI is parchment, white, and faint;
40
+ violet appears only on interaction, focus, active state, and emphasis. Colour
41
+ beyond the accent is *earned* — severity and status chips are the one place other
42
+ hues appear. Muted-on-surface is tuned to clear WCAG AA (4.5:1) on every surface.
43
+
44
+ ## Typography
45
+
46
+ Identical to arcane-obsidian: monospace display voice (the wordmark, weight 600,
47
+ tracking `-0.01em`) over a `system-ui` body (weight 400); `tabular-nums` wherever
48
+ data is shown; mono uppercase labels tracked `0.06em`.
49
+
50
+ ## Shape & effects
51
+
52
+ - Radius `0.4375rem` (7px) for buttons/inputs/rows; `0.75rem` (12px) for cards
53
+ and dialogs; pills for chips/badges and progress troughs.
54
+ - Flat, shadow-based depth: a two-step light shadow ramp (`--rb-shadow-sm`
55
+ resting, `--rb-shadow-lg` for dialogs/raised cards). No glow.
56
+ - Focus is the accent: inputs swap to a violet border + a soft `--rb-accent-wash`
57
+ ring; interactive elements take a 2px accent outline.
58
+ - The **one gradient** (`--rb-accent-grad`, violet → orchid → gold) is rationed
59
+ to the wordmark and the active-tab underline only; primary buttons stay a solid
60
+ accent fill.
61
+ - Transitions `0.15s`; every animation respects `prefers-reduced-motion`.
62
+ - 4px spacing rhythm.
63
+
64
+ ## Components
65
+
66
+ Class prefix `rb-`; the full arcane-obsidian inventory, styled identically from
67
+ tokens: `.rb-wordmark` (+ `__spark`), `.rb-btn` (+ `--primary/--accent/--danger/--ghost`),
68
+ `.rb-card` (+ `--raised`), `.rb-link`, the form set, `.rb-badge`, `.rb-alert`,
69
+ `.rb-dialog`, `.rb-tabs`, `.rb-tabstrip`, `.rb-table` (+ `.rb-num`),
70
+ `.rb-progress` / `.rb-spinner`, `.rb-eyebrow`. See arcane-obsidian's `design.md`
71
+ for the per-component notes — the behaviour is the same; only the palette is light.
72
+
73
+ ## Code syntax
74
+
75
+ Tokens `--rb-code-*` (a per-theme extra), light-tuned for AA on the parchment
76
+ ground: violet keywords, dark-green strings, dark-amber numbers, info-blue
77
+ functions, dark-violet types, rose variables, dimmed comments/meta.
78
+
79
+ ## Dark counterpart
80
+
81
+ `arcane-obsidian` — the primary, dark look. This theme and it share the same
82
+ `--rb-*` baseline and `rb-*` classes, so switching `data-rb-style` between them
83
+ restyles a page without touching markup.
84
+
85
+ ## Scoping
86
+
87
+ Every rule is guarded by `data-rb-style="arcane-parchment"` (self or ancestor),
88
+ wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a page
89
+ or on a container for an embedded island.
@@ -0,0 +1,16 @@
1
+ /* arcane-parchment — full theme entry point */
2
+ @import "./tokens.css";
3
+ @import "./base.css";
4
+ @import "./components/button.css";
5
+ @import "./components/card.css";
6
+ @import "./components/link.css";
7
+ @import "./components/form.css";
8
+ @import "./components/badge.css";
9
+ @import "./components/alert.css";
10
+ @import "./components/dialog.css";
11
+ @import "./components/tabs.css";
12
+ @import "./components/table.css";
13
+ @import "./components/progress.css";
14
+ @import "./components/eyebrow.css";
15
+ @import "./components/wordmark.css";
16
+ @import "./components/tabstrip.css";
@@ -0,0 +1,78 @@
1
+ /* arcane-parchment — design tokens
2
+ * The light, AA-tuned counterpart of arcane-obsidian: artifact-console's
3
+ * "Parchment" scheme. Same structure, class contract, and component CSS as
4
+ * arcane-obsidian (token-driven) — only the palette and code colours differ.
5
+ * Consume via:
6
+ * @import "@rackbops/styles/arcane-parchment/tokens";
7
+ * or pull the whole theme with ./index.css.
8
+ *
9
+ * Nothing applies until an element carries data-rb-style="arcane-parchment".
10
+ * Every theme declares the same baseline token set (styles/test enforces
11
+ * parity); names marked (extra) are additions this theme's own component CSS
12
+ * may rely on. Palette values match artifact-console's light scheme.
13
+ */
14
+ :where([data-rb-style="arcane-parchment"]) {
15
+ color-scheme: light;
16
+
17
+ /* color — cool off-white parchment, white raised surfaces */
18
+ --rb-bg: #f6f7f9;
19
+ --rb-surface: #ffffff;
20
+ --rb-surface-2: #f1f3f7;
21
+ --rb-surface-sunken: #edeff3; /* inset fields, log wells */
22
+ --rb-text: #191d26;
23
+ --rb-text-soft: #4a5261;
24
+ --rb-text-faint: #5f6b7d; /* tuned darker than report's #7c8598 so muted-on-surface clears AA */
25
+ --rb-border: #e2e6ec;
26
+ --rb-border-strong: #cbd2dc;
27
+
28
+ /* accent — arcane-violet, the sole brand voice (darker on light for AA) */
29
+ --rb-accent: #6a4fe0;
30
+ --rb-accent-fg: #ffffff; /* white on the solid violet fill */
31
+ --rb-accent-wash: rgba(106, 79, 224, 0.12);
32
+
33
+ /* the ONE gradient — rationed to wordmark + active tab only */
34
+ --rb-accent-grad: linear-gradient(120deg, #6a4fe0, #a25be0 46%, #d99a2a);
35
+
36
+ /* semantic — earned: severity/status only */
37
+ --rb-info: #1e6fd0;
38
+ --rb-success: #1f9d57;
39
+ --rb-warning: #c07d12;
40
+ --rb-danger: #d64550;
41
+
42
+ /* code syntax (extra) — light-tuned; only this theme renders code */
43
+ --rb-code-keyword: #6a4fe0;
44
+ --rb-code-string: #0f7a3d;
45
+ --rb-code-number: #9a6400;
46
+ --rb-code-comment: #7c8598;
47
+ --rb-code-function: #1e6fd0;
48
+ --rb-code-variable: #c2255c;
49
+ --rb-code-type: #7a3ecc;
50
+ --rb-code-meta: #5f6b7d;
51
+
52
+ /* typography — monospace display voice over a system-ui body; tabular numerals */
53
+ --rb-font-display: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
54
+ --rb-font-body: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
55
+ --rb-font-mono: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
56
+ --rb-font-weight: 400;
57
+ --rb-font-weight-medium: 600;
58
+ --rb-font-weight-bold: 700;
59
+ --rb-heading-tracking: -0.01em;
60
+ --rb-label-tracking: 0.06em;
61
+ --rb-text-sm: 13px;
62
+
63
+ /* shape & effects — flat, compact console radii; soft light shadows */
64
+ --rb-radius: 0.4375rem; /* 7px */
65
+ --rb-radius-lg: 0.75rem; /* 12px */
66
+ --rb-radius-pill: 999px;
67
+ --rb-shadow-sm: 0 1px 2px rgba(20, 25, 40, 0.06);
68
+ --rb-shadow-lg: 0 6px 24px rgba(20, 25, 40, 0.1);
69
+ --rb-blur: 12px;
70
+ --rb-transition: 0.15s;
71
+
72
+ /* spacing — 4px rhythm */
73
+ --rb-space-1: 0.25rem;
74
+ --rb-space-2: 0.5rem;
75
+ --rb-space-3: 0.75rem;
76
+ --rb-space-4: 1rem;
77
+ --rb-space-5: 1.5rem;
78
+ }
@@ -0,0 +1,58 @@
1
+ /* luminous-precision — base styles
2
+ * Scoped defaults. Requires tokens.css. Apps that need webfonts should
3
+ * include the Google Fonts <link>s for Sora (500, 600, 700) and
4
+ * JetBrains Mono (400, 600, 700) or self-host; the token stacks fall back
5
+ * to system families.
6
+ *
7
+ * The element carrying data-rb-style is the theme's canvas: it gets the
8
+ * background, text color, and body font — whether that is <html> for a page
9
+ * or a mount container for an embedded island. Page-only rules (body margin,
10
+ * viewport height) apply only when the attribute sits on <html>.
11
+ */
12
+ :where([data-rb-style="luminous-precision"]) {
13
+ background-color: var(--rb-bg);
14
+ color: var(--rb-text);
15
+ font-family: var(--rb-font-body);
16
+ font-weight: var(--rb-font-weight);
17
+ }
18
+
19
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *),
20
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *)::before,
21
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *)::after {
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ :where(html[data-rb-style="luminous-precision"]) body {
26
+ margin: 0;
27
+ min-height: 100vh;
28
+ background-color: var(--rb-bg);
29
+ color: var(--rb-text);
30
+ font-family: var(--rb-font-body);
31
+ font-weight: var(--rb-font-weight);
32
+ }
33
+
34
+ /* Opt-in page background: soft out-of-focus orchid/teal underlays over the
35
+ * obsidian base — the "luminous underlay" treatment. Apply to <body>, or to
36
+ * the attributed container itself. */
37
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-bg {
38
+ background:
39
+ radial-gradient(50rem 30rem at 12% -5%, rgba(198, 165, 255, 0.08), transparent 70%),
40
+ radial-gradient(55rem 35rem at 90% 105%, rgba(0, 245, 255, 0.05), transparent 70%),
41
+ var(--rb-bg);
42
+ background-attachment: fixed;
43
+ }
44
+
45
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(h1, h2, h3, h4, h5, h6) {
46
+ font-family: var(--rb-font-display);
47
+ font-weight: var(--rb-font-weight-medium);
48
+ letter-spacing: var(--rb-heading-tracking);
49
+ }
50
+
51
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(a) {
52
+ color: var(--rb-accent);
53
+ }
54
+
55
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *)::selection {
56
+ background: var(--rb-accent);
57
+ color: var(--rb-bg);
58
+ }
@@ -0,0 +1,26 @@
1
+ /* luminous-precision — alert / callout */
2
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert {
3
+ padding: var(--rb-space-3) var(--rb-space-4);
4
+ background: var(--rb-surface-glass);
5
+ border: 1px solid var(--rb-border);
6
+ border-left-width: 3px;
7
+ border-radius: var(--rb-radius);
8
+ backdrop-filter: blur(var(--rb-blur));
9
+ color: var(--rb-text);
10
+ font-size: var(--rb-text-sm);
11
+ }
12
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--info { border-left-color: var(--rb-info); }
13
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--success { border-left-color: var(--rb-success); }
14
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--warning { border-left-color: var(--rb-warning); }
15
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--danger { border-left-color: var(--rb-danger); }
16
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert__title {
17
+ display: block;
18
+ margin-bottom: var(--rb-space-1);
19
+ text-transform: uppercase;
20
+ font-weight: var(--rb-font-weight-medium);
21
+ letter-spacing: var(--rb-label-tracking);
22
+ }
23
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--info .rb-alert__title { color: var(--rb-info); }
24
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--success .rb-alert__title { color: var(--rb-success); }
25
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--warning .rb-alert__title { color: var(--rb-warning); }
26
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--danger .rb-alert__title { color: var(--rb-danger); }
@@ -0,0 +1,19 @@
1
+ /* luminous-precision — badge: pill chip, 15% tint of its hue behind
2
+ * full-saturation text */
3
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge {
4
+ display: inline-block;
5
+ padding: 0.15rem var(--rb-space-2);
6
+ background: rgba(255, 255, 255, 0.08);
7
+ border: none;
8
+ border-radius: 9999px;
9
+ color: var(--rb-text-faint);
10
+ text-transform: uppercase;
11
+ font-size: 11px;
12
+ font-weight: var(--rb-font-weight-medium);
13
+ letter-spacing: var(--rb-label-tracking);
14
+ }
15
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--primary { background: rgba(198, 165, 255, 0.15); color: var(--rb-accent); }
16
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--info { background: rgba(131, 183, 255, 0.15); color: var(--rb-info); }
17
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--success { background: rgba(71, 227, 78, 0.15); color: var(--rb-success); }
18
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--warning { background: rgba(255, 184, 108, 0.15); color: var(--rb-warning); }
19
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--danger { background: rgba(255, 77, 109, 0.15); color: var(--rb-danger); }
@@ -0,0 +1,88 @@
1
+ /* luminous-precision — button */
2
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: var(--rb-space-2);
6
+ padding: var(--rb-space-2) var(--rb-space-3);
7
+ background: transparent;
8
+ border: 1px solid var(--rb-border-strong);
9
+ border-radius: var(--rb-radius);
10
+ color: var(--rb-text);
11
+ text-transform: uppercase;
12
+ font-family: var(--rb-font-mono);
13
+ font-weight: var(--rb-font-weight-medium);
14
+ font-size: var(--rb-text-sm);
15
+ letter-spacing: var(--rb-label-tracking);
16
+ cursor: pointer;
17
+ transition:
18
+ border-color var(--rb-transition),
19
+ color var(--rb-transition),
20
+ box-shadow var(--rb-transition);
21
+ }
22
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:hover,
23
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:focus-visible {
24
+ border-color: var(--rb-accent-border);
25
+ color: var(--rb-accent);
26
+ animation: rb-lp-pulse-glow 2s infinite;
27
+ outline: none;
28
+ }
29
+
30
+ /* primary: solid orchid fill, dark text, glow pulse on hover */
31
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--primary {
32
+ background: var(--rb-accent);
33
+ border-color: var(--rb-accent);
34
+ color: var(--rb-accent-fg);
35
+ }
36
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--primary:hover,
37
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--primary:focus-visible {
38
+ border-color: var(--rb-accent);
39
+ color: var(--rb-accent-fg);
40
+ }
41
+
42
+ /* accent: teal ghost — critical navigation paths */
43
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--accent {
44
+ border-color: var(--rb-accent-2);
45
+ color: var(--rb-accent-2);
46
+ }
47
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--accent:hover,
48
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--accent:focus-visible {
49
+ border-color: var(--rb-accent-2);
50
+ color: var(--rb-accent-2);
51
+ animation-name: rb-lp-pulse-glow-accent;
52
+ }
53
+
54
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--danger {
55
+ border-color: var(--rb-danger);
56
+ color: var(--rb-danger);
57
+ }
58
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--danger:hover,
59
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--danger:focus-visible {
60
+ border-color: var(--rb-danger);
61
+ color: var(--rb-danger);
62
+ }
63
+
64
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:disabled {
65
+ opacity: 0.5;
66
+ cursor: not-allowed;
67
+ animation: none;
68
+ }
69
+
70
+ @keyframes rb-lp-pulse-glow-accent {
71
+ 0%,
72
+ 100% {
73
+ box-shadow: 0 0 5px rgba(0, 245, 255, 0.15);
74
+ }
75
+ 50% {
76
+ box-shadow: 0 0 20px var(--rb-accent-2-glow);
77
+ }
78
+ }
79
+
80
+ @media (prefers-reduced-motion: reduce) {
81
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn {
82
+ transition: none;
83
+ }
84
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:hover,
85
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:focus-visible {
86
+ animation: none;
87
+ }
88
+ }
@@ -0,0 +1,12 @@
1
+ /* luminous-precision — card: glass pane with a lit top edge */
2
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-card {
3
+ padding: var(--rb-space-4);
4
+ background: var(--rb-surface-glass);
5
+ border: 1px solid var(--rb-border);
6
+ border-top-color: var(--rb-border-strong);
7
+ border-radius: var(--rb-radius-lg);
8
+ backdrop-filter: blur(var(--rb-blur));
9
+ color: var(--rb-text);
10
+ }
11
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-card > :first-child { margin-top: 0; }
12
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-card > :last-child { margin-bottom: 0; }
@@ -0,0 +1,31 @@
1
+ /* luminous-precision — dialog (native <dialog>) */
2
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog {
3
+ padding: var(--rb-space-4);
4
+ max-width: 32rem;
5
+ width: calc(100vw - 2rem);
6
+ background: var(--rb-surface);
7
+ border: 1px solid var(--rb-border);
8
+ border-top-color: var(--rb-border-strong);
9
+ border-radius: var(--rb-radius-lg);
10
+ color: var(--rb-text);
11
+ font-family: var(--rb-font-mono);
12
+ box-shadow: 0 0 40px var(--rb-accent-glow);
13
+ }
14
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog::backdrop {
15
+ background: rgba(10, 12, 16, 0.6);
16
+ backdrop-filter: blur(var(--rb-blur));
17
+ }
18
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog__title {
19
+ margin: 0 0 var(--rb-space-3);
20
+ color: var(--rb-accent);
21
+ font-family: var(--rb-font-display);
22
+ font-size: 1.25rem;
23
+ font-weight: var(--rb-font-weight-medium);
24
+ letter-spacing: var(--rb-heading-tracking);
25
+ }
26
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog__actions {
27
+ display: flex;
28
+ justify-content: flex-end;
29
+ gap: var(--rb-space-2);
30
+ margin-top: var(--rb-space-4);
31
+ }
@@ -0,0 +1,126 @@
1
+ /* luminous-precision — form controls: input, textarea, select, checkbox,
2
+ * radio, switch. Focus drops the resting border for an electric-teal line
3
+ * with a soft outer glow. */
4
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input,
5
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-select,
6
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea {
7
+ display: block;
8
+ width: 100%;
9
+ padding: var(--rb-space-2) var(--rb-space-3);
10
+ background: rgba(26, 29, 41, 0.6);
11
+ border: 1px solid var(--rb-border);
12
+ border-radius: var(--rb-radius);
13
+ color: var(--rb-text);
14
+ font-family: var(--rb-font-mono);
15
+ font-weight: var(--rb-font-weight);
16
+ font-size: var(--rb-text-sm);
17
+ transition: border-color var(--rb-transition), box-shadow var(--rb-transition);
18
+ }
19
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-select {
20
+ appearance: none;
21
+ padding-right: 2.25rem;
22
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23958e9b' stroke-width='1.5'/%3E%3C/svg%3E");
23
+ background-repeat: no-repeat;
24
+ background-position: right 0.75rem center;
25
+ }
26
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input::placeholder,
27
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea::placeholder {
28
+ color: var(--rb-text-faint);
29
+ }
30
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input:focus,
31
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-select:focus,
32
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea:focus {
33
+ outline: none;
34
+ border-color: var(--rb-accent-2);
35
+ box-shadow: 0 0 8px var(--rb-accent-2-glow);
36
+ }
37
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input[aria-invalid="true"],
38
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea[aria-invalid="true"] {
39
+ border-color: var(--rb-danger);
40
+ }
41
+
42
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-label {
43
+ display: block;
44
+ margin-bottom: var(--rb-space-1);
45
+ color: var(--rb-text-faint);
46
+ text-transform: uppercase;
47
+ font-size: 12px;
48
+ font-weight: var(--rb-font-weight-medium);
49
+ letter-spacing: var(--rb-label-tracking);
50
+ }
51
+
52
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-field {
53
+ margin-bottom: var(--rb-space-3);
54
+ }
55
+
56
+ /* checkbox & radio */
57
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-checkbox,
58
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio {
59
+ appearance: none;
60
+ width: 1.1rem;
61
+ height: 1.1rem;
62
+ margin: 0;
63
+ vertical-align: text-bottom;
64
+ background: var(--rb-surface);
65
+ border: 1px solid var(--rb-border-strong);
66
+ border-radius: 0.25rem;
67
+ cursor: pointer;
68
+ transition: border-color var(--rb-transition), box-shadow var(--rb-transition);
69
+ }
70
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio {
71
+ border-radius: 50%;
72
+ }
73
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-checkbox:checked,
74
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio:checked {
75
+ border-color: var(--rb-accent-2);
76
+ box-shadow: inset 0 0 0 3px var(--rb-surface), inset 0 0 0 1rem var(--rb-accent-2),
77
+ 0 0 6px var(--rb-accent-2-glow);
78
+ }
79
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-checkbox:focus-visible,
80
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio:focus-visible,
81
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch:focus-visible {
82
+ outline: none;
83
+ border-color: var(--rb-accent-border);
84
+ }
85
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-choice {
86
+ display: inline-flex;
87
+ align-items: center;
88
+ gap: var(--rb-space-2);
89
+ color: var(--rb-text);
90
+ font-size: var(--rb-text-sm);
91
+ cursor: pointer;
92
+ }
93
+
94
+ /* switch */
95
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch {
96
+ appearance: none;
97
+ width: 2.4rem;
98
+ height: 1.3rem;
99
+ margin: 0;
100
+ vertical-align: text-bottom;
101
+ background: var(--rb-surface);
102
+ border: 1px solid var(--rb-border-strong);
103
+ border-radius: 1rem;
104
+ cursor: pointer;
105
+ position: relative;
106
+ transition: border-color var(--rb-transition);
107
+ }
108
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch::after {
109
+ content: "";
110
+ position: absolute;
111
+ top: 2px;
112
+ left: 2px;
113
+ width: calc(1.3rem - 6px);
114
+ height: calc(1.3rem - 6px);
115
+ border-radius: 50%;
116
+ background: var(--rb-text-faint);
117
+ transition: transform var(--rb-transition), background var(--rb-transition);
118
+ }
119
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch:checked {
120
+ border-color: var(--rb-accent-2);
121
+ }
122
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch:checked::after {
123
+ transform: translateX(1.1rem);
124
+ background: var(--rb-accent-2);
125
+ box-shadow: 0 0 6px var(--rb-accent-2-glow);
126
+ }