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