@rackbops/styles 0.1.0 → 0.1.2

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 (178) hide show
  1. package/all.css +5 -0
  2. package/amber-ember/base.css +61 -0
  3. package/amber-ember/components/alert.css +30 -0
  4. package/amber-ember/components/badge.css +32 -0
  5. package/amber-ember/components/button.css +90 -0
  6. package/amber-ember/components/card.css +24 -0
  7. package/amber-ember/components/dialog.css +33 -0
  8. package/amber-ember/components/form.css +72 -0
  9. package/amber-ember/components/link.css +47 -0
  10. package/amber-ember/components/log.css +19 -0
  11. package/amber-ember/components/muted.css +7 -0
  12. package/amber-ember/components/nav-rail.css +14 -0
  13. package/amber-ember/components/pre.css +13 -0
  14. package/amber-ember/components/progress.css +42 -0
  15. package/amber-ember/components/stepper.css +87 -0
  16. package/amber-ember/components/table.css +50 -0
  17. package/amber-ember/components/tabs.css +46 -0
  18. package/amber-ember/design.md +78 -0
  19. package/amber-ember/index.css +18 -0
  20. package/amber-ember/tokens.css +72 -0
  21. package/amber-hearth/base.css +61 -0
  22. package/amber-hearth/components/alert.css +30 -0
  23. package/amber-hearth/components/badge.css +32 -0
  24. package/amber-hearth/components/button.css +90 -0
  25. package/amber-hearth/components/card.css +24 -0
  26. package/amber-hearth/components/dialog.css +33 -0
  27. package/amber-hearth/components/form.css +72 -0
  28. package/amber-hearth/components/link.css +47 -0
  29. package/amber-hearth/components/log.css +19 -0
  30. package/amber-hearth/components/muted.css +7 -0
  31. package/amber-hearth/components/nav-rail.css +14 -0
  32. package/amber-hearth/components/pre.css +13 -0
  33. package/amber-hearth/components/progress.css +42 -0
  34. package/amber-hearth/components/stepper.css +87 -0
  35. package/amber-hearth/components/table.css +50 -0
  36. package/amber-hearth/components/tabs.css +46 -0
  37. package/amber-hearth/design.md +146 -0
  38. package/amber-hearth/index.css +18 -0
  39. package/amber-hearth/tokens.css +77 -0
  40. package/arcane-obsidian/base.css +20 -0
  41. package/arcane-obsidian/components/button.css +15 -0
  42. package/arcane-obsidian/components/log.css +19 -0
  43. package/arcane-obsidian/components/muted.css +7 -0
  44. package/arcane-obsidian/components/nav-rail.css +14 -0
  45. package/arcane-obsidian/components/pre.css +13 -0
  46. package/arcane-obsidian/components/stepper.css +87 -0
  47. package/arcane-obsidian/components/table.css +14 -0
  48. package/arcane-obsidian/design.md +30 -2
  49. package/arcane-obsidian/index.css +5 -0
  50. package/arcane-parchment/base.css +20 -0
  51. package/arcane-parchment/components/button.css +15 -0
  52. package/arcane-parchment/components/log.css +19 -0
  53. package/arcane-parchment/components/muted.css +7 -0
  54. package/arcane-parchment/components/nav-rail.css +14 -0
  55. package/arcane-parchment/components/pre.css +13 -0
  56. package/arcane-parchment/components/stepper.css +87 -0
  57. package/arcane-parchment/components/table.css +14 -0
  58. package/arcane-parchment/design.md +10 -6
  59. package/arcane-parchment/index.css +5 -0
  60. package/concrete-signal/base.css +57 -0
  61. package/concrete-signal/components/alert.css +44 -0
  62. package/concrete-signal/components/badge.css +38 -0
  63. package/concrete-signal/components/button.css +98 -0
  64. package/concrete-signal/components/card.css +21 -0
  65. package/concrete-signal/components/dialog.css +33 -0
  66. package/concrete-signal/components/form.css +138 -0
  67. package/concrete-signal/components/link.css +44 -0
  68. package/concrete-signal/components/log.css +19 -0
  69. package/concrete-signal/components/muted.css +7 -0
  70. package/concrete-signal/components/nav-rail.css +15 -0
  71. package/concrete-signal/components/pre.css +14 -0
  72. package/concrete-signal/components/progress.css +44 -0
  73. package/concrete-signal/components/stepper.css +83 -0
  74. package/concrete-signal/components/table.css +48 -0
  75. package/concrete-signal/components/tabs.css +49 -0
  76. package/concrete-signal/design.md +171 -0
  77. package/concrete-signal/index.css +18 -0
  78. package/concrete-signal/tokens.css +75 -0
  79. package/concrete-signal-light/base.css +57 -0
  80. package/concrete-signal-light/components/alert.css +44 -0
  81. package/concrete-signal-light/components/badge.css +38 -0
  82. package/concrete-signal-light/components/button.css +98 -0
  83. package/concrete-signal-light/components/card.css +21 -0
  84. package/concrete-signal-light/components/dialog.css +33 -0
  85. package/concrete-signal-light/components/form.css +138 -0
  86. package/concrete-signal-light/components/link.css +44 -0
  87. package/concrete-signal-light/components/log.css +19 -0
  88. package/concrete-signal-light/components/muted.css +7 -0
  89. package/concrete-signal-light/components/nav-rail.css +15 -0
  90. package/concrete-signal-light/components/pre.css +14 -0
  91. package/concrete-signal-light/components/progress.css +44 -0
  92. package/concrete-signal-light/components/stepper.css +84 -0
  93. package/concrete-signal-light/components/table.css +48 -0
  94. package/concrete-signal-light/components/tabs.css +49 -0
  95. package/concrete-signal-light/design.md +82 -0
  96. package/concrete-signal-light/index.css +18 -0
  97. package/concrete-signal-light/tokens.css +75 -0
  98. package/css-side-effect.d.ts +5 -0
  99. package/luminous-precision/base.css +12 -0
  100. package/luminous-precision/components/button.css +25 -0
  101. package/luminous-precision/components/link.css +8 -0
  102. package/luminous-precision/components/log.css +19 -0
  103. package/luminous-precision/components/muted.css +7 -0
  104. package/luminous-precision/components/nav-rail.css +17 -0
  105. package/luminous-precision/components/pre.css +14 -0
  106. package/luminous-precision/components/progress.css +14 -5
  107. package/luminous-precision/components/stepper.css +89 -0
  108. package/luminous-precision/components/table.css +17 -0
  109. package/luminous-precision/design.md +44 -9
  110. package/luminous-precision/index.css +5 -0
  111. package/manifest.json +20 -0
  112. package/mono-field/base.css +59 -0
  113. package/mono-field/components/alert.css +35 -0
  114. package/mono-field/components/badge.css +34 -0
  115. package/mono-field/components/button.css +101 -0
  116. package/mono-field/components/card.css +20 -0
  117. package/mono-field/components/dialog.css +34 -0
  118. package/mono-field/components/form.css +91 -0
  119. package/mono-field/components/link.css +47 -0
  120. package/mono-field/components/log.css +19 -0
  121. package/mono-field/components/muted.css +7 -0
  122. package/mono-field/components/nav-rail.css +14 -0
  123. package/mono-field/components/pre.css +13 -0
  124. package/mono-field/components/progress.css +42 -0
  125. package/mono-field/components/stepper.css +86 -0
  126. package/mono-field/components/table.css +47 -0
  127. package/mono-field/components/tabs.css +48 -0
  128. package/mono-field/design.md +151 -0
  129. package/mono-field/index.css +18 -0
  130. package/mono-field/tokens.css +76 -0
  131. package/neon-butterfly/base.css +18 -0
  132. package/neon-butterfly/components/button.css +26 -0
  133. package/neon-butterfly/components/link.css +10 -0
  134. package/neon-butterfly/components/log.css +19 -0
  135. package/neon-butterfly/components/muted.css +7 -0
  136. package/neon-butterfly/components/nav-rail.css +17 -0
  137. package/neon-butterfly/components/pre.css +13 -0
  138. package/neon-butterfly/components/progress.css +14 -5
  139. package/neon-butterfly/components/stepper.css +89 -0
  140. package/neon-butterfly/components/table.css +15 -0
  141. package/neon-butterfly/design.md +40 -4
  142. package/neon-butterfly/index.css +5 -0
  143. package/package.json +61 -32
  144. package/rackbops-noir/base.css +11 -2
  145. package/rackbops-noir/components/button.css +16 -0
  146. package/rackbops-noir/components/card.css +9 -0
  147. package/rackbops-noir/components/log.css +19 -0
  148. package/rackbops-noir/components/muted.css +7 -0
  149. package/rackbops-noir/components/nav-rail.css +14 -0
  150. package/rackbops-noir/components/pre.css +13 -0
  151. package/rackbops-noir/components/principle.css +1 -0
  152. package/rackbops-noir/components/stepper.css +87 -0
  153. package/rackbops-noir/components/table.css +18 -0
  154. package/rackbops-noir/design.md +6 -3
  155. package/rackbops-noir/index.css +5 -0
  156. package/rackbops-studio/base.css +11 -2
  157. package/rackbops-studio/components/button.css +16 -0
  158. package/rackbops-studio/components/card.css +9 -0
  159. package/rackbops-studio/components/log.css +19 -0
  160. package/rackbops-studio/components/muted.css +7 -0
  161. package/rackbops-studio/components/nav-rail.css +14 -0
  162. package/rackbops-studio/components/pre.css +13 -0
  163. package/rackbops-studio/components/principle.css +1 -0
  164. package/rackbops-studio/components/stepper.css +87 -0
  165. package/rackbops-studio/components/table.css +18 -0
  166. package/rackbops-studio/design.md +29 -2
  167. package/rackbops-studio/index.css +5 -0
  168. package/summer-cloud/base.css +13 -1
  169. package/summer-cloud/components/button.css +17 -0
  170. package/summer-cloud/components/log.css +19 -0
  171. package/summer-cloud/components/muted.css +8 -0
  172. package/summer-cloud/components/nav-rail.css +17 -0
  173. package/summer-cloud/components/pre.css +16 -0
  174. package/summer-cloud/components/progress.css +14 -8
  175. package/summer-cloud/components/stepper.css +90 -0
  176. package/summer-cloud/components/table.css +11 -0
  177. package/summer-cloud/design.md +41 -3
  178. package/summer-cloud/index.css +5 -0
