@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
@@ -19,6 +19,15 @@
19
19
  border-color: var(--rb-border-strong);
20
20
  box-shadow: var(--rb-shadow-lg);
21
21
  }
22
+ /* --raised: the hover-lifted look, at rest — still lifts a further notch on hover */
23
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-card--raised {
24
+ transform: translateY(-4px);
25
+ border-color: var(--rb-border-strong);
26
+ box-shadow: var(--rb-shadow-lg);
27
+ }
28
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-card--raised:hover {
29
+ transform: translateY(-6px);
30
+ }
22
31
  :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-card__tag {
23
32
  display: flex;
24
33
  align-items: center;
@@ -0,0 +1,19 @@
1
+ /* rackbops-noir — 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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-pre.rb-log {
18
+ overflow-x: hidden;
19
+ }
@@ -0,0 +1,7 @@
1
+ /* rackbops-noir — muted / empty-state text
2
+ * Faint secondary text — captions, meta, "No results yet." style empty
3
+ * states. Italic reads naturally in this editorial, print-like theme. */
4
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-muted {
5
+ color: var(--rb-text-faint);
6
+ font-style: italic;
7
+ }
@@ -0,0 +1,14 @@
1
+ /* rackbops-noir — 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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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
+ /* rackbops-noir — 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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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
+ }
@@ -23,6 +23,7 @@
23
23
  padding-top: 3px;
24
24
  }
25
25
  :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principle__body h3 {
26
+ margin: 0; /* the tight 7px gap below is the following p's own margin-top */
26
27
  font-size: 1.16rem;
27
28
  }
