@rackbops/styles 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/all.css +5 -0
  2. package/amber-ember/base.css +61 -0
  3. package/amber-ember/components/alert.css +30 -0
  4. package/amber-ember/components/badge.css +32 -0
  5. package/amber-ember/components/button.css +90 -0
  6. package/amber-ember/components/card.css +24 -0
  7. package/amber-ember/components/dialog.css +33 -0
  8. package/amber-ember/components/form.css +72 -0
  9. package/amber-ember/components/link.css +47 -0
  10. package/amber-ember/components/log.css +19 -0
  11. package/amber-ember/components/muted.css +7 -0
  12. package/amber-ember/components/nav-rail.css +14 -0
  13. package/amber-ember/components/pre.css +13 -0
  14. package/amber-ember/components/progress.css +42 -0
  15. package/amber-ember/components/stepper.css +87 -0
  16. package/amber-ember/components/table.css +50 -0
  17. package/amber-ember/components/tabs.css +46 -0
  18. package/amber-ember/design.md +78 -0
  19. package/amber-ember/index.css +18 -0
  20. package/amber-ember/tokens.css +72 -0
  21. package/amber-hearth/base.css +61 -0
  22. package/amber-hearth/components/alert.css +30 -0
  23. package/amber-hearth/components/badge.css +32 -0
  24. package/amber-hearth/components/button.css +90 -0
  25. package/amber-hearth/components/card.css +24 -0
  26. package/amber-hearth/components/dialog.css +33 -0
  27. package/amber-hearth/components/form.css +72 -0
  28. package/amber-hearth/components/link.css +47 -0
  29. package/amber-hearth/components/log.css +19 -0
  30. package/amber-hearth/components/muted.css +7 -0
  31. package/amber-hearth/components/nav-rail.css +14 -0
  32. package/amber-hearth/components/pre.css +13 -0
  33. package/amber-hearth/components/progress.css +42 -0
  34. package/amber-hearth/components/stepper.css +87 -0
  35. package/amber-hearth/components/table.css +50 -0
  36. package/amber-hearth/components/tabs.css +46 -0
  37. package/amber-hearth/design.md +146 -0
  38. package/amber-hearth/index.css +18 -0
  39. package/amber-hearth/tokens.css +77 -0
  40. package/arcane-obsidian/base.css +20 -0
  41. package/arcane-obsidian/components/button.css +15 -0
  42. package/arcane-obsidian/components/log.css +19 -0
  43. package/arcane-obsidian/components/muted.css +7 -0
  44. package/arcane-obsidian/components/nav-rail.css +14 -0
  45. package/arcane-obsidian/components/pre.css +13 -0
  46. package/arcane-obsidian/components/stepper.css +87 -0
  47. package/arcane-obsidian/components/table.css +14 -0
  48. package/arcane-obsidian/design.md +30 -2
  49. package/arcane-obsidian/index.css +5 -0
  50. package/arcane-parchment/base.css +20 -0
  51. package/arcane-parchment/components/button.css +15 -0
  52. package/arcane-parchment/components/log.css +19 -0
  53. package/arcane-parchment/components/muted.css +7 -0
  54. package/arcane-parchment/components/nav-rail.css +14 -0
  55. package/arcane-parchment/components/pre.css +13 -0
  56. package/arcane-parchment/components/stepper.css +87 -0
  57. package/arcane-parchment/components/table.css +14 -0
  58. package/arcane-parchment/design.md +10 -6
  59. package/arcane-parchment/index.css +5 -0
  60. package/concrete-signal/base.css +57 -0
  61. package/concrete-signal/components/alert.css +44 -0
  62. package/concrete-signal/components/badge.css +38 -0
  63. package/concrete-signal/components/button.css +98 -0
  64. package/concrete-signal/components/card.css +21 -0
  65. package/concrete-signal/components/dialog.css +33 -0
  66. package/concrete-signal/components/form.css +138 -0
  67. package/concrete-signal/components/link.css +44 -0
  68. package/concrete-signal/components/log.css +19 -0
  69. package/concrete-signal/components/muted.css +7 -0
  70. package/concrete-signal/components/nav-rail.css +15 -0
  71. package/concrete-signal/components/pre.css +14 -0
  72. package/concrete-signal/components/progress.css +44 -0
  73. package/concrete-signal/components/stepper.css +83 -0
  74. package/concrete-signal/components/table.css +48 -0
  75. package/concrete-signal/components/tabs.css +49 -0
  76. package/concrete-signal/design.md +171 -0
  77. package/concrete-signal/index.css +18 -0
  78. package/concrete-signal/tokens.css +75 -0
  79. package/concrete-signal-light/base.css +57 -0
  80. package/concrete-signal-light/components/alert.css +44 -0
  81. package/concrete-signal-light/components/badge.css +38 -0
  82. package/concrete-signal-light/components/button.css +98 -0
  83. package/concrete-signal-light/components/card.css +21 -0
  84. package/concrete-signal-light/components/dialog.css +33 -0
  85. package/concrete-signal-light/components/form.css +138 -0
  86. package/concrete-signal-light/components/link.css +44 -0
  87. package/concrete-signal-light/components/log.css +19 -0
  88. package/concrete-signal-light/components/muted.css +7 -0
  89. package/concrete-signal-light/components/nav-rail.css +15 -0
  90. package/concrete-signal-light/components/pre.css +14 -0
  91. package/concrete-signal-light/components/progress.css +44 -0
  92. package/concrete-signal-light/components/stepper.css +84 -0
  93. package/concrete-signal-light/components/table.css +48 -0
  94. package/concrete-signal-light/components/tabs.css +49 -0
  95. package/concrete-signal-light/design.md +82 -0
  96. package/concrete-signal-light/index.css +18 -0
  97. package/concrete-signal-light/tokens.css +75 -0
  98. package/css-side-effect.d.ts +5 -0
  99. package/luminous-precision/base.css +12 -0
  100. package/luminous-precision/components/button.css +25 -0
  101. package/luminous-precision/components/link.css +8 -0
  102. package/luminous-precision/components/log.css +19 -0
  103. package/luminous-precision/components/muted.css +7 -0
  104. package/luminous-precision/components/nav-rail.css +17 -0
  105. package/luminous-precision/components/pre.css +14 -0
  106. package/luminous-precision/components/progress.css +14 -5
  107. package/luminous-precision/components/stepper.css +89 -0
  108. package/luminous-precision/components/table.css +17 -0
  109. package/luminous-precision/design.md +44 -9
  110. package/luminous-precision/index.css +5 -0
  111. package/manifest.json +20 -0
  112. package/mono-field/base.css +59 -0
  113. package/mono-field/components/alert.css +35 -0
  114. package/mono-field/components/badge.css +34 -0
  115. package/mono-field/components/button.css +101 -0
  116. package/mono-field/components/card.css +20 -0
  117. package/mono-field/components/dialog.css +34 -0
  118. package/mono-field/components/form.css +91 -0
  119. package/mono-field/components/link.css +47 -0
  120. package/mono-field/components/log.css +19 -0
  121. package/mono-field/components/muted.css +7 -0
  122. package/mono-field/components/nav-rail.css +14 -0
  123. package/mono-field/components/pre.css +13 -0
  124. package/mono-field/components/progress.css +42 -0
  125. package/mono-field/components/stepper.css +86 -0
  126. package/mono-field/components/table.css +47 -0
  127. package/mono-field/components/tabs.css +48 -0
  128. package/mono-field/design.md +151 -0
  129. package/mono-field/index.css +18 -0
  130. package/mono-field/tokens.css +76 -0
  131. package/neon-butterfly/base.css +18 -0
  132. package/neon-butterfly/components/button.css +26 -0
  133. package/neon-butterfly/components/link.css +10 -0
  134. package/neon-butterfly/components/log.css +19 -0
  135. package/neon-butterfly/components/muted.css +7 -0
  136. package/neon-butterfly/components/nav-rail.css +17 -0
  137. package/neon-butterfly/components/pre.css +13 -0
  138. package/neon-butterfly/components/progress.css +14 -5
  139. package/neon-butterfly/components/stepper.css +89 -0
  140. package/neon-butterfly/components/table.css +15 -0
  141. package/neon-butterfly/design.md +40 -4
  142. package/neon-butterfly/index.css +5 -0
  143. package/package.json +61 -32
  144. package/rackbops-noir/base.css +11 -2
  145. package/rackbops-noir/components/button.css +16 -0
  146. package/rackbops-noir/components/card.css +9 -0
  147. package/rackbops-noir/components/log.css +19 -0
  148. package/rackbops-noir/components/muted.css +7 -0
  149. package/rackbops-noir/components/nav-rail.css +14 -0
  150. package/rackbops-noir/components/pre.css +13 -0
  151. package/rackbops-noir/components/principle.css +1 -0
  152. package/rackbops-noir/components/stepper.css +87 -0
  153. package/rackbops-noir/components/table.css +18 -0
  154. package/rackbops-noir/design.md +6 -3
  155. package/rackbops-noir/index.css +5 -0
  156. package/rackbops-studio/base.css +11 -2
  157. package/rackbops-studio/components/button.css +16 -0
  158. package/rackbops-studio/components/card.css +9 -0
  159. package/rackbops-studio/components/log.css +19 -0
  160. package/rackbops-studio/components/muted.css +7 -0
  161. package/rackbops-studio/components/nav-rail.css +14 -0
  162. package/rackbops-studio/components/pre.css +13 -0
  163. package/rackbops-studio/components/principle.css +1 -0
  164. package/rackbops-studio/components/stepper.css +87 -0
  165. package/rackbops-studio/components/table.css +18 -0
  166. package/rackbops-studio/design.md +29 -2
  167. package/rackbops-studio/index.css +5 -0
  168. package/summer-cloud/base.css +13 -1
  169. package/summer-cloud/components/button.css +17 -0
  170. package/summer-cloud/components/log.css +19 -0
  171. package/summer-cloud/components/muted.css +8 -0
  172. package/summer-cloud/components/nav-rail.css +17 -0
  173. package/summer-cloud/components/pre.css +16 -0
  174. package/summer-cloud/components/progress.css +14 -8
  175. package/summer-cloud/components/stepper.css +90 -0
  176. package/summer-cloud/components/table.css +11 -0
  177. package/summer-cloud/design.md +41 -3
  178. package/summer-cloud/index.css +5 -0
