@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,42 @@
1
+ /* amber-hearth — progress + spinner
2
+ * A sunken trough with a solid accent fill; the spinner is a single accent arc.
3
+ * The theme's one gradient is rationed to tabs.css — kept solid here so it
4
+ * isn't spent twice. */
5
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-progress {
6
+ appearance: none;
7
+ width: 100%;
8
+ height: 6px;
9
+ border: 0;
10
+ border-radius: var(--rb-radius-pill);
11
+ overflow: hidden;
12
+ background: var(--rb-surface-sunken);
13
+ }
14
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-progress::-webkit-progress-bar {
15
+ background: var(--rb-surface-sunken);
16
+ }
17
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-progress::-webkit-progress-value {
18
+ background: var(--rb-accent);
19
+ }
20
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-progress::-moz-progress-bar {
21
+ background: var(--rb-accent);
22
+ }
23
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-spinner {
24
+ display: inline-block;
25
+ width: 1.25rem;
26
+ height: 1.25rem;
27
+ border: 2px solid var(--rb-border-strong);
28
+ border-top-color: var(--rb-accent);
29
+ border-radius: 50%;
30
+ animation: rb-hearth-spin 0.7s linear infinite;
31
+ }
32
+ @keyframes rb-hearth-spin {
33
+ to {
34
+ transform: rotate(360deg);
35
+ }
36
+ }
37
+
38
+ @media (prefers-reduced-motion: reduce) {
39
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-spinner {
40
+ animation-duration: 2s;
41
+ }
42
+ }
@@ -0,0 +1,87 @@
1
+ /* amber-hearth — 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 -- the current node's lift is the theme's own warm, diffused
15
+ * shadow-lg, never a neutral hard offset. */
16
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-stepper {
17
+ display: flex;
18
+ isolation: isolate;
19
+ list-style: none;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).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="amber-hearth"], [data-rb-style="amber-hearth"] *).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="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-stepper__step:not(:first-child).rb-stepper--complete::before,
45
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-stepper__step:not(:first-child).rb-stepper--current::before {
46
+ background: var(--rb-accent);
47
+ }
48
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).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="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-stepper__label {
62
+ font-size: var(--rb-text-sm);
63
+ color: var(--rb-text-faint);
64
+ }
65
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-stepper--complete .rb-stepper__node {
66
+ background: var(--rb-accent);
67
+ color: var(--rb-accent-fg);
68
+ }
69
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-stepper--complete .rb-stepper__label {
70
+ color: var(--rb-text);
71
+ }
72
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).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="amber-hearth"], [data-rb-style="amber-hearth"] *).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="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-stepper__step:not(:first-child)::before {
85
+ transition: none;
86
+ }
87
+ }
@@ -0,0 +1,50 @@
1
+ /* amber-hearth — table
2
+ * Faint header rule, tabular numerals, row hover to surface-2 with the
3
+ * theme's own soft transition. Headers stay normal-case, medium weight. */
4
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table {
5
+ width: 100%;
6
+ border-collapse: collapse;
7
+ font-family: var(--rb-font-body);
8
+ font-size: var(--rb-text-sm);
9
+ font-variant-numeric: tabular-nums;
10
+ }
11
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table th {
12
+ text-align: left;
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
+ font-weight: var(--rb-font-weight-medium);
17
+ }
18
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table td {
19
+ padding: var(--rb-space-2) var(--rb-space-3);
20
+ border-bottom: 1px solid var(--rb-border);
21
+ color: var(--rb-text);
22
+ transition: background var(--rb-transition);
23
+ }
24
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table tbody tr:hover td {
25
+ background: var(--rb-surface-2);
26
+ }
27
+ /* --interactive: clickable rows (a tabindex tr, or a row-wrapping button/link) —
28
+ * pointer cursor plus a keyboard-equivalent of the hover wash and a focus ring. */
29
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table--interactive tbody tr {
30
+ cursor: pointer;
31
+ }
32
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table--interactive tbody tr:focus-visible,
33
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table--interactive tbody tr:has(:focus-visible) {
34
+ outline: 2px solid var(--rb-accent);
35
+ outline-offset: -2px;
36
+ }
37
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table--interactive tbody tr:focus-visible td,
38
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table--interactive tbody tr:has(:focus-visible) td {
39
+ background: var(--rb-surface-2);
40
+ }
41
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table .rb-num {
42
+ text-align: right;
43
+ font-variant-numeric: tabular-nums;
44
+ }
45
+
46
+ @media (prefers-reduced-motion: reduce) {
47
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-table td {
48
+ transition: none;
49
+ }
50
+ }
@@ -0,0 +1,46 @@
1
+ /* amber-hearth — tabs
2
+ * Normal-case text tabs; the active tab carries accent text, underlined with
3
+ * the theme's one rationed gradient — clay -> amber -> gold. This is the only
4
+ * place --rb-accent-grad appears in this theme. */
5
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).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="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-tab {
11
+ position: relative;
12
+ padding: var(--rb-space-2) var(--rb-space-4);
13
+ background: transparent;
14
+ border: 0;
15
+ color: var(--rb-text-soft);
16
+ font-family: var(--rb-font-body);
17
+ font-weight: var(--rb-font-weight-medium);
18
+ font-size: var(--rb-text-sm);
19
+ cursor: pointer;
20
+ transition: color var(--rb-transition);
21
+ }
22
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-tab:hover {
23
+ color: var(--rb-text);
24
+ }
25
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-tab.rb-tab--active {
26
+ color: var(--rb-accent);
27
+ }
28
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-tab.rb-tab--active::after {
29
+ content: "";
30
+ position: absolute;
31
+ left: var(--rb-space-3);
32
+ right: var(--rb-space-3);
33
+ bottom: -1px;
34
+ height: 2px;
35
+ border-radius: var(--rb-radius-pill);
36
+ background: var(--rb-accent-grad);
37
+ }
38
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-tabpanel {
39
+ padding: var(--rb-space-4) 0;
40
+ }
41
+
42
+ @media (prefers-reduced-motion: reduce) {
43
+ :where([data-rb-style="amber-hearth"], [data-rb-style="amber-hearth"] *).rb-tab {
44
+ transition: none;
45
+ }
46
+ }
@@ -0,0 +1,146 @@
1
+ # amber-hearth
2
+
3
+ An original rackbops theme — warm, hand-crafted editorial design. Clay-terracotta
4
+ accent on a warm cream ground, the most generously rounded shape language in the
5
+ library, and warm-toned diffused shadows (brown-tinted, never neutral black).
6
+ This is the library's **only serif display voice**: headings, card and dialog
7
+ titles use a system serif stack, while body copy and UI chrome (buttons, labels,
8
+ table text) stay on a humanist system-ui sans. Transitions run a touch slower
9
+ than the library default (`0.18s` vs `0.15s`) to read as unhurried and cozy, and
10
+ the one clay -> amber -> gold gradient is rationed to a single place — the
11
+ active-tab underline — exactly as sparingly as the library's other gradient
12
+ themes ration theirs. Light ("Hearth") is the primary look; its dark
13
+ counterpart ("Ember") ships as its own theme, documented below.
14
+
15
+ ## Color
16
+
17
+ | Role | Value | Usage |
18
+ | --- | --- | --- |
19
+ | Background | `#fbf3e9` (warm cream) | Page canvas |
20
+ | Surface | `#ffffff` | Cards, dialogs, panels |
21
+ | Surface 2 | `#f5e9d9` | Raised/hover surface, active-tab wash base |
22
+ | Surface sunken | `#efe1cd` | Inset fields, progress troughs |
23
+ | Text | `#2b1f14` | Body text |
24
+ | Text soft | `#5c4a38` | Secondary text |
25
+ | Text faint | `#6e5945` | Labels, table headers, meta |
26
+ | Border | `#e6d3ba` | Resting hairline borders |
27
+ | Border strong | `#d1b98f` | Dialog edges, header rules |
28
+ | Accent | `#b5542c` (clay-terracotta, darkened for AA) | The sole brand voice: emphasis, active state, focus (4.67:1 as accent-fg text) |
29
+ | Accent fg | `#fff8f0` | Warm-white ink on the solid clay fill |
30
+ | Accent wash | `rgba(181,84,44,.14)` | Active/hover tint behind accent text |
31
+ | Info | `#3c7ba3` | Informational chips (4.61:1 on white) |
32
+ | Success | `#497f4b` | Healthy/live status (4.75:1 on white) |
33
+ | Warning | `#9c6b22` | Caution status (darkened from `#c8892c`, 2.97:1, to 4.63:1 on white) |
34
+ | Danger | `#b8412a` | Destructive actions, errors (5.49:1 on white) |
35
+
36
+ **Rules.** Colour is functional. Resting UI is cream, white, and warm neutral
37
+ ink; clay-terracotta appears only on interaction, focus, active state, and
38
+ emphasis. Colour beyond the accent is *earned* — severity and status badges are
39
+ the one place other hues appear. The accent and all four semantic hues are
40
+ tuned so every text/border use clears WCAG AA (4.5:1) against `--rb-surface`
41
+ (white) — info, success, and warning were all originally under 4.5:1 and were
42
+ darkened accordingly; danger already cleared. The one gradient
43
+ (`--rb-accent-grad`, clay -> amber -> gold) is rationed to exactly one place
44
+ across the whole theme — the active-tab underline — never spent twice; the
45
+ progress fill and every other surface stay solid.
46
+
47
+ ## Typography
48
+
49
+ - **Display / headings:** a system serif stack (`"Iowan Old Style", "Palatino
50
+ Linotype", Palatino, Georgia, serif`), weight 700, tight tracking
51
+ (`-0.01em`). This is the library's only serif voice — reserved for headings,
52
+ card titles, and dialog titles.
53
+ - **Body & UI:** `system-ui, -apple-system, "Segoe UI", Roboto, …`, weight 400.
54
+ Buttons, labels, and table text stay on this sans voice even where a heading
55
+ nearby goes serif.
56
+ - **Labels:** normal-case, weight 600 (`--rb-font-weight-medium`), tracked
57
+ `0.04em`. No uppercase-shouty labels anywhere in this theme.
58
+ - **Bare tags:** unclassed `h1`-`h6` pick up the serif display voice directly
59
+ — weight 700, tracking `-0.01em`, `--rb-space-3` margin below,
60
+ `line-height: 1.2`. Bare `p` shares that margin; bare `ul`/`ol` add it too,
61
+ with `--rb-space-4` marker indent (real disc/decimal markers, not stripped).
62
+
63
+ ## Shape & effects
64
+
65
+ - Radius `0.875rem` (14px) for buttons, inputs, and rows; `1.25rem` (20px) for
66
+ cards and dialogs; true pills for badges and progress troughs — the most
67
+ generously rounded theme in the library.
68
+ - Shadows are warm-toned and diffused: `rgba(80,50,20,…)` brown-tinted, soft
69
+ normal-blur shadows — never a neutral-black hard offset shadow. `shadow-sm`
70
+ resting, `shadow-lg` for raised cards and dialogs.
71
+ - Transitions `0.18s` — softer and slightly slower than the library default
72
+ (`0.15s`), so hovers and focus changes read as unhurried rather than snappy.
73
+ Every animation and transition respects `prefers-reduced-motion`.
74
+ - Focus is the accent: inputs swap their border for a clay line plus a soft
75
+ `--rb-accent-wash` ring.
76
+ - 4px spacing rhythm (`--rb-space-1..5`).
77
+
78
+ ## Components
79
+
80
+ Class prefix `rb-`; shared token/class contract with the other themes. No
81
+ `--rb-code-*` syntax tokens — this isn't a developer-console theme.
82
+
83
+ - **Button** `.rb-btn` — soft surface-2 ghost by default, sans (not serif);
84
+ `--primary` is the one solid clay fill with a soft shadow-lift on hover (no
85
+ hard transform), `--accent` a clay-wash chip, `--danger` a rose-tinted ghost,
86
+ `--ghost` chromeless. `--sm` is a snugger size for inline and table-row
87
+ actions — tighter padding, a hair smaller type. `.rb-icon-btn` is a square
88
+ icon-only hit target (>=2rem), paired with `.rb-btn`.
89
+ - **Card** `.rb-card` (+ `--raised`) — solid panel, hairline border, warm
90
+ diffused shadow; any `h1`-`h3` inside goes serif and bold.
91
+ - **NavLink** `.rb-link` — sidebar row; hover fills to surface-2 and lights a
92
+ soft, fully-rounded 3px accent bar on the left edge (rounded to match the
93
+ row's own character, not a hard-edged rule); `--active` carries the accent
94
+ wash.
95
+ - **Nav rail** `.rb-nav-rail` — the sidebar container: 14rem fixed-width flex
96
+ column, surface background, a hairline right edge. Composes with `.rb-link`
97
+ for items; introduces no active-state convention of its own.
98
+ - **Form** `.rb-input` / `.rb-textarea` / `.rb-select` / `.rb-label` /
99
+ `.rb-field` / `.rb-choice` / `.rb-checkbox` / `.rb-radio` / `.rb-switch` —
100
+ sunken fields; focus swaps to the accent border + soft wash ring; labels
101
+ normal-case, weight 600, sans.
102
+ - **Badge** `.rb-badge` — true pill: a 16% tint of its hue behind
103
+ full-strength text (semantic modifiers `--info/--success/--warning/--danger`);
104
+ normal-case, weight 600.
105
+ - **Alert** `.rb-alert` — surface panel, 3px left bar carries the semantic
106
+ colour.
107
+ - **Dialog** `.rb-dialog` — native `<dialog>`, generously rounded panel,
108
+ blurred backdrop (`backdrop-filter: blur(var(--rb-blur))`), serif bold title.
109
+ - **Tabs** `.rb-tabs` / `.rb-tab` / `.rb-tabpanel` — normal-case text tabs; the
110
+ active tab is accent-coloured, underlined with the theme's one rationed
111
+ gradient — the only place `--rb-accent-grad` appears in this theme.
112
+ - **Table** `.rb-table` (+ `.rb-num`) — faint header rule, tabular numerals,
113
+ row hover to surface-2 with the theme's own soft transition, normal-case
114
+ weight-600 headers. `--interactive` marks clickable rows: pointer cursor,
115
+ plus a focus-visible ring (and the surface-2 wash) for a `tabindex` row or a
116
+ row-wrapping button/link.
117
+ - **Progress / Spinner** `.rb-progress` / `.rb-spinner` — sunken trough with a
118
+ solid accent fill (the gradient stays reserved for tabs); the spinner is a
119
+ single accent arc (`rb-hearth-spin`).
120
+ - **Stepper** `.rb-stepper` (+ `__step` / `__node` / `__label`, `--complete` /
121
+ `--current` / `--upcoming`) — a milestone rail: complete nodes solid accent
122
+ with a checkmark, current a white-on-accent-border ring with the theme's
123
+ warm diffused `shadow-lg` lift, upcoming faint surface-2. Rail track is
124
+ `surface-sunken`; each connector segment fills to accent once its own
125
+ step is reached (complete or current), so the rail can't drift out of
126
+ sync with the step states.
127
+ - **Muted text** `.rb-muted` — faint secondary/empty-state text;
128
+ `color: var(--rb-text-faint)`, italic — fits this warm, hand-crafted,
129
+ unhurried editorial voice.
130
+ - **Pre / log block** `.rb-pre` — command/log `<pre>`; sunken background,
131
+ hairline border, radius, small mono, horizontal scroll. Pair with `.rb-log`
132
+ (`<pre class="rb-pre rb-log">`) for multi-line streaming output: a capped
133
+ 16rem height with vertical scroll, wrapped lines instead of horizontal
134
+ scroll, and roomier line-height for dense text.
135
+
136
+ ## Dark counterpart
137
+
138
+ `amber-ember` — the dark, espresso-ground counterpart. This theme and it share
139
+ the same `--rb-*` baseline and `rb-*` classes, so switching `data-rb-style`
140
+ between them restyles a page without touching markup.
141
+
142
+ ## Scoping
143
+
144
+ Every rule is guarded by `data-rb-style="amber-hearth"` (self or ancestor),
145
+ wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a page
146
+ or on a container for an embedded island.
@@ -0,0 +1,18 @@
1
+ /* amber-hearth — 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,77 @@
1
+ /* amber-hearth — design tokens
2
+ * An original rackbops theme: warm hand-crafted editorial voice, clay-terracotta
3
+ * accent on a warm cream ground. This is the library's only serif display voice
4
+ * — a system serif stack for headings and titles, no webfont — over a humanist
5
+ * system-ui body. Consume via:
6
+ * @import "@rackbops/styles/amber-hearth/tokens";
7
+ * or pull the whole theme with ./index.css.
8
+ *
9
+ * Nothing applies until an element carries data-rb-style="amber-hearth" — set it
10
+ * on <html> for a page, or on any container for an embedded island. The :where()
11
+ * keeps specificity at zero, so any consumer rule overrides.
12
+ *
13
+ * Every theme declares the same baseline token set (styles/test enforces
14
+ * parity); this theme adds nothing beyond it. Light ("Hearth") is the primary
15
+ * look; its dark counterpart ("Ember") ships as its own theme — see
16
+ * amber-ember/tokens.css and design.md.
17
+ */
18
+ :where([data-rb-style="amber-hearth"]) {
19
+ color-scheme: light;
20
+
21
+ /* color — warm cream ground, clay-terracotta accent */
22
+ --rb-bg: #fbf3e9;
23
+ --rb-surface: #ffffff;
24
+ --rb-surface-2: #f5e9d9;
25
+ --rb-surface-sunken: #efe1cd;
26
+ --rb-text: #2b1f14;
27
+ --rb-text-soft: #5c4a38;
28
+ --rb-text-faint: #6e5945;
29
+ --rb-border: #e6d3ba;
30
+ --rb-border-strong: #d1b98f;
31
+
32
+ /* accent — clay-terracotta is the sole brand voice. Darkened from the naive
33
+ #c1592f to #b5542c so accent-fg-on-accent (the primary button fill)
34
+ clears WCAG AA (4.67:1, was 4.21:1). */
35
+ --rb-accent: #b5542c;
36
+ --rb-accent-fg: #fff8f0;
37
+ --rb-accent-wash: rgba(181, 84, 44, 0.14);
38
+
39
+ /* the ONE gradient — rationed to the active-tab underline only */
40
+ --rb-accent-grad: linear-gradient(120deg, #b5542c, #e08a3f 50%, #d9a441);
41
+
42
+ /* semantic — info/success/warning darkened for AA as text on --rb-surface
43
+ (warning was 2.97:1, the worst offender; info/success were 4.44/4.13,
44
+ just under 4.5). Danger already cleared AA (5.49:1), left unchanged. */
45
+ --rb-info: #3c7ba3;
46
+ --rb-success: #497f4b;
47
+ --rb-warning: #9c6b22;
48
+ --rb-danger: #b8412a;
49
+
50
+ /* typography — the library's only serif display voice, over a sans body */
51
+ --rb-font-display: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
52
+ --rb-font-body: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
53
+ --rb-font-mono: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
54
+ --rb-font-weight: 400;
55
+ --rb-font-weight-medium: 600;
56
+ --rb-font-weight-bold: 700;
57
+ --rb-heading-tracking: -0.01em;
58
+ --rb-label-tracking: 0.04em;
59
+ --rb-text-sm: 13px;
60
+
61
+ /* shape & effects — the most generously rounded theme in the roster, warm
62
+ * diffused shadows (brown-tinted, never neutral black), unhurried transitions */
63
+ --rb-radius: 0.875rem;
64
+ --rb-radius-lg: 1.25rem;
65
+ --rb-radius-pill: 999px;
66
+ --rb-shadow-sm: 0 2px 6px rgba(80, 50, 20, 0.12);
67
+ --rb-shadow-lg: 0 12px 32px rgba(80, 50, 20, 0.18);
68
+ --rb-blur: 12px;
69
+ --rb-transition: 0.18s;
70
+
71
+ /* spacing — 4px rhythm */
72
+ --rb-space-1: 0.25rem;
73
+ --rb-space-2: 0.5rem;
74
+ --rb-space-3: 0.75rem;
75
+ --rb-space-4: 1rem;
76
+ --rb-space-5: 1.5rem;
77
+ }
@@ -31,6 +31,26 @@
31
31
  font-variant-numeric: tabular-nums;
32
32
  }
33
33
 
34
+ /* Monospace IS the display voice here — same "Display / wordmark" treatment
35
+ * design.md documents, wired to bare headings too. */
36
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *):where(h1, h2, h3, h4, h5, h6) {
37
+ margin: 0 0 var(--rb-space-3);
38
+ font-family: var(--rb-font-display);
39
+ font-weight: var(--rb-font-weight-medium);
40
+ letter-spacing: var(--rb-heading-tracking);
41
+ line-height: 1.15;
42
+ text-wrap: balance;
43
+ }
44
+
45
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *):where(p) {
46
+ margin: 0 0 var(--rb-space-3);
47
+ }
48
+
49
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *):where(ul, ol) {
50
+ margin: 0 0 var(--rb-space-3);
51
+ padding-inline-start: var(--rb-space-4);
52
+ }
53
+
34
54
  :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *):where(a) {
35
55
  color: var(--rb-accent);
36
56
  }