28
29
  :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principle__body p {
@@ -0,0 +1,87 @@
1
+ /* rackbops-noir — 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.
14
+ * Elevation here is soft shadow, not frosted glass or glow, so the current
15
+ * node's lift is the theme's own shadow-lg. */
16
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-stepper {
17
+ display: flex;
18
+ isolation: isolate;
19
+ list-style: none;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-stepper__step:not(:first-child).rb-stepper--complete::before,
45
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-stepper__step:not(:first-child).rb-stepper--current::before {
46
+ background: var(--rb-accent);
47
+ }
48
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-stepper__label {
62
+ font-size: var(--rb-text-sm);
63
+ color: var(--rb-text-faint);
64
+ }
65
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-stepper--complete .rb-stepper__node {
66
+ background: var(--rb-accent);
67
+ color: var(--rb-accent-fg);
68
+ }
69
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-stepper--complete .rb-stepper__label {
70
+ color: var(--rb-text);
71
+ }
72
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-stepper__step:not(:first-child)::before {
85
+ transition: none;
86
+ }
87
+ }
@@ -25,6 +25,24 @@
25
25
  :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table tbody tr:hover td {
26
26
  background: var(--rb-surface-2);
27
27
  }
28
+ /* --interactive: clickable rows (a tabindex tr, or a row-wrapping button/link) —
29
+ * pointer cursor plus a keyboard-equivalent of the hover wash and a focus ring,
30
+ * matching the editorial themes' bolder 2.5px ring. */
31
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table--interactive tbody tr {
32
+ cursor: pointer;
33
+ }
34
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table--interactive tbody tr:focus-visible,
35
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table--interactive tbody tr:has(:focus-visible) {
36
+ outline: 2.5px solid var(--rb-accent);
37
+ outline-offset: -3px;
38
+ /* base.css's global :focus-visible rule also sets a 3px border-radius (meant
39
+ * for buttons/inputs); cancel it here since a table row shouldn't inherit it. */
40
+ border-radius: 0;
41
+ }
42
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table--interactive tbody tr:focus-visible td,
43
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table--interactive tbody tr:has(:focus-visible) td {
44
+ background: var(--rb-surface-2);
45
+ }
28
46
  :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table .rb-num {
29
47
  text-align: right;
30
48
  font-variant-numeric: tabular-nums;
@@ -46,6 +46,9 @@ Identical to rackbops-studio: the system sans at weight **800** for headlines
46
46
  (tracking `-0.02em`, `text-wrap: balance`), the same sans body, and the mono voice
47
47
  (`ui-monospace, "SF Mono", …`) for eyebrows, nav, tags, and the rack readouts. The
48
48
  eyebrow is mono, uppercase, tracked `0.18em`, accent-coloured, with a leading rule.
49
+ Bare `h1`-`h6`/`p`/`ul`/`ol` get the same treatment as rackbops-studio too:
50
+ unclassed headlines, `--rb-space-3` margin on headings/paragraphs/lists, and
51
+ `--rb-space-4` marker indent with real disc/decimal markers on `ul`/`ol`.
49
52
 
50
53
  ## Shape & effects
51
54
 
@@ -65,9 +68,9 @@ eyebrow is mono, uppercase, tracked `0.18em`, accent-coloured, with a leading ru
65
68
  ## Components
66
69
 
67
70
  Class prefix `rb-`; the full rackbops-studio inventory, styled identically from
68
- tokens — `.rb-btn`, `.rb-card` (+ `__tag`), `.rb-link`, the form set, `.rb-badge`,
69
- `.rb-alert`, `.rb-dialog`, `.rb-tabs`, `.rb-table`, `.rb-progress`/`.rb-spinner`,
70
- `.rb-eyebrow` — plus the studio extras `.rb-rack` (equaliser panel; its panel palette
71
+ tokens — `.rb-btn` (+ `--sm` compact size, `.rb-icon-btn` icon-only square), `.rb-card` (+ `__tag`), `.rb-link`, `.rb-nav-rail`, the form set, `.rb-badge`,
72
+ `.rb-alert`, `.rb-dialog`, `.rb-tabs`, `.rb-table` (+ `--interactive`), `.rb-progress`/`.rb-spinner`, `.rb-stepper`,
73
+ `.rb-eyebrow`, `.rb-muted`, `.rb-pre` (+ `.rb-log`) — plus the studio extras `.rb-rack` (equaliser panel; its panel palette
71
74
  matches rackbops.com's dark-mode rack — a near-canvas block set off by its border), `.rb-principles`/
72
75
  `.rb-principle`, and `.rb-tags`/`.rb-tag`. See rackbops-studio's `design.md` for
73
76
  the per-component notes. The Boppy mascot asset ships with rackbops-studio
@@ -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,7 +12,11 @@
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/rack.css";
16
18
  @import "./components/principle.css";
17
19
  @import "./components/tag.css";
20
+ @import "./components/muted.css";
21
+ @import "./components/pre.css";
22
+ @import "./components/log.css";
@@ -28,8 +28,8 @@
28
28
  }
29
29
 
30
30
  /* Heavy, balanced headlines with tight tracking — the studio's editorial voice. */
31
- :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(h1, h2, h3) {
32
- margin: 0;
31
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(h1, h2, h3, h4, h5, h6) {
32
+ margin: 0 0 var(--rb-space-3);
33
33
  font-family: var(--rb-font-display);
34
34
  font-weight: var(--rb-font-weight-bold);
35
35
  letter-spacing: var(--rb-heading-tracking);
@@ -37,6 +37,15 @@
37
37
  text-wrap: balance;
38
38
  }
39
39
 
40
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(p) {
41
+ margin: 0 0 var(--rb-space-3);
42
+ }
43
+
44
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(ul, ol) {
45
+ margin: 0 0 var(--rb-space-3);
46
+ padding-inline-start: var(--rb-space-4);
47
+ }
48
+
40
49
  :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(a) {
41
50
  color: inherit;
42
51
  }
@@ -20,6 +20,22 @@
20
20
  border-color var(--rb-transition) ease,
21
21
  color var(--rb-transition) ease;
22
22
  }
23
+ /* --sm: compact size for inline/table-row actions; drops to the theme's small
24
+ * type scale. The optional arrow inherits font-size, so it scales too. */
25
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--sm {
26
+ padding: 7px 14px;
27
+ font-size: var(--rb-text-sm);
28
+ }
29
+ /* --icon: square icon-only hit target (>=2rem); pair with .rb-btn (+ an
30
+ * optional color variant) — inherits color/hover/focus from it. */
31
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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
+ }
23
39
  :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn:active {
24
40
  transform: translateY(1px);
25
41
  }
@@ -19,6 +19,15 @@
19
19
  border-color: var(--rb-border-strong);
20
20
  box-shadow: var(--rb-shadow-lg);
21
21
  }
22
+ /* --raised: the hover-lifted look, at rest — still lifts a further notch on hover */
23
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-card--raised {
24
+ transform: translateY(-4px);
25
+ border-color: var(--rb-border-strong);
26
+ box-shadow: var(--rb-shadow-lg);
27
+ }
28
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-card--raised:hover {
29
+ transform: translateY(-6px);
30
+ }
22
31
  :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-card__tag {
23
32
  display: flex;
24
33
  align-items: center;
@@ -0,0 +1,19 @@
1
+ /* rackbops-studio — 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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-pre.rb-log {
18
+ overflow-x: hidden;
19
+ }
@@ -0,0 +1,7 @@
1
+ /* rackbops-studio — muted / empty-state text
2
+ * Faint secondary text — captions, meta, "No results yet." style empty
3
+ * states. Italic reads naturally in this editorial, print-like theme. */
4
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-muted {
5
+ color: var(--rb-text-faint);
6
+ font-style: italic;
7
+ }
@@ -0,0 +1,14 @@
1
+ /* rackbops-studio — 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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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
+ /* rackbops-studio — 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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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
+ }
@@ -23,6 +23,7 @@
23
23
  padding-top: 3px;
24
24
  }
25
25
  :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-principle__body h3 {
26
+ margin: 0; /* the tight 7px gap below is the following p's own margin-top */
26
27
  font-size: 1.16rem;
27
28
  }
28
29
  :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-principle__body p {
@@ -0,0 +1,87 @@
1
+ /* rackbops-studio — 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.
14
+ * Elevation here is soft shadow on white, not frosted glass or glow, so the
15
+ * current node's lift is the theme's own shadow-lg. */
16
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-stepper {
17
+ display: flex;
18
+ isolation: isolate;
19
+ list-style: none;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-stepper__step:not(:first-child).rb-stepper--complete::before,
45
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-stepper__step:not(:first-child).rb-stepper--current::before {
46
+ background: var(--rb-accent);
47
+ }
48
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-stepper__label {
62
+ font-size: var(--rb-text-sm);
63
+ color: var(--rb-text-faint);
64
+ }
65
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-stepper--complete .rb-stepper__node {
66
+ background: var(--rb-accent);
67
+ color: var(--rb-accent-fg);
68
+ }
69
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-stepper--complete .rb-stepper__label {
70
+ color: var(--rb-text);
71
+ }
72
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-stepper__step:not(:first-child)::before {
85
+ transition: none;
86
+ }
87
+ }
@@ -25,6 +25,24 @@
25
25
  :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table tbody tr:hover td {
26
26
  background: var(--rb-surface-2);
27
27
  }
28
+ /* --interactive: clickable rows (a tabindex tr, or a row-wrapping button/link) —
29
+ * pointer cursor plus a keyboard-equivalent of the hover wash and a focus ring,
30
+ * matching the editorial themes' bolder 2.5px ring. */
31
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table--interactive tbody tr {
32
+ cursor: pointer;
33
+ }
34
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table--interactive tbody tr:focus-visible,
35
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table--interactive tbody tr:has(:focus-visible) {
36
+ outline: 2.5px solid var(--rb-accent);
37
+ outline-offset: -3px;
38
+ /* base.css's global :focus-visible rule also sets a 3px border-radius (meant
39
+ * for buttons/inputs); cancel it here since a table row shouldn't inherit it. */
40
+ border-radius: 0;
41
+ }
42
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table--interactive tbody tr:focus-visible td,
43
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table--interactive tbody tr:has(:focus-visible) td {
44
+ background: var(--rb-surface-2);
45
+ }
28
46
  :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table .rb-num {
29
47
  text-align: right;
30
48
  font-variant-numeric: tabular-nums;
@@ -52,6 +52,10 @@ component). The marketing site itself uses no colour beyond the accent.
52
52
  the rack readouts.
53
53
  - **Eyebrow:** mono, uppercase, wide-tracked (`0.18em`), accent-coloured, with a
54
54
  short leading rule — the kicker above every section headline.
55
+ - **Bare tags:** unclassed `h1`-`h6` carry the same headline treatment above
56
+ with no `.rb-*` class needed, plus `--rb-space-3` margin below. Bare `p`
57
+ gets that same margin; bare `ul`/`ol` add it too, with `--rb-space-4`
58
+ marker indent (real disc/decimal markers, not stripped).
55
59
 
56
60
  ## Shape & effects
57
61
 
@@ -101,10 +105,16 @@ Class prefix `rb-`; shared token/class contract with the other themes.
101
105
 
102
106
  - **Button** `.rb-btn` — `--primary` ink-fill→vermillion, `--accent` solid
103
107
  vermillion, `--ghost` bordered outline, `--danger` rose outline; `.rb-btn__arrow`
104
- slides on hover.
108
+ slides on hover. `--sm` is a compact size for inline/table-row actions — the
109
+ arrow scales with it. `.rb-icon-btn` is a square icon-only hit target
110
+ (>=2rem), paired with `.rb-btn`.
105
111
  - **Card** `.rb-card` (+ `__tag`) — white panel, soft shadow, `-4px` hover lift.
112
+ `--raised` makes that lift the resting state (a further `-6px` on hover).
106
113
  - **NavLink** `.rb-link` — mono header nav; hover fills to a surface pill; accent
107
114
  on the active route.
115
+ - **Nav rail** `.rb-nav-rail` — the sidebar container: 14rem fixed-width flex
116
+ column, surface background, a hairline right edge. Composes with `.rb-link`
117
+ for items; introduces no active-state convention of its own.
108
118
  - **Form** `.rb-input` / `.rb-textarea` / `.rb-select` / `.rb-label` / `.rb-field`
109
119
  / `.rb-choice` / `.rb-checkbox` / `.rb-radio` / `.rb-switch` — white fields;
110
120
  focus is a vermillion border + wash ring.
@@ -116,10 +126,27 @@ Class prefix `rb-`; shared token/class contract with the other themes.
116
126
  - **Tabs** `.rb-tabs` / `.rb-tab` / `.rb-tabpanel` — understated; active goes ink
117
127
  with a vermillion underbar.
118
128
  - **Table** `.rb-table` (+ `.rb-num`) — mono uppercase header rule, generous rows,
119
- quiet hover wash.
129
+ quiet hover wash. `--interactive` marks clickable rows: pointer cursor, plus
130
+ a bolder 2.5px focus-visible ring (and the same hover wash) for a `tabindex`
131
+ row or a row-wrapping button/link.
120
132
  - **Progress / Spinner** `.rb-progress` / `.rb-spinner` — pill trough with a
121
133
  vermillion fill; single-arc spinner.
134
+ - **Stepper** `.rb-stepper` (+ `__step` / `__node` / `__label`, `--complete` /
135
+ `--current` / `--upcoming`) — a milestone rail: complete nodes solid accent
136
+ with a checkmark, current a white-on-accent-border ring with `shadow-lg`
137
+ lift, upcoming faint surface-2. Rail track is `surface-sunken`; each
138
+ connector segment fills to accent once its own step is reached
139
+ (complete or current), so the rail can't drift out of sync with the
140
+ step states.
122
141
  - **Eyebrow** `.rb-eyebrow` — the mono kicker with leading rule.
142
+ - **Muted text** `.rb-muted` — faint secondary/empty-state text;
143
+ `color: var(--rb-text-faint)`, italic — reads naturally in this editorial,
144
+ print-like theme.
145
+ - **Pre / log block** `.rb-pre` — command/log `<pre>`; surface-sunken
146
+ background, hairline border, radius, small mono, horizontal scroll. Pair
147
+ with `.rb-log` (`<pre class="rb-pre rb-log">`) for multi-line streaming
148
+ output: a capped 16rem height with vertical scroll, wrapped lines instead
149
+ of horizontal scroll, and roomier line-height for dense text.
123
150
 
124
151
  ### Theme extras
125
152
 
@@ -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,7 +12,11 @@
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/rack.css";
16
18
  @import "./components/principle.css";
17
19
  @import "./components/tag.css";
20
+ @import "./components/muted.css";
21
+ @import "./components/pre.css";
22
+ @import "./components/log.css";
@@ -41,13 +41,25 @@
41
41
  background-attachment: fixed;
42
42
  }
43
43
 
44
- :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *):where(h1, h2, h3, h4) {
44
+ :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *):where(h1, h2, h3, h4, h5, h6) {
45
+ margin: 0 0 var(--rb-space-3);
45
46
  font-family: var(--rb-font-display);
46
47
  font-weight: var(--rb-font-weight-bold);
47
48
  letter-spacing: var(--rb-heading-tracking);
49
+ line-height: 1.15;
50
+ text-wrap: balance;
48
51
  color: var(--rb-text);
49
52
  }