@@ -0,0 +1,138 @@
1
+ /* concrete-signal-light — form controls: input, textarea, select, checkbox, radio, switch
2
+ * Sunken square-cornered fields; focus is a hard border-weight change (1px to
3
+ * 2px solid accent) — no soft wash ring, brutalism doesn't glow. Checked
4
+ * checkbox/radio/switch states are a flat accent fill, not a tinted ring. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-field {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--rb-space-1);
9
+ }
10
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-label {
11
+ color: var(--rb-text-soft);
12
+ text-transform: uppercase;
13
+ font-size: var(--rb-text-sm);
14
+ font-weight: var(--rb-font-weight-medium);
15
+ letter-spacing: var(--rb-label-tracking);
16
+ }
17
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-input,
18
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-textarea,
19
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-select {
20
+ display: block;
21
+ width: 100%;
22
+ padding: var(--rb-space-2) var(--rb-space-3);
23
+ background: var(--rb-surface-sunken);
24
+ border: 1px solid var(--rb-border);
25
+ border-radius: var(--rb-radius);
26
+ color: var(--rb-text);
27
+ font-family: var(--rb-font-body);
28
+ font-weight: var(--rb-font-weight);
29
+ font-size: var(--rb-text-sm);
30
+ transition: border-color var(--rb-transition);
31
+ }
32
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-textarea {
33
+ min-height: 5rem;
34
+ resize: vertical;
35
+ }
36
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-select {
37
+ appearance: none;
38
+ padding-right: 2.25rem;
39
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%235f5d58' stroke-width='1.5'/%3E%3C/svg%3E");
40
+ background-repeat: no-repeat;
41
+ background-position: right var(--rb-space-3) center;
42
+ }
43
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-input::placeholder,
44
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-textarea::placeholder {
45
+ color: var(--rb-text-faint);
46
+ }
47
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-input:focus,
48
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-textarea:focus,
49
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-select:focus {
50
+ outline: none;
51
+ border: 2px solid var(--rb-accent);
52
+ }
53
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-input[aria-invalid="true"],
54
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-textarea[aria-invalid="true"] {
55
+ border-color: var(--rb-danger);
56
+ }
57
+
58
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-choice {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ gap: var(--rb-space-2);
62
+ color: var(--rb-text);
63
+ font-size: var(--rb-text-sm);
64
+ cursor: pointer;
65
+ }
66
+
67
+ /* checkbox & radio — square, sunken; checked is a flat accent fill framed by
68
+ an inset ring of the field background, not a glow */
69
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-checkbox,
70
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-radio {
71
+ appearance: none;
72
+ width: 1.1rem;
73
+ height: 1.1rem;
74
+ margin: 0;
75
+ vertical-align: text-bottom;
76
+ background: var(--rb-surface-sunken);
77
+ border: 1px solid var(--rb-border);
78
+ border-radius: var(--rb-radius);
79
+ cursor: pointer;
80
+ transition: border-color var(--rb-transition), background var(--rb-transition);
81
+ }
82
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-checkbox:checked,
83
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-radio:checked {
84
+ background: var(--rb-accent);
85
+ border-color: var(--rb-accent);
86
+ box-shadow: inset 0 0 0 3px var(--rb-surface-sunken);
87
+ }
88
+
89
+ /* switch — square track and thumb; flat accent fill when on */
90
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-switch {
91
+ appearance: none;
92
+ position: relative;
93
+ width: 2.4rem;
94
+ height: 1.3rem;
95
+ margin: 0;
96
+ vertical-align: text-bottom;
97
+ background: var(--rb-surface-sunken);
98
+ border: 1px solid var(--rb-border);
99
+ border-radius: var(--rb-radius);
100
+ cursor: pointer;
101
+ transition: border-color var(--rb-transition);
102
+ }
103
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-switch::after {
104
+ content: "";
105
+ position: absolute;
106
+ top: 2px;
107
+ left: 2px;
108
+ width: calc(1.3rem - 6px);
109
+ height: calc(1.3rem - 6px);
110
+ background: var(--rb-text-faint);
111
+ transition: transform var(--rb-transition), background var(--rb-transition);
112
+ }
113
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-switch:checked {
114
+ border-color: var(--rb-accent);
115
+ }
116
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-switch:checked::after {
117
+ transform: translateX(1.1rem);
118
+ background: var(--rb-accent);
119
+ }
120
+
121
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-checkbox:focus-visible,
122
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-radio:focus-visible,
123
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-switch:focus-visible {
124
+ outline: none;
125
+ border: 2px solid var(--rb-accent);
126
+ }
127
+
128
+ @media (prefers-reduced-motion: reduce) {
129
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-input,
130
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-textarea,
131
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-select,
132
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-checkbox,
133
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-radio,
134
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-switch,
135
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-switch::after {
136
+ transition: none;
137
+ }
138
+ }
@@ -0,0 +1,44 @@
1
+ /* concrete-signal-light — nav link (tree/sidebar row)
2
+ * Hover fills to surface-2 and stamps a hard 3px solid accent bar on the left
3
+ * edge — no gradient, no blur, no glow; active carries the accent wash plus
4
+ * the same bar and bold text. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-link {
6
+ position: relative;
7
+ display: flex;
8
+ align-items: center;
9
+ gap: var(--rb-space-2);
10
+ padding: var(--rb-space-2) var(--rb-space-3);
11
+ border-radius: var(--rb-radius);
12
+ color: var(--rb-text);
13
+ font-size: var(--rb-text-sm);
14
+ text-decoration: none;
15
+ cursor: pointer;
16
+ transition: background var(--rb-transition), color var(--rb-transition);
17
+ }
18
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-link::before {
19
+ content: "";
20
+ position: absolute;
21
+ left: 0;
22
+ top: 0;
23
+ bottom: 0;
24
+ width: 3px;
25
+ background: transparent;
26
+ }
27
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-link:hover {
28
+ background: var(--rb-surface-2);
29
+ }
30
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-link:hover::before,
31
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-link.rb-link--active::before {
32
+ background: var(--rb-accent);
33
+ }
34
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-link.rb-link--active {
35
+ background: var(--rb-accent-wash);
36
+ color: var(--rb-accent);
37
+ font-weight: var(--rb-font-weight-bold);
38
+ }
39
+
40
+ @media (prefers-reduced-motion: reduce) {
41
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-link {
42
+ transition: none;
43
+ }
44
+ }
@@ -0,0 +1,19 @@
1
+ /* concrete-signal-light — log / terminal block
2
+ * Pairs with .rb-pre for the shared look (surface-sunken well, hairline
3
+ * border, zero radius, small mono) -- .rb-log itself only adds what changes
4
+ * for multi-line streaming output: a capped height with vertical scroll,
5
+ * wrapped long lines instead of .rb-pre's horizontal scroll, and a touch
6
+ * more line-height so dense text stays readable. Use together on one
7
+ * element: <pre class="rb-pre rb-log">. */
8
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).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="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-pre.rb-log {
18
+ overflow-x: hidden;
19
+ }
@@ -0,0 +1,7 @@
1
+ /* concrete-signal-light — muted / empty-state text
2
+ * Faint secondary text — captions, meta, "No results yet." style empty
3
+ * states. No italic: brutalism carries its voice through weight, case, and
4
+ * tracking, never a softening slant. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-muted {
6
+ color: var(--rb-text-faint);
7
+ }
@@ -0,0 +1,15 @@
1
+ /* concrete-signal-light — nav rail (vertical sidebar container)
2
+ * Flush edge chrome, not a floating card: fixed-width flex column, surface
3
+ * background, a 1px border-strong right edge (this theme's spec-sheet
4
+ * convention, not a faint hairline). Composes with .rb-link for items --
5
+ * active/hover are entirely that component's own tokens, nothing new here. */
6
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).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);
14
+ border-right: 1px solid var(--rb-border-strong);
15
+ }
@@ -0,0 +1,14 @@
1
+ /* concrete-signal-light — command / log block
2
+ * Styled <pre> for shell commands or short log output: sunken well, hairline
3
+ * border, small mono, scrolls horizontally instead of wrapping. Zero radius
4
+ * falls out of --rb-radius automatically, same as every other panel here. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).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
+ }
@@ -0,0 +1,44 @@
1
+ /* concrete-signal-light — progress bar & spinner
2
+ * A sunken, square-cornered trough with a flat accent fill — no gradient fill,
3
+ * no glow. The spinner keeps the theme's zero-radius signature: a square
4
+ * rotating frame rather than a soft circular arc. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-progress {
6
+ appearance: none;
7
+ display: block;
8
+ width: 100%;
9
+ height: 0.5rem;
10
+ background: var(--rb-surface-sunken);
11
+ border: 1px solid var(--rb-border);
12
+ border-radius: var(--rb-radius);
13
+ overflow: hidden;
14
+ }
15
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-progress::-webkit-progress-bar {
16
+ background: var(--rb-surface-sunken);
17
+ }
18
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-progress::-webkit-progress-value {
19
+ background: var(--rb-accent);
20
+ }
21
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-progress::-moz-progress-bar {
22
+ background: var(--rb-accent);
23
+ }
24
+
25
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-spinner {
26
+ display: inline-block;
27
+ width: 1.25rem;
28
+ height: 1.25rem;
29
+ border: 2px solid var(--rb-border-strong);
30
+ border-top-color: var(--rb-accent);
31
+ border-radius: var(--rb-radius);
32
+ animation: rb-signal-light-spin 0.7s linear infinite;
33
+ }
34
+ @keyframes rb-signal-light-spin {
35
+ to {
36
+ transform: rotate(360deg);
37
+ }
38
+ }
39
+
40
+ @media (prefers-reduced-motion: reduce) {
41
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-spinner {
42
+ animation-duration: 2s;
43
+ }
44
+ }
@@ -0,0 +1,84 @@
1
+ /* concrete-signal-light — 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 or blur -- ever, per this theme's rule -- so the current node's lift
15
+ * is the hard, literal offset shadow-lg, and a segment snaps instantly
16
+ * instead of transitioning. Identical to concrete-signal; only the palette
17
+ * differs. */
18
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper {
19
+ display: flex;
20
+ isolation: isolate;
21
+ list-style: none;
22
+ margin: 0;
23
+ padding: 0;
24
+ }
25
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper__step {
26
+ position: relative;
27
+ flex: 1;
28
+ min-width: 0;
29
+ display: flex;
30
+ flex-direction: column;
31
+ align-items: center;
32
+ gap: var(--rb-space-2);
33
+ text-align: center;
34
+ }
35
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper__step:not(:first-child)::before {
36
+ content: "";
37
+ position: absolute;
38
+ top: 1rem;
39
+ right: 50%;
40
+ width: 100%;
41
+ height: 2px;
42
+ background: var(--rb-surface-sunken);
43
+ z-index: -1;
44
+ }
45
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper__step:not(:first-child).rb-stepper--complete::before,
46
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper__step:not(:first-child).rb-stepper--current::before {
47
+ background: var(--rb-accent);
48
+ }
49
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper__node {
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ width: 2rem;
54
+ height: 2rem;
55
+ border: 2px solid transparent;
56
+ border-radius: var(--rb-radius-pill);
57
+ background: var(--rb-surface-2);
58
+ color: var(--rb-text-faint);
59
+ font-size: var(--rb-text-sm);
60
+ font-weight: var(--rb-font-weight-bold);
61
+ }
62
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper__label {
63
+ font-size: var(--rb-text-sm);
64
+ color: var(--rb-text-faint);
65
+ text-transform: uppercase;
66
+ letter-spacing: var(--rb-label-tracking);
67
+ }
68
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper--complete .rb-stepper__node {
69
+ background: var(--rb-accent);
70
+ color: var(--rb-accent-fg);
71
+ }
72
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper--complete .rb-stepper__label {
73
+ color: var(--rb-text);
74
+ }
75
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper--current .rb-stepper__node {
76
+ background: var(--rb-surface);
77
+ border-color: var(--rb-accent);
78
+ color: var(--rb-accent);
79
+ box-shadow: var(--rb-shadow-lg);
80
+ }
81
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-stepper--current .rb-stepper__label {
82
+ color: var(--rb-accent);
83
+ font-weight: var(--rb-font-weight-bold);
84
+ }
@@ -0,0 +1,48 @@
1
+ /* concrete-signal-light — table
2
+ * Dense, spec-sheet reading: 1px border-strong rules everywhere (not faint
3
+ * hairlines), uppercase tracked headers, tabular numerals, and a row hover
4
+ * that snaps instantly — no transition softness. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table {
6
+ width: 100%;
7
+ border-collapse: collapse;
8
+ font-size: var(--rb-text-sm);
9
+ font-variant-numeric: tabular-nums;
10
+ color: var(--rb-text);
11
+ }
12
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table th {
13
+ padding: var(--rb-space-2) var(--rb-space-3);
14
+ border-bottom: 1px solid var(--rb-border-strong);
15
+ color: var(--rb-text-faint);
16
+ text-align: left;
17
+ text-transform: uppercase;
18
+ font-size: 12px;
19
+ font-weight: var(--rb-font-weight-bold);
20
+ letter-spacing: var(--rb-label-tracking);
21
+ }
22
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table td {
23
+ padding: var(--rb-space-2) var(--rb-space-3);
24
+ border-bottom: 1px solid var(--rb-border-strong);
25
+ color: var(--rb-text);
26
+ }
27
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table tbody tr:hover td {
28
+ background: var(--rb-surface-2);
29
+ }
30
+ /* --interactive: clickable rows (a tabindex tr, or a row-wrapping button/link) —
31
+ * pointer cursor plus a keyboard-equivalent of the hover wash and a focus ring;
32
+ * no transition here either, matching the table's instant-snap hover. */
33
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table--interactive tbody tr {
34
+ cursor: pointer;
35
+ }
36
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table--interactive tbody tr:focus-visible,
37
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table--interactive tbody tr:has(:focus-visible) {
38
+ outline: 2px solid var(--rb-accent);
39
+ outline-offset: -2px;
40
+ }
41
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table--interactive tbody tr:focus-visible td,
42
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table--interactive tbody tr:has(:focus-visible) td {
43
+ background: var(--rb-surface-2);
44
+ }
45
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-table .rb-num {
46
+ text-align: right;
47
+ font-variant-numeric: tabular-nums;
48
+ }
@@ -0,0 +1,49 @@
1
+ /* concrete-signal-light — tabs
2
+ * Uppercase text tabs; the active tab carries accent text and a hard 3px
3
+ * underline in the theme's one rationed gradient — its only appearance
4
+ * outside the token declaration itself. */
5
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tabs {
6
+ display: flex;
7
+ gap: var(--rb-space-2);
8
+ border-bottom: 1px solid var(--rb-border);
9
+ }
10
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tab {
11
+ position: relative;
12
+ padding: var(--rb-space-2) var(--rb-space-4);
13
+ background: none;
14
+ border: none;
15
+ color: var(--rb-text-soft);
16
+ text-transform: uppercase;
17
+ font-family: var(--rb-font-body);
18
+ font-weight: var(--rb-font-weight-bold);
19
+ font-size: var(--rb-text-sm);
20
+ letter-spacing: var(--rb-label-tracking);
21
+ cursor: pointer;
22
+ transition: color var(--rb-transition);
23
+ }
24
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tab:hover {
25
+ color: var(--rb-text);
26
+ }
27
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tab.rb-tab--active,
28
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tab[aria-selected="true"] {
29
+ color: var(--rb-accent);
30
+ }
31
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tab.rb-tab--active::after,
32
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tab[aria-selected="true"]::after {
33
+ content: "";
34
+ position: absolute;
35
+ left: 0;
36
+ right: 0;
37
+ bottom: -1px;
38
+ height: 3px;
39
+ background: var(--rb-accent-grad);
40
+ }
41
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tabpanel {
42
+ padding: var(--rb-space-4) 0;
43
+ }
44
+
45
+ @media (prefers-reduced-motion: reduce) {
46
+ :where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-tab {
47
+ transition: none;
48
+ }
49
+ }
@@ -0,0 +1,82 @@
1
+ # concrete-signal-light
2
+
3
+ The light, AA-tuned counterpart of **concrete-signal** — the same brutalist
4
+ industrial language (zero border-radius everywhere, thick hairline borders,
5
+ hard offset shadows instead of blur, the sole safety-orange accent used
6
+ functionally only, heavy-weight uppercase labels, tabular numerals, snappy
7
+ `0.1s` transitions with no easing softness) rendered on a poured-concrete
8
+ off-white ground instead of the dark slab. It ships the identical `rb-*`
9
+ component set as concrete-signal — the components are token-driven, so only
10
+ the palette differs — and swaps in with a single attribute flip.
11
+
12
+ ## Color
13
+
14
+ | Role | Value | Usage |
15
+ | --- | --- | --- |
16
+ | Background | `#eeece6` (poured concrete, off-white) | Page canvas |
17
+ | Surface | `#f7f6f2` | Cards, header, panels |
18
+ | Surface 2 | `#e4e2da` | Raised/hover surface, row hover |
19
+ | Surface sunken | `#dcdad2` | Inset fields, progress troughs |
20
+ | Text | `#141311` | Body text |
21
+ | Text soft | `#4a4844` | Secondary text |
22
+ | Text faint | `#5f5d58` | Labels, idle tabs, meta |
23
+ | Border | `#c9c6bc` | Resting hairline borders |
24
+ | Border strong | `#a8a59a` | Card/table/dialog structural rules |
25
+ | Accent | `#cc4611` (safety-orange, darkened for AA) | The sole brand voice: emphasis, active state, focus (4.72:1 as accent-fg text) |
26
+ | Accent fg | `#ffffff` | White on the solid orange fill |
27
+ | Accent wash | `rgba(204,70,17,.14)` | Default badge tint, active-link wash |
28
+ | Gradient | `linear-gradient(90deg,#cc4611,#b8281f)` | The one rationed gradient: active-tab underline only |
29
+ | Info | `#2f6fa8` | Informational chips (4.90:1 on surface) |
30
+ | Success | `#3d7a45` | Healthy/live status (4.77:1 on surface) |
31
+ | Warning | `#906721` | Caution status (darkened from `#b8842a`, 3.05:1, to 4.68:1 on surface) |
32
+ | Danger | `#b8281f` | Destructive actions, errors (5.78:1 on surface) |
33
+
34
+ **Rules.** Colour is functional. Resting UI is concrete grey and faint;
35
+ safety-orange appears only on interaction, focus, active state, and
36
+ emphasis — never as decoration. Colour beyond the accent is *earned*:
37
+ severity and status chips are the one place other hues appear. The accent
38
+ and the warning chip are both darkened from their naive values so every
39
+ text/border use of a semantic colour clears WCAG AA (4.5:1) against
40
+ `--rb-surface` — genuinely AA-tuned, not just labelled as such. The theme
41
+ never softens with glow, blur, or gradient — the one exception is the
42
+ 2-stop hard gradient rationed to the active-tab underline.
43
+
44
+ ## Typography
45
+
46
+ Identical to concrete-signal — see its `design.md` for per-component notes;
47
+ behaviour is the same, only the palette differs. `system-ui` throughout at
48
+ weight 800 for display/labels, uppercase and tracked; tabular numerals on
49
+ tables.
50
+
51
+ ## Shape & effects
52
+
53
+ Identical to concrete-signal — see its `design.md` for per-component notes;
54
+ behaviour is the same, only the palette differs. Zero radius everywhere
55
+ (save the near-square `--rb-radius-pill` used by badges), hard offset
56
+ shadows instead of blur, a hard border-weight focus change, the theme's one
57
+ rationed gradient on the active-tab underline only, and `0.1s` snap
58
+ transitions.
59
+
60
+ ## Components
61
+
62
+ Identical to concrete-signal — see its `design.md` for per-component notes;
63
+ behaviour is the same, only the palette differs. The full baseline twelve:
64
+ `.rb-btn` (+ `--primary/--accent/--danger/--ghost`, `--sm` compact size, `.rb-icon-btn` icon-only square), `.rb-card` (+
65
+ `--raised`), `.rb-link`, `.rb-nav-rail`, the form set (`.rb-input`/`.rb-textarea`/
66
+ `.rb-select`/`.rb-label`/`.rb-field`/`.rb-choice`/`.rb-checkbox`/`.rb-radio`/
67
+ `.rb-switch`), `.rb-badge`, `.rb-alert`, `.rb-dialog`, `.rb-tabs`/`.rb-tab`/
68
+ `.rb-tabpanel`, `.rb-table` (+ `.rb-num`, `--interactive`), `.rb-progress`/`.rb-spinner`, `.rb-stepper`,
69
+ `.rb-muted` (no italic — brutalism never softens with a slant), `.rb-pre` (+ `.rb-log`)
70
+ (zero radius falls out of `--rb-radius` automatically).
71
+
72
+ ## Dark counterpart
73
+
74
+ `concrete-signal` — the primary, dark look. This theme and it share the
75
+ same `--rb-*` baseline and `rb-*` classes, so switching `data-rb-style`
76
+ between them restyles a page without touching markup.
77
+
78
+ ## Scoping
79
+
80
+ Every rule is guarded by `data-rb-style="concrete-signal-light"` (self or
81
+ ancestor), wrapped in zero-specificity `:where()`. Set the attribute on
82
+ `<html>` for a page or on a container for an embedded island.
@@ -0,0 +1,18 @@
1
+ /* concrete-signal-light — full theme entry point */
2
+ @import "./tokens.css";
3
+ @import "./base.css";
4
+ @import "./components/card.css";
5
+ @import "./components/link.css";
6
+ @import "./components/nav-rail.css";
7
+ @import "./components/button.css";
8
+ @import "./components/form.css";
9
+ @import "./components/badge.css";
10
+ @import "./components/alert.css";
11
+ @import "./components/dialog.css";
12
+ @import "./components/tabs.css";
13
+ @import "./components/table.css";
14
+ @import "./components/progress.css";
15
+ @import "./components/stepper.css";
16
+ @import "./components/muted.css";
17
+ @import "./components/pre.css";
18
+ @import "./components/log.css";
@@ -0,0 +1,75 @@
1
+ /* concrete-signal-light — design tokens
2
+ * The light, AA-tuned counterpart of concrete-signal: the same brutalist
3
+ * industrial language — zero border-radius everywhere, thick hairline
4
+ * borders, hard offset shadows instead of blur — rendered on a poured-
5
+ * concrete off-white ground instead of the dark slab. It ships the identical
6
+ * `rb-*` component set as concrete-signal (token-driven, so only the palette
7
+ * differs) and swaps in with a single attribute flip. Consume via:
8
+ * @import "@rackbops/styles/concrete-signal-light/tokens";
9
+ * or pull the whole theme with ./index.css.
10
+ *
11
+ * Nothing applies until an element carries
12
+ * data-rb-style="concrete-signal-light" — set it on <html> for a page, or on
13
+ * any container for an embedded island. The :where() keeps specificity at
14
+ * zero, so any consumer rule overrides.
15
+ */
16
+ :where([data-rb-style="concrete-signal-light"]) {
17
+ color-scheme: light;
18
+
19
+ /* color — poured concrete, off-white */
20
+ --rb-bg: #eeece6;
21
+ --rb-surface: #f7f6f2;
22
+ --rb-surface-2: #e4e2da;
23
+ --rb-surface-sunken: #dcdad2;
24
+ --rb-text: #141311;
25
+ --rb-text-soft: #4a4844;
26
+ --rb-text-faint: #5f5d58;
27
+ --rb-border: #c9c6bc;
28
+ --rb-border-strong: #a8a59a;
29
+
30
+ /* accent — safety-orange is the sole brand voice: interaction/focus/emphasis only.
31
+ Darkened from the naive #d94a12 to #cc4611 so accent-fg-on-accent (the
32
+ primary button fill) clears WCAG AA (4.72:1, was 4.25:1). */
33
+ --rb-accent: #cc4611;
34
+ --rb-accent-fg: #ffffff;
35
+ --rb-accent-wash: rgba(204, 70, 17, 0.14);
36
+
37
+ /* the ONE gradient — rationed to the active-tab underline only */
38
+ --rb-accent-grad: linear-gradient(90deg, #cc4611, #b8281f);
39
+
40
+ /* semantic — colour beyond the accent is earned: severity/status only.
41
+ Warning darkened from #b8842a (3.05:1 on --rb-surface, failed AA) to
42
+ #906721 (4.68:1) — it's the sole failing semantic hue on this ground. */
43
+ --rb-info: #2f6fa8;
44
+ --rb-success: #3d7a45;
45
+ --rb-warning: #906721;
46
+ --rb-danger: #b8281f;
47
+
48
+ /* typography — system-ui throughout; the industrial voice comes from
49
+ weight/case/tracking, not font family */
50
+ --rb-font-display: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
51
+ --rb-font-body: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
52
+ --rb-font-mono: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
53
+ --rb-font-weight: 400;
54
+ --rb-font-weight-medium: 600;
55
+ --rb-font-weight-bold: 800;
56
+ --rb-heading-tracking: 0.01em;
57
+ --rb-label-tracking: 0.08em;
58
+ --rb-text-sm: 13px;
59
+
60
+ /* shape & effects — zero radius everywhere; hard offset shadows, no blur */
61
+ --rb-radius: 0;
62
+ --rb-radius-lg: 0;
63
+ --rb-radius-pill: 0.125rem; /* deliberately near-square, not a true pill — brutalism has no soft pills */
64
+ --rb-shadow-sm: 2px 2px 0 rgba(20, 19, 17, 0.18);
65
+ --rb-shadow-lg: 4px 4px 0 rgba(20, 19, 17, 0.22);
66
+ --rb-blur: 0px; /* this theme never uses blur/glass */
67
+ --rb-transition: 0.1s; /* snappy; brutalism doesn't ease */
68
+
69
+ /* spacing — 4px rhythm */
70
+ --rb-space-1: 0.25rem;
71
+ --rb-space-2: 0.5rem;
72
+ --rb-space-3: 0.75rem;
73
+ --rb-space-4: 1rem;
74
+ --rb-space-5: 1.5rem;
75
+ }
@@ -0,0 +1,5 @@
1
+ // Every @rackbops/styles export below is CSS consumed for its side effect
2
+ // only; this declares an empty module so TypeScript's stricter side-effect
3
+ // import resolution (moduleResolution: "bundler"/"node16",
4
+ // noUncheckedSideEffectImports) has a real type declaration to find.
5
+ export {};