@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
@@ -43,9 +43,21 @@
43
43
  }
44
44
 
45
45
  :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(h1, h2, h3, h4, h5, h6) {
46
+ margin: 0 0 var(--rb-space-3);
46
47
  font-family: var(--rb-font-display);
47
48
  font-weight: var(--rb-font-weight-medium);
48
49
  letter-spacing: var(--rb-heading-tracking);
50
+ line-height: 1.15;
51
+ text-wrap: balance;
52
+ }
53
+
54
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(p) {
55
+ margin: 0 0 var(--rb-space-3);
56
+ }
57
+
58
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(ul, ol) {
59
+ margin: 0 0 var(--rb-space-3);
60
+ padding-inline-start: var(--rb-space-4);
49
61
  }
50
62
 
51
63
  :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(a) {
@@ -19,6 +19,21 @@
19
19
  color var(--rb-transition),
20
20
  box-shadow var(--rb-transition);
21
21
  }
22
+ /* --sm: compact size for inline/table-row actions (composes with any variant) */
23
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--sm {
24
+ padding: var(--rb-space-1) var(--rb-space-2);
25
+ font-size: calc(var(--rb-text-sm) - 1px);
26
+ }
27
+ /* --icon: square icon-only hit target (>=2rem); pair with .rb-btn (+ an
28
+ * optional color variant) — inherits color/border/hover/focus from it. */
29
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-icon-btn {
30
+ padding: var(--rb-space-2);
31
+ min-width: 2rem;
32
+ min-height: 2rem;
33
+ gap: 0;
34
+ justify-content: center;
35
+ line-height: 1;
36
+ }
22
37
  :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:hover,
23
38
  :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:focus-visible {
24
39
  border-color: var(--rb-accent-border);
@@ -61,6 +76,16 @@
61
76
  color: var(--rb-danger);
62
77
  }
63
78
 
79
+ /* ghost: minimal-emphasis variant — no border until hover reveals a surface fill */
80
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--ghost {
81
+ border-color: transparent;
82
+ color: var(--rb-text-soft);
83
+ }
84
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--ghost:hover,
85
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--ghost:focus-visible {
86
+ background: var(--rb-surface-2);
87
+ }
88
+
64
89
  :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:disabled {
65
90
  opacity: 0.5;
66
91
  cursor: not-allowed;
@@ -28,6 +28,14 @@
28
28
  inset 2px 0 0 0 var(--rb-accent-2),
29
29
  0 0 12px var(--rb-accent-2-glow);
30
30
  }
31
+ /* --active: the current route, styled as the resting version of :hover */
32
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-link--active {
33
+ background: var(--rb-surface);
34
+ color: var(--rb-accent-2);
35
+ box-shadow:
36
+ inset 2px 0 0 0 var(--rb-accent-2),
37
+ 0 0 12px var(--rb-accent-2-glow);
38
+ }
31
39
 
