@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
@@ -21,6 +21,20 @@
21
21
  :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-table tbody tr:hover td {
22
22
  background: var(--rb-surface-2);
23
23
  }
24
+ /* --interactive: clickable rows (a tabindex tr, or a row-wrapping button/link) —
25
+ * pointer cursor plus a keyboard-equivalent of the hover wash and a focus ring. */
26
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-table--interactive tbody tr {
27
+ cursor: pointer;
28
+ }
29
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-table--interactive tbody tr:focus-visible,
30
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-table--interactive tbody tr:has(:focus-visible) {
31
+ outline: 2px solid var(--rb-accent);
32
+ outline-offset: -2px;
33
+ }
34
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-table--interactive tbody tr:focus-visible td,
35
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-table--interactive tbody tr:has(:focus-visible) td {
36
+ background: var(--rb-surface-2);
37
+ }
24
38
  :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-table .rb-num {
25
39
  text-align: right;
26
40
  font-variant-numeric: tabular-nums;
@@ -51,6 +51,12 @@ Muted-on-surface is tuned to clear WCAG AA (4.5:1) on every surface; the light
51
51
  - **Numerals:** `font-variant-numeric: tabular-nums` everywhere data is shown.
52
52
  - **Labels** (eyebrows, badges, table headers): mono, uppercase, ~11px, tracked
53
53
  `0.06em`.
54
+ - **Bare tags:** unclassed `h1`-`h6` pick up the mono display voice directly —
55
+ weight 600, tracking `-0.01em`, `--rb-space-3` margin below. `.rb-card`
56
+ renders a bare `<h3>` and gets this treatment too, since `card.css` declares
57
+ no heading rule of its own. Bare `p` shares that margin; bare `ul`/`ol` add
58
+ it too, with `--rb-space-4` marker indent (real disc/decimal markers, not
59
+ stripped).
54
60
 
55
61
  ## Shape & effects
56
62
 
@@ -76,10 +82,16 @@ Class prefix `rb-`; shared token/class contract with the other themes.
76
82
  into the text; the spark mark stays solid accent.
77
83
  - **Button** `.rb-btn` — surface-2 ghost by default; `--primary` is the one solid
78
84
  violet fill (dark ink), `--accent` a violet-wash chip, `--danger` a rose ghost,
79
- `--ghost` chromeless.
85
+ `--ghost` chromeless. `--sm` is a compact size — tighter padding, type down
86
+ ~1px — for inline and table-row actions. `.rb-icon-btn` is a square icon-only
87
+ hit target (>=2rem) — pair it with `.rb-btn` (+ an optional color variant)
88
+ for close/edit/delete glyph buttons.
80
89
  - **Card** `.rb-card` (+ `--raised`) — solid panel, hairline border, shadow-sm.
81
90
  - **NavLink** `.rb-link` — tree/sidebar row; hover fills to surface-2 and lights a
82
91
  2px accent bar on the left edge; `--active` carries the accent wash.
92
+ - **Nav rail** `.rb-nav-rail` — the sidebar container: 14rem fixed-width flex
93
+ column, surface background, a hairline right edge. Composes with `.rb-link`
94
+ for items; introduces no active-state convention of its own.
83
95
  - **Form** `.rb-input` / `.rb-textarea` / `.rb-select` / `.rb-label` / `.rb-field`
84
96
  / `.rb-choice` / `.rb-checkbox` / `.rb-radio` / `.rb-switch` — sunken fields;
85
97
  focus swaps to the accent border + wash ring; controls use `accent-color`.
@@ -93,11 +105,27 @@ Class prefix `rb-`; shared token/class contract with the other themes.
93
105
  - **Tabstrip** `.rb-tabstrip` — top-level view nav: bordered pill buttons; active
94
106
  gets accent text + wash + accent-tinted border.
95
107
  - **Table** `.rb-table` (+ `.rb-num`) — dense data table, faint header rule,
96
- tabular numerals, row hover to surface-2.
108
+ tabular numerals, row hover to surface-2. `--interactive` marks clickable
109
+ rows: pointer cursor, plus a focus-visible ring (and the surface-2 wash) for
110
+ a `tabindex` row or a row-wrapping button/link.
97
111
  - **Progress / Spinner** `.rb-progress` / `.rb-spinner` — sunken trough with an
98
112
  accent fill; the spinner is a single accent arc.
113
+ - **Stepper** `.rb-stepper` (+ `__step` / `__node` / `__label`, `--complete` /
114
+ `--current` / `--upcoming`) — a milestone rail: complete nodes solid accent
115
+ with a checkmark, current a surface-fill ring with an accent border and a
116
+ `shadow-lg` lift, upcoming faint surface-2. Rail track is `surface-sunken`; each
117
+ connector segment fills to accent once its own step is reached
118
+ (complete or current), so the rail can't drift out of sync with the
119
+ step states.
99
120
  - **Eyebrow** `.rb-eyebrow` — small mono uppercase section label in the accent,
100
121
  wide-tracked; subtler than the studio eyebrow (no leading rule).
122
+ - **Muted text** `.rb-muted` — faint secondary/empty-state text;
123
+ `color: var(--rb-text-faint)`, italic.
124
+ - **Pre / log block** `.rb-pre` — command/log `<pre>`; surface-sunken
125
+ background, hairline border, radius, small mono, horizontal scroll. Pair
126
+ with `.rb-log` (`<pre class="rb-pre rb-log">`) for multi-line streaming
127
+ output: a capped 16rem height with vertical scroll, wrapped lines instead
128
+ of horizontal scroll, and roomier line-height for dense text.
101
129
 
102
130
  ## Code syntax
103
131
 
@@ -4,6 +4,7 @@
4
4
  @import "./components/button.css";
5
5
  @import "./components/card.css";
6
6
  @import "./components/link.css";
7
+ @import "./components/nav-rail.css";
7
8
  @import "./components/form.css";
8
9
  @import "./components/badge.css";
9
10
  @import "./components/alert.css";
@@ -11,6 +12,10 @@
11
12
  @import "./components/tabs.css";
12
13
  @import "./components/table.css";
13
14
  @import "./components/progress.css";
15
+ @import "./components/stepper.css";
14
16
  @import "./components/eyebrow.css";
15
17
  @import "./components/wordmark.css";
16
18
  @import "./components/tabstrip.css";
19
+ @import "./components/muted.css";
20
+ @import "./components/pre.css";
21
+ @import "./components/log.css";
@@ -31,6 +31,26 @@
31
31
  font-variant-numeric: tabular-nums;
32
32
  }
