@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,46 @@
1
+ /* luminous-precision — nav link: glass list row; hover shifts the indigo and
2
+ * lights a 2px electric-teal bar on the left edge */
3
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-link {
4
+ display: flex;
5
+ align-items: baseline;
6
+ gap: var(--rb-space-3);
7
+ padding: 1rem var(--rb-space-4);
8
+ background: var(--rb-surface-glass);
9
+ border: 1px solid var(--rb-border);
10
+ border-radius: var(--rb-radius);
11
+ backdrop-filter: blur(var(--rb-blur));
12
+ color: var(--rb-text);
13
+ text-decoration: none;
14
+ text-transform: uppercase;
15
+ font-weight: var(--rb-font-weight-medium);
16
+ font-size: var(--rb-text-sm);
17
+ letter-spacing: var(--rb-label-tracking);
18
+ box-shadow: inset 0 0 0 0 var(--rb-accent-2);
19
+ transition:
20
+ background var(--rb-transition),
21
+ color var(--rb-transition),
22
+ box-shadow var(--rb-transition);
23
+ }
24
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-link:hover {
25
+ background: var(--rb-surface);
26
+ color: var(--rb-accent-2);
27
+ box-shadow:
28
+ inset 2px 0 0 0 var(--rb-accent-2),
29
+ 0 0 12px var(--rb-accent-2-glow);
30
+ }
31
+
32
+ @keyframes rb-lp-pulse-glow {
33
+ 0%,
34
+ 100% {
35
+ box-shadow: 0 0 5px rgba(198, 165, 255, 0.15);
36
+ }
37
+ 50% {
38
+ box-shadow: 0 0 20px var(--rb-accent-glow);
39
+ }
40
+ }
41
+
42
+ @media (prefers-reduced-motion: reduce) {
43
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-link {
44
+ transition: none;
45
+ }
46
+ }
@@ -0,0 +1,41 @@
1
+ /* luminous-precision — progress bar & spinner */
2
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress {
3
+ display: block;
4
+ width: 100%;
5
+ height: 0.5rem;
6
+ background: var(--rb-surface-sunken);
7
+ border: 1px solid var(--rb-border);
8
+ border-radius: 1rem;
9
+ overflow: hidden;
10
+ }
11
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress__bar {
12
+ height: 100%;
13
+ background: var(--rb-accent);
14
+ box-shadow: 0 0 8px var(--rb-accent-glow);
15
+ border-radius: 1rem;
16
+ transition: width var(--rb-transition);
17
+ }
18
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress__bar--accent {
19
+ background: var(--rb-accent-2);
20
+ box-shadow: 0 0 8px var(--rb-accent-2-glow);
21
+ }
22
+
23
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-spinner {
24
+ display: inline-block;
25
+ width: 1.5rem;
26
+ height: 1.5rem;
27
+ border: 2px solid var(--rb-border);
28
+ border-top-color: var(--rb-accent);
29
+ border-radius: 50%;
30
+ animation: rb-lp-spin 0.8s linear infinite;
31
+ }
32
+ @keyframes rb-lp-spin {
33
+ to {
34
+ transform: rotate(360deg);
35
+ }
36
+ }
37
+ @media (prefers-reduced-motion: reduce) {
38
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-spinner {
39
+ animation-duration: 2s;
40
+ }
41
+ }
@@ -0,0 +1,28 @@
1
+ /* luminous-precision — table */
2
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table {
3
+ width: 100%;
4
+ border-collapse: collapse;
5
+ font-size: var(--rb-text-sm);
6
+ color: var(--rb-text);
7
+ }
8
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table th {
9
+ padding: var(--rb-space-2) var(--rb-space-3);
10
+ border-bottom: 1px solid var(--rb-border-strong);
11
+ color: var(--rb-text-faint);
12
+ text-align: left;
13
+ text-transform: uppercase;
14
+ font-size: 12px;
15
+ font-weight: var(--rb-font-weight-medium);
16
+ letter-spacing: var(--rb-label-tracking);
17
+ }
18
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table td {
19
+ padding: var(--rb-space-2) var(--rb-space-3);
20
+ border-bottom: 1px solid var(--rb-border);
21
+ }
22
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table tbody tr {
23
+ transition: background var(--rb-transition), box-shadow var(--rb-transition);
24
+ }
25
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table tbody tr:hover {
26
+ background: var(--rb-surface-glass);
27
+ box-shadow: inset 2px 0 0 0 var(--rb-accent-2);
28
+ }
@@ -0,0 +1,33 @@
1
+ /* luminous-precision — tabs: active tab carries the electric-teal path */
2
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-tabs {
3
+ display: flex;
4
+ gap: var(--rb-space-2);
5
+ border-bottom: 1px solid var(--rb-border);
6
+ }
7
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-tab {
8
+ padding: var(--rb-space-2) var(--rb-space-3);
9
+ margin-bottom: -1px;
10
+ background: none;
11
+ border: none;
12
+ border-bottom: 2px solid transparent;
13
+ color: var(--rb-text-faint);
14
+ text-transform: uppercase;
15
+ font-family: var(--rb-font-mono);
16
+ font-weight: var(--rb-font-weight-medium);
17
+ font-size: var(--rb-text-sm);
18
+ letter-spacing: var(--rb-label-tracking);
19
+ cursor: pointer;
20
+ transition: color var(--rb-transition), border-color var(--rb-transition);
21
+ }
22
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-tab:hover {
23
+ color: var(--rb-text);
24
+ }
25
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-tab--active,
26
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-tab[aria-selected="true"] {
27
+ color: var(--rb-accent-2);
28
+ border-bottom-color: var(--rb-accent-2);
29
+ text-shadow: 0 0 8px var(--rb-accent-2-glow);
30
+ }
31
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-tabpanel {
32
+ padding: var(--rb-space-3) 0;
33
+ }
@@ -0,0 +1,124 @@
1
+ # luminous-precision
2
+
3
+ > **Source & attribution.** Ported from
4
+ > [`nazuraki/ui-std-lib`](https://github.com/nazuraki/ui-std-lib)'s
5
+ > `@nazuraki/styles` "luminous-precision" theme (MIT, Copyright (c) 2026
6
+ > nazuraki — see the repo [`NOTICE`](../../NOTICE)), re-namespaced from `--nb-*` /
7
+ > `.nb-*` / `data-nb-style` to the rackbops `--rb-*` contract. The aesthetic below
8
+ > is nazuraki's; only the token/class names changed.
9
+
10
+ Professional, nocturnal evolution of neon-butterfly — "Luminous Precision".
11
+ Deep obsidian foundation, glassmorphic indigo surfaces, and light used as the
12
+ interaction language: instead of heavy borders, elements glow. Vibrant orchid
13
+ is the primary voice; electric teal marks active paths and critical signals.
14
+ Sora headlines over JetBrains Mono body give it a commanding, high-tech,
15
+ developer-console feel without going full terminal. Derived from the
16
+ InfraPulse Stitch mockups (Stitch project 18185577263375001507).
17
+
18
+ ## Token mapping (dual accent)
19
+
20
+ luminous-precision is a two-accent design, but the rackbops baseline carries a
21
+ single `--rb-accent`. The mapping:
22
+
23
+ | Role | rackbops token | Value |
24
+ | --- | --- | --- |
25
+ | Primary / brand voice (orchid) | `--rb-accent` (+ `--rb-accent-fg`, `--rb-accent-glow`, `--rb-accent-border`) | `#c6a5ff` |
26
+ | Active / critical (electric teal) | `--rb-accent-2` (+ `--rb-accent-2-glow`) — theme extra | `#00f5ff` |
27
+ | Lit glass edge | `--rb-border-strong` | `rgba(255,255,255,0.2)` |
28
+ | Glass pane fill | `--rb-surface-glass` — theme extra | `rgba(26,29,41,0.4)` |
29
+
30
+ `--rb-accent-2*`, `--rb-surface-glass`, and `--rb-accent-border`/`--rb-accent-glow`
31
+ are theme extras (beyond the baseline set) that only this theme's own components
32
+ rely on.
33
+
34
+ ## Color
35
+
36
+ | Role | Value | Usage |
37
+ | --- | --- | --- |
38
+ | Background | `#0a0c10` (deep obsidian) | Page background; `.rb-bg` adds soft orchid/teal radial underlays |
39
+ | Surface | `#1a1d29` (indigo) | Solid panels, dialogs |
40
+ | Surface sunken | `#0c0e14` | Inset fields, log wells, progress troughs |
41
+ | Surface glass | `rgba(26,29,41,0.4)` + 12px blur | Cards, nav links, alerts |
42
+ | Text | `#e2e2eb` | Body text |
43
+ | Text faint | `#958e9b` | Secondary text, labels, idle tabs |
44
+ | Accent (orchid) | `#c6a5ff` | Primary buttons (solid fill), emphasis, glow |
45
+ | Accent-2 (teal) | `#00f5ff` | Active states, focus rings, success paths, list-edge bars |
46
+ | Info | `#83b7ff` | Informational callouts and chips |
47
+ | Success | `#47e34e` | Live/healthy status |
48
+ | Warning | `#ffb86c` (amber) | Caution states |
49
+ | Danger | `#ff4d6d` (rose) | Destructive actions, errors |
50
+ | Border | `rgba(255,255,255,0.08)` | Resting borders |
51
+ | Border strong | `rgba(255,255,255,0.2)` | Top edge of glass panes — simulates overhead light |
52
+
53
+ Rules: color is functional, never decorative. Resting UI stays obsidian/faint;
54
+ orchid and teal appear on interaction, focus, and state. Depth comes from
55
+ tonal layers and glow, not drop shadows. Never pure white or pure black.
56
+
57
+ ## Typography
58
+
59
+ - **Headlines:** Sora (500 md / 600 lg / 700 xl), tight letter-spacing
60
+ (−0.01 to −0.02em; `--rb-heading-tracking`); fallback `ui-sans-serif`.
61
+ - **Body & UI:** JetBrains Mono 400; fallback `ui-monospace`.
62
+ - **Labels & interactive text** (buttons, tabs, table headers): uppercase,
63
+ 600, 12–14px, letter-spacing `0.05em` (`--rb-label-tracking`).
64
+
65
+ Webfonts are declared in `styles/manifest.json` (`luminous-precision.fonts`);
66
+ consumers load that stylesheet (Sora + JetBrains Mono) or self-host. The token
67
+ stacks fall back to system families when the webfonts are absent.
68
+
69
+ ## Shape & effects
70
+
71
+ - Radius `0.5rem` for buttons and inputs; `1rem` for cards, dialogs, and large
72
+ containers. Pills (`--rb-radius-pill`) reserved strictly for chips/badges and
73
+ switches.
74
+ - Glass panes: 1px hairline borders with a lighter top edge
75
+ (`--rb-border-strong`) to simulate overhead lighting; `backdrop-filter` 12px.
76
+ - Focus is electric teal: inputs drop the resting border for a teal line plus
77
+ soft teal outer glow.
78
+ - Elevation = glow (`rb-lp-pulse-glow` orchid, `rb-lp-pulse-glow-accent` teal),
79
+ not dark shadows. `--rb-shadow-*` exist for baseline parity but the components
80
+ lean on glow. Transitions 0.3s. Respect `prefers-reduced-motion`.
81
+ - 8px spacing rhythm; generous negative space so glows can breathe.
82
+
83
+ ## Components
84
+
85
+ Class prefix `rb-` (shared token/class contract with the other themes).
86
+
87
+ - **Card** `.rb-card` — glass pane, 1rem radius, lit top edge.
88
+ - **NavLink** `.rb-link` — glass list row; hover shifts to solid indigo and
89
+ lights a 2px teal bar on the left edge.
90
+ - **Button** `.rb-btn` — ghost by default; `--primary` is the one solid fill
91
+ (orchid, dark text), `--accent` teal ghost, `--danger` rose ghost.
92
+ - **Form** `.rb-input`, `.rb-textarea`, `.rb-select`, `.rb-label`,
93
+ `.rb-field`, `.rb-checkbox`, `.rb-radio`, `.rb-switch`, `.rb-choice` —
94
+ checked/focus states glow teal.
95
+ - **Badge** `.rb-badge` — pill chip: 15% tint of its hue behind
96
+ full-saturation text (+ semantic modifiers).
97
+ - **Alert** `.rb-alert` — glass, 3px left bar carries the semantic color.
98
+ - **Dialog** `.rb-dialog` — native `<dialog>`, indigo pane with orchid glow,
99
+ Sora title, blurred obsidian backdrop.
100
+ - **Tabs** `.rb-tabs`/`.rb-tab`/`.rb-tabpanel` — active tab underlined in
101
+ teal with text glow.
102
+ - **Table** `.rb-table` — lit header rule; row hover shifts glass and lights
103
+ the teal left bar.
104
+ - **Progress** `.rb-progress`, **Spinner** `.rb-spinner` — glowing orchid
105
+ indicators (`--accent` bar variant in teal).
106
+
107
+ This port carries nazuraki's original component set; the rackbops-specific
108
+ `eyebrow`, `tabstrip`, `wordmark`, and `card--raised` surfaces are not part of
109
+ it. It also keeps nazuraki's `.rb-badge--primary` variant (orchid pill), which
110
+ the other rackbops themes don't define — a `@rackbops/ui-react` `Badge` never
111
+ emits it, so it is a theme extra, harmless where unused.
112
+
113
+ ## Code syntax
114
+
115
+ Tokens `--rb-code-*` (theme extra). Orchid keywords, teal types, info-blue
116
+ functions, amber numbers, success-green strings, soft-rose variables,
117
+ dimmed-faint comments, faint meta — palette voices reused, never new hues for
118
+ decoration.
119
+
120
+ ## Scoping
121
+
122
+ Every rule is guarded by `data-rb-style="luminous-precision"` (self or
123
+ ancestor), wrapped in zero-specificity `:where()`. Set the attribute on
124
+ `<html>` for a page or on a container for an embedded island.
@@ -0,0 +1,13 @@
1
+ /* luminous-precision — full theme entry point */
2
+ @import "./tokens.css";
3
+ @import "./base.css";
4
+ @import "./components/card.css";
5
+ @import "./components/link.css";
6
+ @import "./components/button.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";
@@ -0,0 +1,89 @@
1
+ /* luminous-precision — design tokens
2
+ * Ported from nazuraki/ui-std-lib's @nazuraki/styles "luminous-precision"
3
+ * theme (MIT, Copyright (c) 2026 nazuraki — see the repo NOTICE), re-namespaced
4
+ * to the rackbops (--rb-*) contract. Consume via:
5
+ * @import "@rackbops/styles/luminous-precision/tokens";
6
+ * or pull the whole theme with ./index.css.
7
+ *
8
+ * Nothing applies until an element carries data-rb-style="luminous-precision"
9
+ * — set it on <html> for a page, or on any container for an embedded island.
10
+ * The :where() keeps specificity at zero, so any consumer rule overrides.
11
+ *
12
+ * Every theme declares the same baseline token set (styles/test enforces
13
+ * parity); names marked (extra) are additions beyond it that only this theme's
14
+ * own component CSS may rely on. luminous-precision is a dual-accent design:
15
+ * vibrant orchid is the brand voice (baseline --rb-accent); electric teal marks
16
+ * active paths and critical signals (the --rb-accent-2 extra). Depth is light,
17
+ * not shadow — elevation comes from glow, so the baseline --rb-shadow-* are
18
+ * declared for contract parity but the components lean on the glow extras.
19
+ */
20
+ :where([data-rb-style="luminous-precision"]) {
21
+ color-scheme: dark;
22
+
23
+ /* color — deep obsidian foundation, tonal indigo surfaces */
24
+ --rb-bg: #0a0c10;
25
+ --rb-surface: #1a1d29;
26
+ --rb-surface-2: #242838; /* raised indigo panel, a step above surface */
27
+ --rb-surface-sunken: #0c0e14; /* inset fields, log wells, progress troughs */
28
+ --rb-surface-glass: rgba(26, 29, 41, 0.4); /* (extra) glass panes over blur */
29
+ --rb-text: #e2e2eb;
30
+ --rb-text-soft: #b4b2c0; /* secondary body copy, between text and faint */
31
+ --rb-text-faint: #958e9b; /* labels, idle tabs, meta */
32
+ --rb-border: rgba(255, 255, 255, 0.08); /* resting hairline */
33
+ --rb-border-strong: rgba(255, 255, 255, 0.2); /* lit top edge of glass panes */
34
+
35
+ /* accent — orchid is the primary brand voice */
36
+ --rb-accent: #c6a5ff; /* vibrant orchid */
37
+ --rb-accent-fg: #16101f; /* dark ink on the solid orchid fill */
38
+ --rb-accent-wash: rgba(198, 165, 255, 0.16); /* tinted orchid fill */
39
+ --rb-accent-grad: linear-gradient(120deg, #c6a5ff, #00f5ff); /* orchid → teal */
40
+ --rb-accent-glow: rgba(198, 165, 255, 0.35); /* (extra) orchid glow */
41
+ --rb-accent-border: rgba(198, 165, 255, 0.6); /* (extra) lit orchid edge */
42
+
43
+ /* accent-2 (extra) — electric teal: active states, focus, critical paths */
44
+ --rb-accent-2: #00f5ff;
45
+ --rb-accent-2-glow: rgba(0, 245, 255, 0.3);
46
+
47
+ /* semantic — colour beyond the accents is earned: severity/status only */
48
+ --rb-info: #83b7ff;
49
+ --rb-success: #47e34e;
50
+ --rb-warning: #ffb86c;
51
+ --rb-danger: #ff4d6d;
52
+
53
+ /* code syntax (extra) — palette voices reused, never new hues */
54
+ --rb-code-keyword: #c6a5ff;
55
+ --rb-code-string: #47e34e;
56
+ --rb-code-number: #ffb86c;
57
+ --rb-code-comment: #837b8d;
58
+ --rb-code-function: #83b7ff;
59
+ --rb-code-variable: #ff7d95;
60
+ --rb-code-type: #00f5ff;
61
+ --rb-code-meta: #958e9b;
62
+
63
+ /* typography — Sora headlines over a JetBrains Mono body */
64
+ --rb-font-display: "Sora", ui-sans-serif, system-ui, sans-serif;
65
+ --rb-font-body: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
66
+ --rb-font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
67
+ --rb-font-weight: 400;
68
+ --rb-font-weight-medium: 600; /* labels, interactive text */
69
+ --rb-font-weight-bold: 700;
70
+ --rb-heading-tracking: -0.01em;
71
+ --rb-label-tracking: 0.05em; /* uppercase labels, buttons, tabs */
72
+ --rb-text-sm: 14px;
73
+
74
+ /* shape & effects — light-first depth; glow over drop shadow */
75
+ --rb-radius: 0.5rem; /* buttons, inputs */
76
+ --rb-radius-lg: 1rem; /* cards, dialogs, large containers */
77
+ --rb-radius-pill: 999px; /* chips, badges, switches */
78
+ --rb-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3); /* baseline parity; theme uses glow */
79
+ --rb-shadow-lg: 0 10px 34px rgba(0, 0, 0, 0.5);
80
+ --rb-blur: 12px; /* glass backdrop-filter */
81
+ --rb-transition: 0.3s;
82
+
83
+ /* spacing — 8px rhythm; generous negative space so glows can breathe */
84
+ --rb-space-1: 0.25rem;
85
+ --rb-space-2: 0.5rem;
86
+ --rb-space-3: 1rem;
87
+ --rb-space-4: 1.5rem;
88
+ --rb-space-5: 2rem;
89
+ }
package/manifest.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "contract": 1,
3
+ "themes": {
4
+ "arcane-obsidian": {
5
+ "scheme": "dark",
6
+ "fonts": []
7
+ },
8
+ "arcane-parchment": {
9
+ "scheme": "light",
10
+ "fonts": []
11
+ },
12
+ "rackbops-studio": {
13
+ "scheme": "light",
14
+ "fonts": []
15
+ },
16
+ "rackbops-noir": {
17
+ "scheme": "dark",
18
+ "fonts": []
19
+ },
20
+ "luminous-precision": {
21
+ "scheme": "dark",
22
+ "fonts": [
23
+ "https://fonts.googleapis.com/css2?family=Sora:wght@500;600;700&family=JetBrains+Mono:wght@400;600;700&display=swap"
24
+ ]
25
+ },
26
+ "neon-butterfly": {
27
+ "scheme": "dark",
28
+ "fonts": [
29
+ "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@450;700&display=swap"
30
+ ]
31
+ },
32
+ "summer-cloud": {
33
+ "scheme": "light",
34
+ "fonts": [
35
+ "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600;700;800&family=Inter:wght@400;600&family=JetBrains+Mono:wght@500;700&display=swap"
36
+ ]
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,49 @@
1
+ /* neon-butterfly — base styles
2
+ * Scoped defaults. Requires tokens.css. Apps that need the JetBrains Mono
3
+ * webfont should include the Google Fonts <link> (weights 450 + 700) or
4
+ * self-host; the token stack falls back to ui-monospace.
5
+ *
6
+ * The element carrying data-rb-style is the theme's canvas: it gets the
7
+ * background, text color, and body font — whether that is <html> for a page
8
+ * or a mount container for an embedded island. Page-only rules (body margin,
9
+ * viewport height) apply only when the attribute sits on <html>.
10
+ */
11
+ :where([data-rb-style="neon-butterfly"]) {
12
+ background-color: var(--rb-bg);
13
+ color: var(--rb-text);
14
+ font-family: var(--rb-font-body);
15
+ font-weight: var(--rb-font-weight);
16
+ }
17
+
18
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *),
19
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *)::before,
20
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *)::after {
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ :where(html[data-rb-style="neon-butterfly"]) body {
25
+ margin: 0;
26
+ min-height: 100vh;
27
+ background-color: var(--rb-bg);
28
+ color: var(--rb-text);
29
+ font-family: var(--rb-font-body);
30
+ font-weight: var(--rb-font-weight);
31
+ }
32
+
33
+ /* Opt-in page background: the butterfly circuit artwork blended into the navy.
34
+ * Matches the switchboard landing page. Apply to <body>, or to the attributed
35
+ * container itself. */
36
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-bg {
37
+ background: var(--rb-bg) url("./assets/butterfly-circuit.png") center / cover fixed;
38
+ background-blend-mode: luminosity;
39
+ background-color: var(--rb-bg-blend);
40
+ }
41
+
42
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *):where(a) {
43
+ color: var(--rb-accent);
44
+ }
45
+
46
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *)::selection {
47
+ background: var(--rb-accent);
48
+ color: var(--rb-bg);
49
+ }
@@ -0,0 +1,26 @@
1
+ /* neon-butterfly — alert / callout */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).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="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--info { border-left-color: var(--rb-info); }
13
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--success { border-left-color: var(--rb-success); }
14
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--warning { border-left-color: var(--rb-warning); }
15
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--danger { border-left-color: var(--rb-danger); }
16
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert__title {
17
+ display: block;
18
+ margin-bottom: var(--rb-space-1);
19
+ text-transform: uppercase;
20
+ font-weight: var(--rb-font-weight-bold);
21
+ letter-spacing: var(--rb-label-tracking);
22
+ }
23
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--info .rb-alert__title { color: var(--rb-info); }
24
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--success .rb-alert__title { color: var(--rb-success); }
25
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--warning .rb-alert__title { color: var(--rb-warning); }
26
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-alert--danger .rb-alert__title { color: var(--rb-danger); }
@@ -0,0 +1,17 @@
1
+ /* neon-butterfly — badge */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-badge {
3
+ display: inline-block;
4
+ padding: 0.15rem var(--rb-space-2);
5
+ border: 1px solid var(--rb-border);
6
+ border-radius: var(--rb-radius);
7
+ color: var(--rb-text-faint);
8
+ text-transform: uppercase;
9
+ font-size: 11px;
10
+ font-weight: var(--rb-font-weight-bold);
11
+ letter-spacing: var(--rb-label-tracking);
12
+ }
13
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-badge--primary { border-color: var(--rb-accent-border); color: var(--rb-accent); }
14
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-badge--info { border-color: var(--rb-info); color: var(--rb-info); }
15
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-badge--success { border-color: var(--rb-success); color: var(--rb-success); }
16
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-badge--warning { border-color: var(--rb-warning); color: var(--rb-warning); }
17
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-badge--danger { border-color: var(--rb-danger); color: var(--rb-danger); }
@@ -0,0 +1,54 @@
1
+ /* neon-butterfly — button */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).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: var(--rb-surface-glass);
8
+ border: 1px solid var(--rb-border);
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-bold);
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
+ }
21
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn:hover,
22
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn:focus-visible {
23
+ border-color: var(--rb-accent-border);
24
+ color: var(--rb-accent);
25
+ animation: rb-nb-pulse-glow 2s infinite;
26
+ outline: none;
27
+ }
28
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn--primary {
29
+ border-color: var(--rb-accent-border);
30
+ color: var(--rb-accent);
31
+ }
32
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn--accent {
33
+ border-color: var(--rb-accent-2);
34
+ color: var(--rb-accent-2);
35
+ }
36
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn--danger {
37
+ border-color: var(--rb-danger);
38
+ color: var(--rb-danger);
39
+ }
40
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn:disabled {
41
+ opacity: 0.5;
42
+ cursor: not-allowed;
43
+ animation: none;
44
+ }
45
+
46
+ @media (prefers-reduced-motion: reduce) {
47
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn {
48
+ transition: none;
49
+ }
50
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn:hover,
51
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-btn:focus-visible {
52
+ animation: none;
53
+ }
54
+ }
@@ -0,0 +1,11 @@
1
+ /* neon-butterfly — card */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-card {
3
+ padding: var(--rb-space-4);
4
+ background: var(--rb-surface-glass);
5
+ border: 1px solid var(--rb-border);
6
+ border-radius: var(--rb-radius);
7
+ backdrop-filter: blur(var(--rb-blur));
8
+ color: var(--rb-text);
9
+ }
10
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-card > :first-child { margin-top: 0; }
11
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-card > :last-child { margin-bottom: 0; }
@@ -0,0 +1,29 @@
1
+ /* neon-butterfly — dialog (native <dialog>) */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).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-accent-border);
8
+ border-radius: var(--rb-radius);
9
+ color: var(--rb-text);
10
+ font-family: var(--rb-font-mono);
11
+ box-shadow: 0 0 30px rgba(210, 187, 255, 0.25);
12
+ }
13
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-dialog::backdrop {
14
+ background: rgba(11, 19, 38, 0.7);
15
+ backdrop-filter: blur(4px);
16
+ }
17
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-dialog__title {
18
+ margin: 0 0 var(--rb-space-3);
19
+ color: var(--rb-accent);
20
+ text-transform: uppercase;
21
+ font-size: 1rem;
22
+ letter-spacing: var(--rb-label-tracking);
23
+ }
24
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-dialog__actions {
25
+ display: flex;
26
+ justify-content: flex-end;
27
+ gap: var(--rb-space-2);
28
+ margin-top: var(--rb-space-4);
29
+ }