32
40
  @keyframes rb-lp-pulse-glow {
33
41
  0%,
@@ -0,0 +1,19 @@
1
+ /* luminous-precision — 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="luminous-precision"], [data-rb-style="luminous-precision"] *).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="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-pre.rb-log {
18
+ overflow-x: hidden;
19
+ }
@@ -0,0 +1,7 @@
1
+ /* luminous-precision — 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="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-muted {
5
+ color: var(--rb-text-faint);
6
+ font-style: italic;
7
+ }
@@ -0,0 +1,17 @@
1
+ /* luminous-precision — nav rail (vertical sidebar container)
2
+ * Flush edge chrome, not a floating card: fixed-width flex column, the same
3
+ * glass panel + blur as .rb-card, a hairline right edge. Composes with
4
+ * .rb-link for items -- active/hover are entirely that component's own
5
+ * tokens, nothing new here. */
6
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-nav-rail {
7
+ display: flex;
8
+ flex-direction: column;
9
+ flex-shrink: 0;
10
+ gap: var(--rb-space-1);
11
+ width: 14rem;
12
+ padding: var(--rb-space-3);
13
+ background: var(--rb-surface-glass);
14
+ border-right: 1px solid var(--rb-border);
15
+ backdrop-filter: blur(var(--rb-blur));
16
+ -webkit-backdrop-filter: blur(var(--rb-blur));
17
+ }
@@ -0,0 +1,14 @@
1
+ /* luminous-precision — command / log block
2
+ * Styled <pre> for shell commands or short log output: the surface-sunken
3
+ * well (already the theme's documented "log wells" token), hairline border,
4
+ * small mono, scrolls horizontally instead of wrapping. */
5
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-pre {
6
+ margin: 0;
7
+ padding: var(--rb-space-3) var(--rb-space-4);
8
+ background: var(--rb-surface-sunken);
9
+ border: 1px solid var(--rb-border);
10
+ border-radius: var(--rb-radius);
11
+ font-family: var(--rb-font-mono);
12
+ font-size: var(--rb-text-sm);
13
+ overflow-x: auto;
14
+ }
@@ -1,5 +1,6 @@
1
1
  /* luminous-precision — progress bar & spinner */
2
2
  :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress {
3
+ appearance: none;
3
4
  display: block;
4
5
  width: 100%;
5
6
  height: 0.5rem;
@@ -8,14 +9,22 @@
8
9
  border-radius: 1rem;
9
10
  overflow: hidden;
10
11
  }
11
- :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress__bar {
12
- height: 100%;
12
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress::-webkit-progress-bar {
13
+ background: var(--rb-surface-sunken);
14
+ }
15
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress::-webkit-progress-value {
13
16
  background: var(--rb-accent);
14
17
  box-shadow: 0 0 8px var(--rb-accent-glow);
15
- border-radius: 1rem;
16
- transition: width var(--rb-transition);
17
18
  }
18
- :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress__bar--accent {
19
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress::-moz-progress-bar {
20
+ background: var(--rb-accent);
21
+ box-shadow: 0 0 8px var(--rb-accent-glow);
22
+ }
23
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress--accent::-webkit-progress-value {
24
+ background: var(--rb-accent-2);
25
+ box-shadow: 0 0 8px var(--rb-accent-2-glow);
26
+ }
27
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-progress--accent::-moz-progress-bar {
19
28
  background: var(--rb-accent-2);
20
29
  box-shadow: 0 0 8px var(--rb-accent-2-glow);
21
30
  }
@@ -0,0 +1,89 @@
1
+ /* luminous-precision — 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 glow, not shadow: a filled segment and the current node
15
+ * both take the same accent-glow box-shadow .rb-progress's value fill already
16
+ * uses. */
17
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper {
18
+ display: flex;
19
+ isolation: isolate;
20
+ list-style: none;
21
+ margin: 0;
22
+ padding: 0;
23
+ }
24
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper__step {
25
+ position: relative;
26
+ flex: 1;
27
+ min-width: 0;
28
+ display: flex;
29
+ flex-direction: column;
30
+ align-items: center;
31
+ gap: var(--rb-space-2);
32
+ text-align: center;
33
+ }
34
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper__step:not(:first-child)::before {
35
+ content: "";
36
+ position: absolute;
37
+ top: 1rem;
38
+ right: 50%;
39
+ width: 100%;
40
+ height: 2px;
41
+ background: var(--rb-surface-sunken);
42
+ z-index: -1;
43
+ transition: background-color var(--rb-transition), box-shadow var(--rb-transition);
44
+ }
45
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper__step:not(:first-child).rb-stepper--complete::before,
46
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper__step:not(:first-child).rb-stepper--current::before {
47
+ background: var(--rb-accent);
48
+ box-shadow: 0 0 8px var(--rb-accent-glow);
49
+ }
50
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper__node {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ width: 2rem;
55
+ height: 2rem;
56
+ border: 2px solid transparent;
57
+ border-radius: var(--rb-radius-pill);
58
+ background: var(--rb-surface-2);
59
+ color: var(--rb-text-faint);
60
+ font-size: var(--rb-text-sm);
61
+ font-weight: var(--rb-font-weight-medium);
62
+ }
63
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper__label {
64
+ font-size: var(--rb-text-sm);
65
+ color: var(--rb-text-faint);
66
+ }
67
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper--complete .rb-stepper__node {
68
+ background: var(--rb-accent);
69
+ color: var(--rb-accent-fg);
70
+ }
71
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper--complete .rb-stepper__label {
72
+ color: var(--rb-text);
73
+ }
74
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper--current .rb-stepper__node {
75
+ background: var(--rb-surface);
76
+ border-color: var(--rb-accent);
77
+ color: var(--rb-accent);
78
+ box-shadow: 0 0 8px var(--rb-accent-glow);
79
+ }
80
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper--current .rb-stepper__label {
81
+ color: var(--rb-accent);
82
+ font-weight: var(--rb-font-weight-medium);
83
+ }
84
+
85
+ @media (prefers-reduced-motion: reduce) {
86
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-stepper__step:not(:first-child)::before {
87
+ transition: none;
88
+ }
89
+ }
@@ -19,6 +19,10 @@
19
19
  padding: var(--rb-space-2) var(--rb-space-3);
20
20
  border-bottom: 1px solid var(--rb-border);
21
21
  }
22
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table .rb-num {
23
+ text-align: right;
24
+ font-variant-numeric: tabular-nums;
25
+ }
22
26
  :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table tbody tr {
23
27
  transition: background var(--rb-transition), box-shadow var(--rb-transition);
24
28
  }
@@ -26,3 +30,16 @@
26
30
  background: var(--rb-surface-glass);
27
31
  box-shadow: inset 2px 0 0 0 var(--rb-accent-2);
28
32
  }
33
+ /* --interactive: clickable rows (a tabindex tr, or a row-wrapping button/link) —
34
+ * pointer cursor plus a keyboard-equivalent of the hover glass/teal-bar and a
35
+ * focus ring. */
36
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table--interactive tbody tr {
37
+ cursor: pointer;
38
+ }
39
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table--interactive tbody tr:focus-visible,
40
+ :where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-table--interactive tbody tr:has(:focus-visible) {
41
+ outline: 2px solid var(--rb-accent);
42
+ outline-offset: -2px;
43
+ background: var(--rb-surface-glass);
44
+ box-shadow: inset 2px 0 0 0 var(--rb-accent-2);
45
+ }
@@ -66,6 +66,11 @@ Webfonts are declared in `styles/manifest.json` (`luminous-precision.fonts`);
66
66
  consumers load that stylesheet (Sora + JetBrains Mono) or self-host. The token
67
67
  stacks fall back to system families when the webfonts are absent.
68
68
 
69
+ Bare (unclassed) `h1`-`h6` carry the Sora display voice directly — weight 600,
70
+ `--rb-heading-tracking`, `--rb-space-3` margin below. Bare `p` shares that
71
+ margin; bare `ul`/`ol` add it too, with `--rb-space-4` marker indent (real
72
+ disc/decimal markers, not stripped).
73
+
69
74
  ## Shape & effects
70
75
 
71
76
  - Radius `0.5rem` for buttons and inputs; `1rem` for cards, dialogs, and large
@@ -86,9 +91,18 @@ Class prefix `rb-` (shared token/class contract with the other themes).
86
91
 
87
92
  - **Card** `.rb-card` — glass pane, 1rem radius, lit top edge.
88
93
  - **NavLink** `.rb-link` — glass list row; hover shifts to solid indigo and
89
- lights a 2px teal bar on the left edge.
90
- - **Button** `.rb-btn` ghost by default; `--primary` is the one solid fill
91
- (orchid, dark text), `--accent` teal ghost, `--danger` rose ghost.
94
+ lights a 2px teal bar on the left edge; `--active` applies that same
95
+ treatment at rest, for the current route.
96
+ - **Nav rail** `.rb-nav-rail` the sidebar container: 14rem fixed-width flex
97
+ column, the same glass panel + blur as `.rb-card`, a hairline right edge.
98
+ Composes with `.rb-link` for items; introduces no active-state convention
99
+ of its own.
100
+ - **Button** `.rb-btn` — border-only by default (already reads ghost-like);
101
+ `--primary` is the one solid fill (orchid, dark text), `--accent` teal
102
+ ghost, `--danger` rose ghost, `--ghost` drops the border entirely until
103
+ hover reveals a surface fill — the lowest-emphasis tier. `--sm` is
104
+ the compact size for inline and table-row actions. `.rb-icon-btn` is a
105
+ square icon-only hit target (>=2rem), paired with `.rb-btn`.
92
106
  - **Form** `.rb-input`, `.rb-textarea`, `.rb-select`, `.rb-label`,
93
107
  `.rb-field`, `.rb-checkbox`, `.rb-radio`, `.rb-switch`, `.rb-choice` —
94
108
  checked/focus states glow teal.
@@ -99,16 +113,37 @@ Class prefix `rb-` (shared token/class contract with the other themes).
99
113
  Sora title, blurred obsidian backdrop.
100
114
  - **Tabs** `.rb-tabs`/`.rb-tab`/`.rb-tabpanel` — active tab underlined in
101
115
  teal with text glow.
102
- - **Table** `.rb-table` — lit header rule; row hover shifts glass and lights
103
- the teal left bar.
116
+ - **Table** `.rb-table` (+ `.rb-num`) — lit header rule; row hover shifts glass and lights
117
+ the teal left bar. `--interactive` marks clickable rows: pointer cursor,
118
+ plus a focus-visible ring (and the same glass/teal-bar wash) for a
119
+ `tabindex` row or a row-wrapping button/link.
104
120
  - **Progress** `.rb-progress`, **Spinner** `.rb-spinner` — glowing orchid
105
121
  indicators (`--accent` bar variant in teal).
122
+ - **Stepper** `.rb-stepper` (+ `__step` / `__node` / `__label`, `--complete` /
123
+ `--current` / `--upcoming`) — a milestone rail: complete nodes solid accent
124
+ with a checkmark, current a surface-fill ring with an accent border, both
125
+ the rail fill and the current node glowing with the same `--rb-accent-glow` box-shadow
126
+ `.rb-progress`'s value fill uses. Upcoming reads faint surface-2; rail track is
127
+ `surface-sunken`, and each connector segment picks up that same glow once
128
+ its own step is reached (complete or current) -- no separate progress
129
+ value to keep in sync with the step states.
130
+ - **Muted text** `.rb-muted` — faint secondary/empty-state text;
131
+ `color: var(--rb-text-faint)`, italic.
132
+ - **Pre / log block** `.rb-pre` — command/log `<pre>`; the surface-sunken
133
+ well (already documented above as this theme's "log wells" token),
134
+ hairline border, radius, small mono, horizontal scroll. Pair with `.rb-log`
135
+ (`<pre class="rb-pre rb-log">`) for multi-line streaming output: a capped
136
+ 16rem height with vertical scroll, wrapped lines instead of horizontal
137
+ scroll, and roomier line-height for dense text.
106
138
 
107
139
  This port carries nazuraki's original component set; the rackbops-specific
108
- `eyebrow`, `tabstrip`, `wordmark`, and `card--raised` surfaces are not part of
109
- it. It also keeps nazuraki's `.rb-badge--primary` variant (orchid pill), which
110
- the other rackbops themes don't definea `@rackbops/ui-react` `Badge` never
111
- emits it, so it is a theme extra, harmless where unused.
140
+ `eyebrow`, `tabstrip`, and `wordmark` surfaces are not part of it.
141
+ `.rb-card--raised` is also absent: nazuraki's own card never had a second
142
+ elevation tier, so the port doesn't invent one — `Card raised` is a
143
+ documented no-op here (see `contract.test.mjs`'s allowlist). It also keeps
144
+ nazuraki's `.rb-badge--primary` variant (orchid pill), which the other
145
+ rackbops themes don't define — a `@rackbops/ui-react` `Badge` never emits it,
146
+ so it is a theme extra, harmless where unused.
112
147
 
113
148
  ## Code syntax
114
149
 
@@ -3,6 +3,7 @@
3
3
  @import "./base.css";
4
4
  @import "./components/card.css";
5
5
  @import "./components/link.css";
6
+ @import "./components/nav-rail.css";
6
7
  @import "./components/button.css";
7
8
  @import "./components/form.css";
8
9
  @import "./components/badge.css";
@@ -11,3 +12,7 @@
11
12
  @import "./components/tabs.css";
12
13
  @import "./components/table.css";
13
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";
package/manifest.json CHANGED
@@ -34,6 +34,26 @@
34
34
  "fonts": [
35
35
  "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600;700;800&family=Inter:wght@400;600&family=JetBrains+Mono:wght@500;700&display=swap"
36
36
  ]
37
+ },
38
+ "concrete-signal": {
39
+ "scheme": "dark",
40
+ "fonts": []
41
+ },
42
+ "concrete-signal-light": {
43
+ "scheme": "light",
44
+ "fonts": []
45
+ },
46
+ "amber-hearth": {
47
+ "scheme": "light",
48
+ "fonts": []
49
+ },
50
+ "amber-ember": {
51
+ "scheme": "dark",
52
+ "fonts": []
53
+ },
54
+ "mono-field": {
55
+ "scheme": "light",
56
+ "fonts": []
37
57
  }
38
58
  }
39
59
  }