33
33
 
34
+ /* Monospace IS the display voice here — same "Display / wordmark" treatment
35
+ * design.md documents, wired to bare headings too. */
36
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *):where(h1, h2, h3, h4, h5, h6) {
37
+ margin: 0 0 var(--rb-space-3);
38
+ font-family: var(--rb-font-display);
39
+ font-weight: var(--rb-font-weight-medium);
40
+ letter-spacing: var(--rb-heading-tracking);
41
+ line-height: 1.15;
42
+ text-wrap: balance;
43
+ }
44
+
45
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *):where(p) {
46
+ margin: 0 0 var(--rb-space-3);
47
+ }
48
+
49
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *):where(ul, ol) {
50
+ margin: 0 0 var(--rb-space-3);
51
+ padding-inline-start: var(--rb-space-4);
52
+ }
53
+
34
54
  :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *):where(a) {
35
55
  color: var(--rb-accent);
36
56
  }
@@ -21,6 +21,21 @@
21
21
  background var(--rb-transition),
22
22
  color var(--rb-transition);
23
23
  }
24
+ /* --sm: compact size for inline/table-row actions (composes with any variant) */
25
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--sm {
26
+ padding: var(--rb-space-1) var(--rb-space-3);
27
+ font-size: calc(var(--rb-text-sm) - 1px);
28
+ }
29
+ /* --icon: square icon-only hit target (>=2rem); pair with .rb-btn (+ an
30
+ * optional color variant) — inherits color/border/hover/focus from it. */
31
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-icon-btn {
32
+ padding: var(--rb-space-2);
33
+ min-width: 2rem;
34
+ min-height: 2rem;
35
+ gap: 0;
36
+ justify-content: center;
37
+ line-height: 1;
38
+ }
24
39
  :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn:hover,