@@ -0,0 +1,171 @@
1
+ # concrete-signal
2
+
3
+ A brutalist-industrial design language: raw poured concrete and hazard
4
+ signage. It is the coldest, hardest theme in the library — zero
5
+ border-radius everywhere, thick hairline borders, and its signature trait,
6
+ **hard offset shadows instead of blur** (`Npx Npx 0 rgba(...)`, no blur
7
+ radius at all), so depth reads as a literal physical offset — a stamped
8
+ card, not a glow. The sole accent is safety-orange, used exactly as
9
+ functionally as arcane-obsidian's violet: interaction, focus, and emphasis
10
+ only, never decoration. Labels are heavy-weight and uppercase; numerals are
11
+ tabular; transitions are snappy (`0.1s`, no easing softness — brutalism
12
+ doesn't ease). Dark ("concrete-signal") is the primary look; its light
13
+ counterpart ("concrete-signal-light") is documented at the end.
14
+
15
+ ## Color
16
+
17
+ | Role | Value | Usage |
18
+ | --- | --- | --- |
19
+ | Background | `#121212` | Page canvas |
20
+ | Surface | `#1a1a1a` | Cards, header, panels |
21
+ | Surface 2 | `#232323` | Raised/hover surface, row hover |
22
+ | Surface sunken | `#0a0a0a` | Inset fields, progress troughs |
23
+ | Text | `#f2f2f0` | Body text |
24
+ | Text soft | `#b8b8b4` | Secondary text |
25
+ | Text faint | `#8f8f8a` | Labels, idle tabs, meta |
26
+ | Border | `#3a3a38` | Resting hairline borders |
27
+ | Border strong | `#55534e` | Card/table/dialog structural rules |
28
+ | Accent | `#ff5e1a` (safety-orange) | The sole brand voice: emphasis, active state, focus |
29
+ | Accent fg | `#121212` | Dark ink on the solid orange fill |
30
+ | Accent wash | `rgba(255,94,26,.16)` | Default badge tint, active-link wash |
31
+ | Gradient | `linear-gradient(90deg,#ff5e1a,#e8342a)` | The one rationed gradient: active-tab underline only |
32
+ | Info | `#4ea1e0` | Informational chips |
33
+ | Success | `#4caa5c` | Healthy/live status |
34
+ | Warning | `#e8b23a` | Caution status |
35
+ | Danger | `#e8342a` | Destructive actions, errors |
36
+
37
+ **Rules.** Colour is functional. Resting UI is concrete grey and faint;
38
+ safety-orange appears only on interaction, focus, active state, and
39
+ emphasis — never as decoration. Colour beyond the accent is *earned*:
40
+ severity and status chips are the one place other hues appear. The theme
41
+ never softens with glow, blur, or gradient — the one exception is the
42
+ 2-stop hard gradient rationed to the active-tab underline, and even that
43
+ gradient has no soft midpoint.
44
+
45
+ ## Typography
46
+
47
+ - **Display / labels:** `system-ui` throughout — no serif, no
48
+ monospace-as-display. The industrial voice comes from weight, case, and
49
+ tracking, not font family. Buttons, badges, tabs, and table headers are
50
+ uppercase at weight 800, tracked `var(--rb-label-tracking)` (`0.08em`).
51
+ - **Body:** `system-ui`, weight 400.
52
+ - **Numerals:** `font-variant-numeric: tabular-nums` on tables, so counts
53
+ and sizes align in a column.
54
+ - **Mono:** `ui-monospace` stack reserved for code-shaped content; not the
55
+ display voice.
56
+ - **Bare tags:** unclassed `h1`-`h6` pick up the display voice directly —
57
+ weight 800, tracking `0.08em`, `--rb-space-3` margin below, tight
58
+ `line-height: 1.1`. Bare `p` shares that margin; bare `ul`/`ol` add it too,
59
+ with `--rb-space-4` marker indent (real disc/decimal markers, not stripped).
60
+
61
+ ## Shape & effects
62
+
63
+ - Radius `0` everywhere — buttons, cards, dialogs, inputs, tabs. The one
64
+ concession is `--rb-radius-pill` (`0.125rem`), used for badges: near-square,
65
+ never a true rounded pill.
66
+ - Depth is a literal offset, not blur: `--rb-shadow-sm` (`2px 2px 0`) resting,
67
+ `--rb-shadow-lg` (`4px 4px 0`) for dialogs and raised cards. `--rb-blur` is
68
+ `0px` — this theme never applies `backdrop-filter` or any soft blur.
69
+ Dialog backdrops are a flat `rgba(0,0,0,.6)` scrim.
70
+ Focus is a hard border-weight change (1px to 2px solid accent), never a
71
+ soft wash ring or glow.
72
+ - Primary buttons carry the theme's signature interaction: the offset shadow
73
+ disappears and the button translates by the shadow's own offset on
74
+ hover/active (`transform: translate(2px, 2px); box-shadow: none;`) — the
75
+ classic "pressed into the surface" brutalist button.
76
+ - The **one gradient** (`--rb-accent-grad`, orange → red, 2-stop, no soft
77
+ midpoint) is rationed to exactly one place: the active-tab underline.
78
+ Everywhere else that reads as accent is a solid fill.
79
+ - Transitions `0.1s`, no easing softness. Every animation and transition
80
+ respects `prefers-reduced-motion`.
81
+ - 4px spacing rhythm (`--rb-space-1..5`).
82
+
83
+ ## Components
84
+
85
+ Class prefix `rb-`; shared token/class contract with the other themes. Only
86
+ the baseline ten — no theme-specific extras.
87
+
88
+ - **Button** `.rb-btn` — outlined ghost by default; `--primary` is a solid
89
+ accent fill with the offset-shadow press interaction; `--accent` an
90
+ accent-wash chip; `--danger` a danger-colored ghost; `--ghost` chromeless.
91
+ `--sm` is the compact size for dense toolbars and table-row actions.
92
+ `.rb-icon-btn` is a square icon-only hit target (>=2rem), paired with `.rb-btn`.
93
+ - **Card** `.rb-card` (+ `--raised`) — surface panel, a thicker
94
+ `border-strong` edge, `shadow-sm` (`--raised` upgrades to `shadow-lg`).
95
+ - **Link** `.rb-link` (nav/sidebar row) — hover fills to surface-2 and stamps
96
+ a hard 3px solid accent bar on the left edge; `--active` adds the accent
97
+ wash and bold text.
98
+ - **Nav rail** `.rb-nav-rail` — the sidebar container: 14rem fixed-width flex
99
+ column, surface background, a 1px border-strong right edge (this theme's
100
+ spec-sheet convention, not a faint hairline). Composes with `.rb-link` for
101
+ items; introduces no active-state convention of its own.
102
+ - **Form** `.rb-input` / `.rb-textarea` / `.rb-select` / `.rb-label` /
103
+ `.rb-field` / `.rb-choice` / `.rb-checkbox` / `.rb-radio` / `.rb-switch` —
104
+ sunken square fields; focus swaps the border from 1px to 2px solid accent;
105
+ checked checkbox/radio/switch states are a flat accent fill, not a tint
106
+ ring; labels are uppercase, tracked, weight 600.
107
+ - **Badge** `.rb-badge` — uppercase weight 700, near-square (`radius-pill`);
108
+ a 16%-tint fill of its hue behind full-strength text, plus a 1px solid
109
+ border of that same hue — badges carry a border here, unlike softer themes.
110
+ - **Alert** `.rb-alert` — surface panel with a 6px solid left bar (thicker
111
+ than the library norm) in the semantic colour, square corners.
112
+ - **Dialog** `.rb-dialog` — native `<dialog>`, surface bg, a 2px
113
+ `border-strong` edge, `shadow-lg`, a flat unblurred backdrop, uppercase
114
+ weight-800 title.
115
+ - **Tabs** `.rb-tabs` / `.rb-tab` / `.rb-tabpanel` — uppercase text tabs; the
116
+ active tab is accent, underlined with the rationed 2-stop gradient.
117
+ - **Table** `.rb-table` (+ `.rb-num`) — dense, uppercase weight-700 headers,
118
+ 1px `border-strong` rules throughout (a spec-sheet read, not faint
119
+ hairlines), tabular numerals, instant row hover to surface-2.
120
+ `--interactive` marks clickable rows: pointer cursor, plus an (equally
121
+ instant) focus-visible ring and surface-2 wash for a `tabindex` row or a
122
+ row-wrapping button/link.
123
+ - **Progress / Spinner** `.rb-progress` / `.rb-spinner` — sunken square
124
+ trough, solid accent fill (no gradient fill); the spinner keeps the
125
+ zero-radius signature as a square rotating frame.
126
+ - **Stepper** `.rb-stepper` (+ `__step` / `__node` / `__label`, `--complete` /
127
+ `--current` / `--upcoming`) — a milestone rail: complete nodes solid accent
128
+ with a checkmark, current a surface-fill ring with an accent border,
129
+ lifted with the hard, literal offset `shadow-lg` (never a glow or blur), upcoming faint
130
+ surface-2. Labels carry the brutalist uppercase/tracked voice through
131
+ weight and case, same as every other label here. Rail fill snaps instantly
132
+ instead of transitioning, matching this theme's every other hover/fill.
133
+ - **Muted text** `.rb-muted` — faint secondary/empty-state text;
134
+ `color: var(--rb-text-faint)` only, no italic — brutalism carries its voice
135
+ through weight, case, and tracking, never a softening slant.
136
+ - **Pre / log block** `.rb-pre` — command/log `<pre>`; surface-sunken
137
+ background, hairline border, zero radius (falls out of `--rb-radius`),
138
+ small mono, horizontal scroll. Pair with `.rb-log`
139
+ (`<pre class="rb-pre rb-log">`) for multi-line streaming output: a capped
140
+ 16rem height with vertical scroll, wrapped lines instead of horizontal
141
+ scroll, and roomier line-height for dense text.
142
+
143
+ ## Light counterpart
144
+
145
+ `concrete-signal-light` — the AA-tuned light secondary, same brutalist
146
+ mechanics, same `rb-*` classes and behaviour, only the palette inverted onto
147
+ a poured-concrete off-white ground.
148
+
149
+ | Role | Value |
150
+ | --- | --- |
151
+ | Background | `#eeece6` |
152
+ | Surface | `#f7f6f2` |
153
+ | Surface 2 | `#e4e2da` |
154
+ | Surface sunken | `#dcdad2` |
155
+ | Text | `#141311` |
156
+ | Text soft | `#4a4844` |
157
+ | Text faint | `#5f5d58` |
158
+ | Border | `#c9c6bc` |
159
+ | Border strong | `#a8a59a` |
160
+ | Accent | `#cc4611` |
161
+ | Accent fg | `#ffffff` |
162
+ | Gradient | `linear-gradient(90deg,#cc4611,#b8281f)` |
163
+
164
+ See `concrete-signal-light`'s own `design.md` for its full color table and
165
+ notes — the behaviour is identical; only the palette is light.
166
+
167
+ ## Scoping
168
+
169
+ Every rule is guarded by `data-rb-style="concrete-signal"` (self or
170
+ ancestor), wrapped in zero-specificity `:where()`. Set the attribute on
171
+ `<html>` for a page or on a container for an embedded island.
@@ -0,0 +1,18 @@
1
+ /* concrete-signal — 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/nav-rail.css";
7
+ @import "./components/button.css";
8
+ @import "./components/form.css";
9
+ @import "./components/badge.css";
10
+ @import "./components/alert.css";
11
+ @import "./components/dialog.css";
12
+ @import "./components/tabs.css";
13
+ @import "./components/table.css";
14
+ @import "./components/progress.css";
15
+ @import "./components/stepper.css";
16
+ @import "./components/muted.css";
17
+ @import "./components/pre.css";
18
+ @import "./components/log.css";
@@ -0,0 +1,75 @@
1
+ /* concrete-signal — design tokens
2
+ * Brutalist industrial: raw poured concrete + hazard signage. The coldest,
3
+ * hardest theme in the library — zero border-radius everywhere, thick hairline
4
+ * borders, and hard offset shadows (Npx Npx 0, no blur) instead of glow or
5
+ * soft blur, so depth reads as literal physical offset, like a stamped card.
6
+ * Safety-orange is the sole accent, used exactly as functionally as
7
+ * arcane-obsidian's violet: interaction/focus/emphasis only, never decoration.
8
+ * Consume via:
9
+ * @import "@rackbops/styles/concrete-signal/tokens";
10
+ * or pull the whole theme with ./index.css.
11
+ *
12
+ * Nothing applies until an element carries data-rb-style="concrete-signal" —
13
+ * set it on <html> for a page, or on any container for an embedded island.
14
+ * The :where() keeps specificity at zero, so any consumer rule overrides.
15
+ *
16
+ * This theme ships its dark, primary look; its light counterpart
17
+ * "concrete-signal-light" is a separate theme directory with the identical
18
+ * component contract — only the palette differs.
19
+ */
20
+ :where([data-rb-style="concrete-signal"]) {
21
+ color-scheme: dark;
22
+
23
+ /* color — raw poured concrete */
24
+ --rb-bg: #121212;
25
+ --rb-surface: #1a1a1a;
26
+ --rb-surface-2: #232323;
27
+ --rb-surface-sunken: #0a0a0a;
28
+ --rb-text: #f2f2f0;
29
+ --rb-text-soft: #b8b8b4;
30
+ --rb-text-faint: #8f8f8a;
31
+ --rb-border: #3a3a38;
32
+ --rb-border-strong: #55534e;
33
+
34
+ /* accent — safety-orange is the sole brand voice: interaction/focus/emphasis only */
35
+ --rb-accent: #ff5e1a;
36
+ --rb-accent-fg: #121212;
37
+ --rb-accent-wash: rgba(255, 94, 26, 0.16);
38
+
39
+ /* the ONE gradient — rationed to the active-tab underline only */
40
+ --rb-accent-grad: linear-gradient(90deg, #ff5e1a, #e8342a);
41
+
42
+ /* semantic — colour beyond the accent is earned: severity/status only */
43
+ --rb-info: #4ea1e0;
44
+ --rb-success: #4caa5c;
45
+ --rb-warning: #e8b23a;
46
+ --rb-danger: #e8342a;
47
+
48
+ /* typography — system-ui throughout; the industrial voice comes from
49
+ weight/case/tracking, not font family */
50
+ --rb-font-display: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
51
+ --rb-font-body: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
52
+ --rb-font-mono: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
53
+ --rb-font-weight: 400;
54
+ --rb-font-weight-medium: 600;
55
+ --rb-font-weight-bold: 800;
56
+ --rb-heading-tracking: 0.01em;
57
+ --rb-label-tracking: 0.08em;
58
+ --rb-text-sm: 13px;
59
+
60
+ /* shape & effects — zero radius everywhere; hard offset shadows, no blur */
61
+ --rb-radius: 0;
62
+ --rb-radius-lg: 0;
63
+ --rb-radius-pill: 0.125rem; /* deliberately near-square, not a true pill — brutalism has no soft pills */
64
+ --rb-shadow-sm: 2px 2px 0 rgba(0, 0, 0, 0.6);
65
+ --rb-shadow-lg: 4px 4px 0 rgba(0, 0, 0, 0.6);
66
+ --rb-blur: 0px; /* this theme never uses blur/glass */
67
+ --rb-transition: 0.1s; /* snappy; brutalism doesn't ease */
68
+
69
+ /* spacing — 4px rhythm */
70
+ --rb-space-1: 0.25rem;
71
+ --rb-space-2: 0.5rem;
72
+ --rb-space-3: 0.75rem;
73
+ --rb-space-4: 1rem;
74
+ --rb-space-5: 1.5rem;
75
+ }
@@ -0,0 +1,57 @@
1
+ /* concrete-signal-light — base styles
2
+ * Scoped defaults. Requires tokens.css. Fonts are a system stack — nothing to
3
+ * load; the industrial voice comes from weight/case/tracking, not font family.
4
+ *
5
+ * The element carrying data-rb-style is the theme's canvas: it gets the
6
+ * background, text color, and body font — whether that is <html> for a page
7
+ * or a mount container for an embedded island. Page-only rules (body margin,
8
+ * viewport height) apply only when the attribute sits on <html>.
9
+ */
10
+ :where([data-rb-style="concrete-signal-light"]) {
11
+ background-color: var(--rb-bg);
12
+ color: var(--rb-text);
13
+ font-family: var(--rb-font-body);
14
+ font-weight: var(--rb-font-weight);
15
+ }
16
+
17
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *),
18
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *)::before,
19
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *)::after {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ :where(html[data-rb-style="concrete-signal-light"]) body {
24
+ margin: 0;
25
+ min-height: 100vh;
26
+ background-color: var(--rb-bg);
27
+ color: var(--rb-text);
28
+ font-family: var(--rb-font-body);
29
+ font-weight: var(--rb-font-weight);
30
+ }
31
+
32
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *):where(h1, h2, h3, h4, h5, h6) {
33
+ margin: 0 0 var(--rb-space-3);
34
+ font-family: var(--rb-font-display);
35
+ font-weight: var(--rb-font-weight-bold);
36
+ letter-spacing: var(--rb-heading-tracking);
37
+ line-height: 1.1;
38
+ text-wrap: balance;
39
+ }
40
+
41
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *):where(p) {
42
+ margin: 0 0 var(--rb-space-3);
43
+ }
44
+
45
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *):where(ul, ol) {
46
+ margin: 0 0 var(--rb-space-3);
47
+ padding-inline-start: var(--rb-space-4);
48
+ }
49
+
50
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *):where(a) {
51
+ color: var(--rb-accent);
52
+ }
53
+
54
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *)::selection {
55
+ background: var(--rb-accent);
56
+ color: var(--rb-accent-fg);
57
+ }
@@ -0,0 +1,44 @@
1
+ /* concrete-signal-light — alert / callout
2
+ * A square-cornered surface panel with a 6px solid left bar — thicker than
3
+ * the library norm, read like a hazard stripe. */
4
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--rb-space-1);
8
+ padding: var(--rb-space-3) var(--rb-space-4);
9
+ background: var(--rb-surface);
10
+ border: 1px solid var(--rb-border);
11
+ border-left: 6px solid var(--rb-accent);
12
+ border-radius: var(--rb-radius);
13
+ color: var(--rb-text);
14
+ font-size: var(--rb-text-sm);
15
+ }
16
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert__title {
17
+ text-transform: uppercase;
18
+ font-weight: var(--rb-font-weight-bold);
19
+ letter-spacing: var(--rb-label-tracking);
20
+ }
21
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--info {
22
+ border-left-color: var(--rb-info);
23
+ }
24
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--success {
25
+ border-left-color: var(--rb-success);
26
+ }
27
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--warning {
28
+ border-left-color: var(--rb-warning);
29
+ }
30
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--danger {
31
+ border-left-color: var(--rb-danger);
32
+ }
33
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--info .rb-alert__title {
34
+ color: var(--rb-info);
35
+ }
36
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--success .rb-alert__title {
37
+ color: var(--rb-success);
38
+ }
39
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--warning .rb-alert__title {
40
+ color: var(--rb-warning);
41
+ }
42
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--danger .rb-alert__title {
43
+ color: var(--rb-danger);
44
+ }
@@ -0,0 +1,38 @@
1
+ /* concrete-signal-light — badge / status chip
2
+ * A stamped label: a 16%-tint fill of its hue behind full-strength text, plus
3
+ * a 1px solid border of that same hue — badges get a border here, unlike
4
+ * softer themes, to keep the stamped-label feel. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-badge {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: var(--rb-space-1);
9
+ padding: 2px var(--rb-space-2);
10
+ border: 1px solid var(--rb-accent);
11
+ border-radius: var(--rb-radius-pill);
12
+ background: var(--rb-accent-wash);
13
+ color: var(--rb-accent);
14
+ text-transform: uppercase;
15
+ font-weight: var(--rb-font-weight-bold);
16
+ font-size: 11px;
17
+ letter-spacing: var(--rb-label-tracking);
18
+ }
19
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-badge--info {
20
+ border-color: var(--rb-info);
21
+ background: color-mix(in srgb, var(--rb-info) 16%, transparent);
22
+ color: var(--rb-info);
23
+ }
24
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-badge--success {
25
+ border-color: var(--rb-success);
26
+ background: color-mix(in srgb, var(--rb-success) 16%, transparent);
27
+ color: var(--rb-success);
28
+ }
29
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-badge--warning {
30
+ border-color: var(--rb-warning);
31
+ background: color-mix(in srgb, var(--rb-warning) 16%, transparent);
32
+ color: var(--rb-warning);
33
+ }
34
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-badge--danger {
35
+ border-color: var(--rb-danger);
36
+ background: color-mix(in srgb, var(--rb-danger) 16%, transparent);
37
+ color: var(--rb-danger);
38
+ }
@@ -0,0 +1,98 @@
1
+ /* concrete-signal-light — button
2
+ * Uppercase, heavy weight — the industrial label voice. Default is an
3
+ * outlined ghost; --primary is the one solid accent fill and carries the
4
+ * theme's signature press interaction: the offset shadow disappears and the
5
+ * button translates into the surface by the shadow's own offset, like a
6
+ * stamped card being pressed flat. */
7
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ gap: var(--rb-space-2);
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
+ text-transform: uppercase;
18
+ font-family: var(--rb-font-body);
19
+ font-weight: var(--rb-font-weight-bold);
20
+ font-size: var(--rb-text-sm);
21
+ letter-spacing: var(--rb-label-tracking);
22
+ line-height: 1;
23
+ cursor: pointer;
24
+ transition:
25
+ border-color var(--rb-transition),
26
+ color var(--rb-transition);
27
+ }
28
+ /* --sm: compact size for inline/table-row actions (composes with any variant) */
29
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--sm {
30
+ padding: var(--rb-space-1) var(--rb-space-3);
31
+ font-size: calc(var(--rb-text-sm) - 1px);
32
+ }
33
+ /* --icon: square icon-only hit target (>=2rem); pair with .rb-btn (+ an
34
+ * optional color variant) — inherits color/border/hover/focus from it. */
35
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-icon-btn {
36
+ padding: var(--rb-space-2);
37
+ min-width: 2rem;
38
+ min-height: 2rem;
39
+ gap: 0;
40
+ justify-content: center;
41
+ line-height: 1;
42
+ }
43
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn:hover,
44
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn:focus-visible {
45
+ border-color: var(--rb-accent);
46
+ color: var(--rb-accent);
47
+ outline: none;
48
+ }
49
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary {
50
+ background: var(--rb-accent);
51
+ border-color: var(--rb-accent);
52
+ color: var(--rb-accent-fg);
53
+ box-shadow: var(--rb-shadow-sm);
54
+ transition:
55
+ transform var(--rb-transition),
56
+ box-shadow var(--rb-transition);
57
+ }
58
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary:hover,
59
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary:focus-visible,
60
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary:active {
61
+ border-color: var(--rb-accent);
62
+ color: var(--rb-accent-fg);
63
+ outline: none;
64
+ transform: translate(2px, 2px);
65
+ box-shadow: none;
66
+ }
67
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--accent {
68
+ background: var(--rb-accent-wash);
69
+ border-color: var(--rb-accent);
70
+ color: var(--rb-accent);
71
+ }
72
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--danger {
73
+ background: transparent;
74
+ border-color: var(--rb-danger);
75
+ color: var(--rb-danger);
76
+ }
77
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--ghost {
78
+ background: transparent;
79
+ border-color: transparent;
80
+ color: var(--rb-text-soft);
81
+ }
82
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--ghost:hover,
83
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--ghost:focus-visible {
84
+ background: var(--rb-surface-2);
85
+ border-color: var(--rb-border);
86
+ color: var(--rb-text);
87
+ }
88
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn:disabled {
89
+ opacity: 0.5;
90
+ cursor: not-allowed;
91
+ }
92
+
93
+ @media (prefers-reduced-motion: reduce) {
94
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn,
95
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary {
96
+ transition: none;
97
+ }
98
+ }
@@ -0,0 +1,21 @@
1
+ /* concrete-signal-light — card
2
+ * A poured-concrete panel: square corners, a thicker-than-usual structural
3
+ * border, and a hard offset shadow instead of blur — depth reads as a
4
+ * physically stamped slab, not a glow. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-card {
6
+ padding: var(--rb-space-5);
7
+ background: var(--rb-surface);
8
+ border: 1px solid var(--rb-border-strong);
9
+ border-radius: var(--rb-radius);
10
+ color: var(--rb-text);
11
+ box-shadow: var(--rb-shadow-sm);
12
+ }
13
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-card--raised {
14
+ box-shadow: var(--rb-shadow-lg);
15
+ }
16
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-card > :first-child {
17
+ margin-top: 0;
18
+ }
19
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-card > :last-child {
20
+ margin-bottom: 0;
21
+ }
@@ -0,0 +1,33 @@
1
+ /* concrete-signal-light — dialog (native <dialog>)
2
+ * A square-cornered slab dropped onto a flat, unblurred backdrop — this
3
+ * theme never uses blur/glass, so the scrim behind the dialog stays flat. */
4
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog {
5
+ padding: 0;
6
+ max-width: min(92vw, 32rem);
7
+ width: calc(100vw - 2rem);
8
+ background: var(--rb-surface);
9
+ border: 2px solid var(--rb-border-strong);
10
+ border-radius: var(--rb-radius);
11
+ color: var(--rb-text);
12
+ box-shadow: var(--rb-shadow-lg);
13
+ }
14
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog::backdrop {
15
+ background: rgba(0, 0, 0, 0.6);
16
+ }
17
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog__body {
18
+ padding: var(--rb-space-5);
19
+ }
20
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog__title {
21
+ margin: 0 0 var(--rb-space-3);
22
+ text-transform: uppercase;
23
+ font-family: var(--rb-font-display);
24
+ font-weight: var(--rb-font-weight-bold);
25
+ letter-spacing: var(--rb-label-tracking);
26
+ }
27
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog__actions {
28
+ display: flex;
29
+ justify-content: flex-end;
30
+ gap: var(--rb-space-2);
31
+ padding: var(--rb-space-3) var(--rb-space-5);
32
+ border-top: 1px solid var(--rb-border);
33
+ }