@@ -21,6 +21,21 @@
21
21
  background var(--rb-transition),
22
22
  color var(--rb-transition);
23
23
  }
24
+ /* --sm: compact size for inline/table-row actions (composes with any variant) */
25
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-btn--sm {
26
+ padding: var(--rb-space-1) var(--rb-space-3);
27
+ font-size: calc(var(--rb-text-sm) - 1px);
28
+ }
29
+ /* --icon: square icon-only hit target (>=2rem); pair with .rb-btn (+ an
30
+ * optional color variant) — inherits color/border/hover/focus from it. */
31
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-icon-btn {
32
+ padding: var(--rb-space-2);
33
+ min-width: 2rem;
34
+ min-height: 2rem;
35
+ gap: 0;
36
+ justify-content: center;
37
+ line-height: 1;
38
+ }
24
39
  :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-btn:hover,
25
40
  :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-btn:focus-visible {
26
41
  border-color: var(--rb-accent);
@@ -0,0 +1,19 @@
1
+ /* arcane-obsidian — log / terminal block
2
+ * Pairs with .rb-pre for the shared look (surface-sunken well, hairline
3
+ * border, radius, small mono) -- .rb-log itself only adds what changes for
4
+ * multi-line streaming output: a capped height with vertical scroll, wrapped
5
+ * long lines instead of .rb-pre's horizontal scroll, and a touch more
6
+ * line-height so dense text stays readable. Use together on one element:
7
+ * <pre class="rb-pre rb-log">. */
8
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-log {
9
+ max-height: 16rem;
10
+ overflow-y: auto;
11
+ white-space: pre-wrap;
12
+ overflow-wrap: anywhere;
13
+ line-height: 1.5;
14
+ }
15
+ /* Specificity-pinned (not import-order-dependent) override of .rb-pre's
16
+ * overflow-x: auto -- .rb-log wraps instead of scrolling horizontally. */
17
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-pre.rb-log {
18
+ overflow-x: hidden;
19
+ }
@@ -0,0 +1,7 @@
1
+ /* arcane-obsidian — muted / empty-state text
2
+ * Faint secondary text — captions, meta, "No results yet." style empty
3
+ * states. Italic distinguishes it from regular body copy at a glance. */
4
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-muted {
5
+ color: var(--rb-text-faint);
6
+ font-style: italic;
7
+ }
@@ -0,0 +1,14 @@
1
+ /* arcane-obsidian — nav rail (vertical sidebar container)
2
+ * Flush edge chrome, not a floating card: fixed-width flex column, surface
3
+ * background, a hairline right edge. Composes with .rb-link for items --
4
+ * active/hover are entirely that component's own tokens, nothing new here. */
5
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-nav-rail {
6
+ display: flex;
7
+ flex-direction: column;
8
+ flex-shrink: 0;
9
+ gap: var(--rb-space-1);
10
+ width: 14rem;
11
+ padding: var(--rb-space-3);
12
+ background: var(--rb-surface);
13
+ border-right: 1px solid var(--rb-border);
14
+ }
@@ -0,0 +1,13 @@
1
+ /* arcane-obsidian — command / log block
2
+ * Styled <pre> for shell commands or short log output: sunken well,
3
+ * hairline border, small mono, scrolls horizontally instead of wrapping. */
4
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-pre {
5
+ margin: 0;
6
+ padding: var(--rb-space-3) var(--rb-space-4);
7
+ background: var(--rb-surface-sunken);
8
+ border: 1px solid var(--rb-border);
9
+ border-radius: var(--rb-radius);
10
+ font-family: var(--rb-font-mono);
11
+ font-size: var(--rb-text-sm);
12
+ overflow-x: auto;
13
+ }
@@ -0,0 +1,87 @@
1
+ /* arcane-obsidian — stepper (delivery / milestone tracker)
2
+ * <ol class="rb-stepper"> with one
3
+ * <li class="rb-stepper__step rb-stepper--complete|current|upcoming"> per
4
+ * milestone: a .rb-stepper__node icon/number circle + .rb-stepper__label.
5
+ * Each non-first step draws its OWN connector segment back to the previous
6
+ * step's node (right: 50%; width: 100% of that step's own flex slice, self-
7
+ * aligning to node centers regardless of item count or label width -- a
8
+ * single full-width rail can't do this without knowing how many steps there
9
+ * are, since node centers sit inset within their own slice). isolation:
10
+ * isolate keeps every segment's negative z-index scoped to this stepper, so
11
+ * it paints behind every node without needing per-node z-index of its own.
12
+ * A segment fills once its OWN step is reached (complete or current) -- the
13
+ * same state class already on the <li>, not a second progress mechanism. No
14
+ * glow here -- depth is luminance-first, so the current node's elevation is
15
+ * the theme's own shadow-lg, not a glow. */
16
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper {
17
+ display: flex;
18
+ isolation: isolate;
19
+ list-style: none;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper__step {
24
+ position: relative;
25
+ flex: 1;
26
+ min-width: 0;
27
+ display: flex;
28
+ flex-direction: column;
29
+ align-items: center;
30
+ gap: var(--rb-space-2);
31
+ text-align: center;
32
+ }
33
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper__step:not(:first-child)::before {
34
+ content: "";
35
+ position: absolute;
36
+ top: 1rem;
37
+ right: 50%;
38
+ width: 100%;
39
+ height: 2px;
40
+ background: var(--rb-surface-sunken);
41
+ z-index: -1;
42
+ transition: background-color var(--rb-transition);
43
+ }
44
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper__step:not(:first-child).rb-stepper--complete::before,
45
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper__step:not(:first-child).rb-stepper--current::before {
46
+ background: var(--rb-accent);
47
+ }
48
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper__node {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ width: 2rem;
53
+ height: 2rem;
54
+ border: 2px solid transparent;
55
+ border-radius: var(--rb-radius-pill);
56
+ background: var(--rb-surface-2);
57
+ color: var(--rb-text-faint);
58
+ font-size: var(--rb-text-sm);
59
+ font-weight: var(--rb-font-weight-medium);
60
+ }
61
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper__label {
62
+ font-size: var(--rb-text-sm);
63
+ color: var(--rb-text-faint);
64
+ }
65
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper--complete .rb-stepper__node {
66
+ background: var(--rb-accent);
67
+ color: var(--rb-accent-fg);
68
+ }
69
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper--complete .rb-stepper__label {
70
+ color: var(--rb-text);
71
+ }
72
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper--current .rb-stepper__node {
73
+ background: var(--rb-surface);
74
+ border-color: var(--rb-accent);
75
+ color: var(--rb-accent);
76
+ box-shadow: var(--rb-shadow-lg);
77
+ }
78
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper--current .rb-stepper__label {
79
+ color: var(--rb-accent);
80
+ font-weight: var(--rb-font-weight-medium);
81
+ }
82
+
83
+ @media (prefers-reduced-motion: reduce) {
84
+ :where([data-rb-style="arcane-obsidian"], [data-rb-style="arcane-obsidian"] *).rb-stepper__step:not(:first-child)::before {
85
+ transition: none;
86
+ }
87
+ }