50
53
 
54
+ :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *):where(p) {
55
+ margin: 0 0 var(--rb-space-3);
56
+ }
57
+
58
+ :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *):where(ul, ol) {
59
+ margin: 0 0 var(--rb-space-3);
60
+ padding-inline-start: var(--rb-space-4);
61
+ }
62
+
51
63
  :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *):where(a) {
52
64
  color: var(--rb-accent);
53
65
  }
@@ -20,6 +20,23 @@
20
20
  box-shadow 0.2s ease,
21
21
  transform 0.2s var(--rb-ease-bounce);
22
22
  }
23
+ /* --sm: compact size for inline/table-row actions (composes with any variant);
24
+ * keeps the pill radius inherited from .rb-btn. */
25
+ :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).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) — keeps the pill radius inherited from .rb-btn,
31
+ * which reads as a circle on a square box. */
32
+ :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-icon-btn {
33
+ padding: var(--rb-space-2);
34
+ min-width: 2rem;
35
+ min-height: 2rem;
36
+ gap: 0;
37
+ justify-content: center;
38
+ line-height: 1;
39
+ }
23
40
  :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:hover,
24
41
  :where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:focus-visible {
25
42
  background: rgba(255, 255, 255, 0.6);
@@ -0,0 +1,19 @@
1
+ /* summer-cloud — 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="summer-cloud"], [data-rb-style="summer-cloud"] *).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="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-pre.rb-log {
18
+ overflow-x: hidden;
19
+ }