@@ -0,0 +1,59 @@
1
+ /* mono-field — base styles
2
+ * Scoped defaults. Requires tokens.css. Fonts are system stacks — nothing to
3
+ * load, this theme renders offline.
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="mono-field"]) {
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
+ -webkit-font-smoothing: antialiased;
16
+ }
17
+
18
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *),
19
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *)::before,
20
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *)::after {
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ :where(html[data-rb-style="mono-field"]) body {
25
+ margin: 0;
26
+ min-height: 100vh;
27
+ background-color: var(--rb-bg);
28
+ color: var(--rb-text);
29
+ font-family: var(--rb-font-body);
30
+ font-weight: var(--rb-font-weight);
31
+ -webkit-font-smoothing: antialiased;
32
+ }
33
+
34
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *):where(h1, h2, h3, h4, h5, h6) {
35
+ margin: 0 0 var(--rb-space-3);
36
+ font-family: var(--rb-font-display);
37
+ font-weight: var(--rb-font-weight-bold);
38
+ letter-spacing: var(--rb-heading-tracking);
39
+ line-height: 1.3;
40
+ text-wrap: balance;
41
+ }
42
+
43
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *):where(p) {
44
+ margin: 0 0 var(--rb-space-3);
45
+ }
46
+
47
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *):where(ul, ol) {
48
+ margin: 0 0 var(--rb-space-3);
49
+ padding-inline-start: var(--rb-space-4);
50
+ }
51
+
52
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *):where(a) {
53
+ color: var(--rb-accent);
54
+ }
55
+
56
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *)::selection {
57
+ background: var(--rb-accent);
58
+ color: var(--rb-accent-fg);
59
+ }
@@ -0,0 +1,35 @@
1
+ /* mono-field — alert / callout
2
+ * A surface-2 panel — a rare use of the theme's one non-white surface, to
3
+ * read as "flagged". A thin 2px left bar carries the semantic color; kept
4
+ * quiet, not bold. */
5
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-alert {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--rb-space-1);
9
+ padding: var(--rb-space-3) var(--rb-space-4);
10
+ background: var(--rb-surface-2);
11
+ border: 1px solid var(--rb-border);
12
+ border-left: 2px solid var(--rb-accent);
13
+ border-radius: var(--rb-radius);
14
+ color: var(--rb-text);
15
+ font-size: var(--rb-text-sm);
16
+ }
17
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-alert__title {
18
+ display: block;
19
+ margin-bottom: var(--rb-space-1);
20
+ color: var(--rb-text);
21
+ font-weight: var(--rb-font-weight-medium);
22
+ font-size: var(--rb-text-sm);
23
+ }
24
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-alert--info {
25
+ border-left-color: var(--rb-info);
26
+ }
27
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-alert--success {
28
+ border-left-color: var(--rb-success);
29
+ }
30
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-alert--warning {
31
+ border-left-color: var(--rb-warning);
32
+ }
33
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-alert--danger {
34
+ border-left-color: var(--rb-danger);
35
+ }
@@ -0,0 +1,34 @@
1
+ /* mono-field — badge
2
+ * A pill: a 12%-alpha tint of its hue behind full-strength (but desaturated)
3
+ * text. Normal case, weight 500 — no shouting, even here (unusual for a
4
+ * badge, but matches this theme's no-shouting rule). */
5
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).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-radius: var(--rb-radius-pill);
11
+ color: var(--rb-accent);
12
+ background: color-mix(in srgb, var(--rb-accent) 12%, transparent);
13
+ font-family: var(--rb-font-body);
14
+ font-size: 12px;
15
+ font-weight: var(--rb-font-weight-medium);
16
+ letter-spacing: var(--rb-label-tracking);
17
+ text-transform: none;
18
+ }
19
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-badge--info {
20
+ background: color-mix(in srgb, var(--rb-info) 12%, transparent);
21
+ color: var(--rb-info);
22
+ }
23
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-badge--success {
24
+ background: color-mix(in srgb, var(--rb-success) 12%, transparent);
25
+ color: var(--rb-success);
26
+ }
27
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-badge--warning {
28
+ background: color-mix(in srgb, var(--rb-warning) 12%, transparent);
29
+ color: var(--rb-warning);
30
+ }
31
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-badge--danger {
32
+ background: color-mix(in srgb, var(--rb-danger) 12%, transparent);
33
+ color: var(--rb-danger);
34
+ }
@@ -0,0 +1,101 @@
1
+ /* mono-field — button
2
+ * Plain bordered ghost on white by default; --primary is the one solid
3
+ * ink-blue fill. No hover lift, no glow ring — just a barely-there shadow
4
+ * change on primary and a plain accent outline on focus. */
5
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ gap: var(--rb-space-2);
10
+ padding: var(--rb-space-2) var(--rb-space-4);
11
+ background: var(--rb-surface);
12
+ border: 1px solid var(--rb-border);
13
+ border-radius: var(--rb-radius);
14
+ color: var(--rb-text);
15
+ font-family: var(--rb-font-body);
16
+ font-weight: var(--rb-font-weight-medium);
17
+ font-size: var(--rb-text-sm);
18
+ text-transform: none;
19
+ line-height: 1;
20
+ cursor: pointer;
21
+ transition:
22
+ border-color var(--rb-transition),
23
+ background var(--rb-transition),
24
+ color var(--rb-transition),
25
+ box-shadow var(--rb-transition);
26
+ }
27
+ /* --sm: compact size for inline/table-row actions (composes with any variant) */
28
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--sm {
29
+ padding: var(--rb-space-1) var(--rb-space-3);
30
+ font-size: calc(var(--rb-text-sm) - 1px);
31
+ }
32
+ /* --icon: square icon-only hit target (>=2rem); pair with .rb-btn (+ an
33
+ * optional color variant) — inherits color/border/hover/focus from it. */
34
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-icon-btn {
35
+ padding: var(--rb-space-2);
36
+ min-width: 2rem;
37
+ min-height: 2rem;
38
+ gap: 0;
39
+ justify-content: center;
40
+ line-height: 1;
41
+ }
42
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn:hover {
43
+ border-color: var(--rb-border-strong);
44
+ }
45
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn:focus-visible {
46
+ outline: 2px solid var(--rb-accent);
47
+ outline-offset: 2px;
48
+ }
49
+
50
+ /* Primary — the one solid fill. Barely-there shadow lift on hover only. */
51
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--primary {
52
+ background: var(--rb-accent);
53
+ border-color: var(--rb-accent);
54
+ color: var(--rb-accent-fg);
55
+ box-shadow: var(--rb-shadow-sm);
56
+ }
57
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--primary:hover {
58
+ box-shadow: var(--rb-shadow-lg);
59
+ }
60
+
61
+ /* Accent — an accent-wash chip. */
62
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--accent {
63
+ background: var(--rb-accent-wash);
64
+ border-color: transparent;
65
+ color: var(--rb-accent);
66
+ }
67
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--accent:hover {
68
+ border-color: var(--rb-accent);
69
+ }
70
+
71
+ /* Danger — a danger-colored ghost. */
72
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--danger {
73
+ background: var(--rb-surface);
74
+ border-color: var(--rb-border);
75
+ color: var(--rb-danger);
76
+ }
77
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--danger:hover {
78
+ border-color: var(--rb-danger);
79
+ }
80
+
81
+ /* Ghost — chromeless. */
82
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--ghost {
83
+ background: transparent;
84
+ border-color: transparent;
85
+ color: var(--rb-text-soft);
86
+ }
87
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn--ghost:hover {
88
+ border-color: transparent;
89
+ color: var(--rb-text);
90
+ }
91
+
92
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn:disabled {
93
+ opacity: 0.5;
94
+ cursor: not-allowed;
95
+ }
96
+
97
+ @media (prefers-reduced-motion: reduce) {
98
+ :where([data-rb-style="mono-field"], [data-rb-style="mono-field"] *).rb-btn {
99
+ transition: none;
100
+ }
101
+ }