25
40
  :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn:focus-visible {
26
41
  border-color: var(--rb-accent);
@@ -0,0 +1,19 @@
1
+ /* arcane-parchment — log / terminal block
2
+ * Pairs with .rb-pre for the shared look (surface-sunken well, hairline
3
+ * border, radius, small mono) -- .rb-log itself only adds what changes for
4
+ * multi-line streaming output: a capped height with vertical scroll, wrapped
5
+ * long lines instead of .rb-pre's horizontal scroll, and a touch more
6
+ * line-height so dense text stays readable. Use together on one element:
7
+ * <pre class="rb-pre rb-log">. */
8
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-log {
9
+ max-height: 16rem;
10
+ overflow-y: auto;
11
+ white-space: pre-wrap;
12
+ overflow-wrap: anywhere;
13
+ line-height: 1.5;
14
+ }
15
+ /* Specificity-pinned (not import-order-dependent) override of .rb-pre's
16
+ * overflow-x: auto -- .rb-log wraps instead of scrolling horizontally. */
17
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-pre.rb-log {
18
+ overflow-x: hidden;
19
+ }
@@ -0,0 +1,7 @@
1
+ /* arcane-parchment — muted / empty-state text
2
+ * Faint secondary text — captions, meta, "No results yet." style empty
3
+ * states. Italic distinguishes it from regular body copy at a glance. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-muted {
5
+ color: var(--rb-text-faint);
6
+ font-style: italic;
7
+ }
@@ -0,0 +1,14 @@
1
+ /* arcane-parchment — nav rail (vertical sidebar container)
2
+ * Flush edge chrome, not a floating card: fixed-width flex column, surface
3
+ * background, a hairline right edge. Composes with .rb-link for items --
4
+ * active/hover are entirely that component's own tokens, nothing new here. */
5
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-nav-rail {
6
+ display: flex;
7
+ flex-direction: column;
8
+ flex-shrink: 0;
9
+ gap: var(--rb-space-1);
10
+ width: 14rem;
11
+ padding: var(--rb-space-3);
12
+ background: var(--rb-surface);
13
+ border-right: 1px solid var(--rb-border);
14
+ }
@@ -0,0 +1,13 @@
1
+ /* arcane-parchment — command / log block
2
+ * Styled <pre> for shell commands or short log output: sunken well,
3
+ * hairline border, small mono, scrolls horizontally instead of wrapping. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-pre {
5
+ margin: 0;
6
+ padding: var(--rb-space-3) var(--rb-space-4);
7
+ background: var(--rb-surface-sunken);
8
+ border: 1px solid var(--rb-border);
9
+ border-radius: var(--rb-radius);
10
+ font-family: var(--rb-font-mono);
11
+ font-size: var(--rb-text-sm);
12
+ overflow-x: auto;
13
+ }
@@ -0,0 +1,87 @@
1
+ /* arcane-parchment — stepper (delivery / milestone tracker)
2
+ * <ol class="rb-stepper"> with one
3
+ * <li class="rb-stepper__step rb-stepper--complete|current|upcoming"> per
4
+ * milestone: a .rb-stepper__node icon/number circle + .rb-stepper__label.
5
+ * Each non-first step draws its OWN connector segment back to the previous
6
+ * step's node (right: 50%; width: 100% of that step's own flex slice, self-
7
+ * aligning to node centers regardless of item count or label width -- a
8
+ * single full-width rail can't do this without knowing how many steps there
9
+ * are, since node centers sit inset within their own slice). isolation:
10
+ * isolate keeps every segment's negative z-index scoped to this stepper, so
11
+ * it paints behind every node without needing per-node z-index of its own.
12
+ * A segment fills once its OWN step is reached (complete or current) -- the
13
+ * same state class already on the <li>, not a second progress mechanism. No
14
+ * glow here -- depth is flat/shadow-based, so the current node's elevation
15
+ * is the theme's own shadow-lg, not a glow. */
16
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper {
17
+ display: flex;
18
+ isolation: isolate;
19
+ list-style: none;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper__step {
24
+ position: relative;
25
+ flex: 1;
26
+ min-width: 0;
27
+ display: flex;
28
+ flex-direction: column;
29
+ align-items: center;
30
+ gap: var(--rb-space-2);
31
+ text-align: center;
32
+ }
33
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper__step:not(:first-child)::before {
34
+ content: "";
35
+ position: absolute;
36
+ top: 1rem;
37
+ right: 50%;
38
+ width: 100%;
39
+ height: 2px;
40
+ background: var(--rb-surface-sunken);
41
+ z-index: -1;
42
+ transition: background-color var(--rb-transition);
43
+ }
44
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper__step:not(:first-child).rb-stepper--complete::before,
45
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper__step:not(:first-child).rb-stepper--current::before {
46
+ background: var(--rb-accent);
47
+ }
48
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper__node {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ width: 2rem;
53
+ height: 2rem;
54
+ border: 2px solid transparent;
55
+ border-radius: var(--rb-radius-pill);
56
+ background: var(--rb-surface-2);
57
+ color: var(--rb-text-faint);
58
+ font-size: var(--rb-text-sm);
59
+ font-weight: var(--rb-font-weight-medium);
60
+ }
61
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper__label {
62
+ font-size: var(--rb-text-sm);
63
+ color: var(--rb-text-faint);
64
+ }
65
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper--complete .rb-stepper__node {
66
+ background: var(--rb-accent);
67
+ color: var(--rb-accent-fg);
68
+ }
69
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper--complete .rb-stepper__label {
70
+ color: var(--rb-text);
71
+ }
72
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper--current .rb-stepper__node {
73
+ background: var(--rb-surface);
74
+ border-color: var(--rb-accent);
75
+ color: var(--rb-accent);
76
+ box-shadow: var(--rb-shadow-lg);
77
+ }
78
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper--current .rb-stepper__label {
79
+ color: var(--rb-accent);
80
+ font-weight: var(--rb-font-weight-medium);
81
+ }
82
+
83
+ @media (prefers-reduced-motion: reduce) {
84
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-stepper__step:not(:first-child)::before {
85
+ transition: none;
86
+ }
87
+ }
@@ -21,6 +21,20 @@
21
21
  :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table tbody tr:hover td {
22
22
  background: var(--rb-surface-2);
23
23
  }
24
+ /* --interactive: clickable rows (a tabindex tr, or a row-wrapping button/link) —
25
+ * pointer cursor plus a keyboard-equivalent of the hover wash and a focus ring. */
26
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table--interactive tbody tr {
27
+ cursor: pointer;
28
+ }
29
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table--interactive tbody tr:focus-visible,
30
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table--interactive tbody tr:has(:focus-visible) {
31
+ outline: 2px solid var(--rb-accent);
32
+ outline-offset: -2px;
33
+ }
34
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table--interactive tbody tr:focus-visible td,
35
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table--interactive tbody tr:has(:focus-visible) td {
36
+ background: var(--rb-surface-2);
37
+ }
24
38
  :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table .rb-num {
25
39
  text-align: right;
26
40
  font-variant-numeric: tabular-nums;
@@ -45,7 +45,10 @@ hues appear. Muted-on-surface is tuned to clear WCAG AA (4.5:1) on every surface
45
45
 
46
46
  Identical to arcane-obsidian: monospace display voice (the wordmark, weight 600,
47
47
  tracking `-0.01em`) over a `system-ui` body (weight 400); `tabular-nums` wherever
48
- data is shown; mono uppercase labels tracked `0.06em`.
48
+ data is shown; mono uppercase labels tracked `0.06em`. Bare `h1`-`h6`/`p`/`ul`/`ol`
49
+ get the same treatment as arcane-obsidian too: unclassed headlines carry that
50
+ same mono voice with `--rb-space-3` margin, and bare `ul`/`ol` add
51
+ `--rb-space-4` marker indent with real disc/decimal markers.
49
52
 
50
53
  ## Shape & effects
51
54
 
@@ -64,11 +67,12 @@ data is shown; mono uppercase labels tracked `0.06em`.
64
67
  ## Components
65
68
 
66
69
  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.
70
+ tokens: `.rb-wordmark` (+ `__spark`), `.rb-btn` (+ `--primary/--accent/--danger/--ghost`, `--sm` compact size, `.rb-icon-btn` icon-only square),
71
+ `.rb-card` (+ `--raised`), `.rb-link`, `.rb-nav-rail`, the form set, `.rb-badge`, `.rb-alert`,
72
+ `.rb-dialog`, `.rb-tabs`, `.rb-tabstrip`, `.rb-table` (+ `.rb-num`, `--interactive`),
73
+ `.rb-progress` / `.rb-spinner`, `.rb-stepper`, `.rb-eyebrow`, `.rb-muted`, `.rb-pre` (+ `.rb-log`). See
74
+ arcane-obsidian's `design.md` for the per-component notes — the behaviour is
75
+ the same; only the palette is light.
72
76
 
73
77
  ## Code syntax
74
78
 
@@ -4,6 +4,7 @@
4
4
  @import "./components/button.css";
5
5
  @import "./components/card.css";
6
6
  @import "./components/link.css";
7
+ @import "./components/nav-rail.css";
7
8
  @import "./components/form.css";
8
9
  @import "./components/badge.css";
9
10
  @import "./components/alert.css";
@@ -11,6 +12,10 @@
11
12
  @import "./components/tabs.css";
12
13
  @import "./components/table.css";
13
14
  @import "./components/progress.css";
15
+ @import "./components/stepper.css";
14
16
  @import "./components/eyebrow.css";
15
17
  @import "./components/wordmark.css";
16
18
  @import "./components/tabstrip.css";
19
+ @import "./components/muted.css";
20
+ @import "./components/pre.css";
21
+ @import "./components/log.css";
@@ -0,0 +1,57 @@
1
+ /* concrete-signal — 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"]) {
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"], [data-rb-style="concrete-signal"] *),
18
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *)::before,
19
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *)::after {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ :where(html[data-rb-style="concrete-signal"]) 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"], [data-rb-style="concrete-signal"] *):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"], [data-rb-style="concrete-signal"] *):where(p) {
42
+ margin: 0 0 var(--rb-space-3);
43
+ }
44
+
45
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *):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"], [data-rb-style="concrete-signal"] *):where(a) {
51
+ color: var(--rb-accent);
52
+ }
53
+
54
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *)::selection {
55
+ background: var(--rb-accent);
56
+ color: var(--rb-accent-fg);
57
+ }
@@ -0,0 +1,44 @@
1
+ /* concrete-signal — 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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).rb-alert--info {
22
+ border-left-color: var(--rb-info);
23
+ }
24
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-alert--success {
25
+ border-left-color: var(--rb-success);
26
+ }
27
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-alert--warning {
28
+ border-left-color: var(--rb-warning);
29
+ }
30
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-alert--danger {
31
+ border-left-color: var(--rb-danger);
32
+ }
33
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-alert--info .rb-alert__title {
34
+ color: var(--rb-info);
35
+ }
36
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-alert--success .rb-alert__title {
37
+ color: var(--rb-success);
38
+ }
39
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-alert--warning .rb-alert__title {
40
+ color: var(--rb-warning);
41
+ }
42
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-alert--danger .rb-alert__title {
43
+ color: var(--rb-danger);
44
+ }
@@ -0,0 +1,38 @@
1
+ /* concrete-signal — 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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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 — 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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).rb-btn:hover,
44
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).rb-btn--primary:hover,
59
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-btn--primary:focus-visible,
60
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).rb-btn--ghost {
78
+ background: transparent;
79
+ border-color: transparent;
80
+ color: var(--rb-text-soft);
81
+ }
82
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-btn--ghost:hover,
83
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).rb-btn,
95
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-btn--primary {
96
+ transition: none;
97
+ }
98
+ }
@@ -0,0 +1,21 @@
1
+ /* concrete-signal — 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"], [data-rb-style="concrete-signal"] *).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"], [data-rb-style="concrete-signal"] *).rb-card--raised {
14
+ box-shadow: var(--rb-shadow-lg);
15
+ }
16
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-card > :first-child {
17
+ margin-top: 0;
18
+ }
19
+ :where([data-rb-style="concrete-signal"], [data-rb-style="concrete-signal"] *).rb-card > :last-child {
20
+ margin-bottom: 0;
21
+ }