@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
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# concrete-signal
|
|
2
|
+
|
|
3
|
+
A brutalist-industrial design language: raw poured concrete and hazard
|
|
4
|
+
signage. It is the coldest, hardest theme in the library — zero
|
|
5
|
+
border-radius everywhere, thick hairline borders, and its signature trait,
|
|
6
|
+
**hard offset shadows instead of blur** (`Npx Npx 0 rgba(...)`, no blur
|
|
7
|
+
radius at all), so depth reads as a literal physical offset — a stamped
|
|
8
|
+
card, not a glow. The sole accent is safety-orange, used exactly as
|
|
9
|
+
functionally as arcane-obsidian's violet: interaction, focus, and emphasis
|
|
10
|
+
only, never decoration. Labels are heavy-weight and uppercase; numerals are
|
|
11
|
+
tabular; transitions are snappy (`0.1s`, no easing softness — brutalism
|
|
12
|
+
doesn't ease). Dark ("concrete-signal") is the primary look; its light
|
|
13
|
+
counterpart ("concrete-signal-light") is documented at the end.
|
|
14
|
+
|
|
15
|
+
## Color
|
|
16
|
+
|
|
17
|
+
| Role | Value | Usage |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| Background | `#121212` | Page canvas |
|
|
20
|
+
| Surface | `#1a1a1a` | Cards, header, panels |
|
|
21
|
+
| Surface 2 | `#232323` | Raised/hover surface, row hover |
|
|
22
|
+
| Surface sunken | `#0a0a0a` | Inset fields, progress troughs |
|
|
23
|
+
| Text | `#f2f2f0` | Body text |
|
|
24
|
+
| Text soft | `#b8b8b4` | Secondary text |
|
|
25
|
+
| Text faint | `#8f8f8a` | Labels, idle tabs, meta |
|
|
26
|
+
| Border | `#3a3a38` | Resting hairline borders |
|
|
27
|
+
| Border strong | `#55534e` | Card/table/dialog structural rules |
|
|
28
|
+
| Accent | `#ff5e1a` (safety-orange) | The sole brand voice: emphasis, active state, focus |
|
|
29
|
+
| Accent fg | `#121212` | Dark ink on the solid orange fill |
|
|
30
|
+
| Accent wash | `rgba(255,94,26,.16)` | Default badge tint, active-link wash |
|
|
31
|
+
| Gradient | `linear-gradient(90deg,#ff5e1a,#e8342a)` | The one rationed gradient: active-tab underline only |
|
|
32
|
+
| Info | `#4ea1e0` | Informational chips |
|
|
33
|
+
| Success | `#4caa5c` | Healthy/live status |
|
|
34
|
+
| Warning | `#e8b23a` | Caution status |
|
|
35
|
+
| Danger | `#e8342a` | Destructive actions, errors |
|
|
36
|
+
|
|
37
|
+
**Rules.** Colour is functional. Resting UI is concrete grey and faint;
|
|
38
|
+
safety-orange appears only on interaction, focus, active state, and
|
|
39
|
+
emphasis — never as decoration. Colour beyond the accent is *earned*:
|
|
40
|
+
severity and status chips are the one place other hues appear. 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, and even that
|
|
43
|
+
gradient has no soft midpoint.
|
|
44
|
+
|
|
45
|
+
## Typography
|
|
46
|
+
|
|
47
|
+
- **Display / labels:** `system-ui` throughout — no serif, no
|
|
48
|
+
monospace-as-display. The industrial voice comes from weight, case, and
|
|
49
|
+
tracking, not font family. Buttons, badges, tabs, and table headers are
|
|
50
|
+
uppercase at weight 800, tracked `var(--rb-label-tracking)` (`0.08em`).
|
|
51
|
+
- **Body:** `system-ui`, weight 400.
|
|
52
|
+
- **Numerals:** `font-variant-numeric: tabular-nums` on tables, so counts
|
|
53
|
+
and sizes align in a column.
|
|
54
|
+
- **Mono:** `ui-monospace` stack reserved for code-shaped content; not the
|
|
55
|
+
display voice.
|
|
56
|
+
- **Bare tags:** unclassed `h1`-`h6` pick up the display voice directly —
|
|
57
|
+
weight 800, tracking `0.08em`, `--rb-space-3` margin below, tight
|
|
58
|
+
`line-height: 1.1`. Bare `p` shares that margin; bare `ul`/`ol` add it too,
|
|
59
|
+
with `--rb-space-4` marker indent (real disc/decimal markers, not stripped).
|
|
60
|
+
|
|
61
|
+
## Shape & effects
|
|
62
|
+
|
|
63
|
+
- Radius `0` everywhere — buttons, cards, dialogs, inputs, tabs. The one
|
|
64
|
+
concession is `--rb-radius-pill` (`0.125rem`), used for badges: near-square,
|
|
65
|
+
never a true rounded pill.
|
|
66
|
+
- Depth is a literal offset, not blur: `--rb-shadow-sm` (`2px 2px 0`) resting,
|
|
67
|
+
`--rb-shadow-lg` (`4px 4px 0`) for dialogs and raised cards. `--rb-blur` is
|
|
68
|
+
`0px` — this theme never applies `backdrop-filter` or any soft blur.
|
|
69
|
+
Dialog backdrops are a flat `rgba(0,0,0,.6)` scrim.
|
|
70
|
+
Focus is a hard border-weight change (1px to 2px solid accent), never a
|
|
71
|
+
soft wash ring or glow.
|
|
72
|
+
- Primary buttons carry the theme's signature interaction: the offset shadow
|
|
73
|
+
disappears and the button translates by the shadow's own offset on
|
|
74
|
+
hover/active (`transform: translate(2px, 2px); box-shadow: none;`) — the
|
|
75
|
+
classic "pressed into the surface" brutalist button.
|
|
76
|
+
- The **one gradient** (`--rb-accent-grad`, orange → red, 2-stop, no soft
|
|
77
|
+
midpoint) is rationed to exactly one place: the active-tab underline.
|
|
78
|
+
Everywhere else that reads as accent is a solid fill.
|
|
79
|
+
- Transitions `0.1s`, no easing softness. Every animation and transition
|
|
80
|
+
respects `prefers-reduced-motion`.
|
|
81
|
+
- 4px spacing rhythm (`--rb-space-1..5`).
|
|
82
|
+
|
|
83
|
+
## Components
|
|
84
|
+
|
|
85
|
+
Class prefix `rb-`; shared token/class contract with the other themes. Only
|
|
86
|
+
the baseline ten — no theme-specific extras.
|
|
87
|
+
|
|
88
|
+
- **Button** `.rb-btn` — outlined ghost by default; `--primary` is a solid
|
|
89
|
+
accent fill with the offset-shadow press interaction; `--accent` an
|
|
90
|
+
accent-wash chip; `--danger` a danger-colored ghost; `--ghost` chromeless.
|
|
91
|
+
`--sm` is the compact size for dense toolbars and table-row actions.
|
|
92
|
+
`.rb-icon-btn` is a square icon-only hit target (>=2rem), paired with `.rb-btn`.
|
|
93
|
+
- **Card** `.rb-card` (+ `--raised`) — surface panel, a thicker
|
|
94
|
+
`border-strong` edge, `shadow-sm` (`--raised` upgrades to `shadow-lg`).
|
|
95
|
+
- **Link** `.rb-link` (nav/sidebar row) — hover fills to surface-2 and stamps
|
|
96
|
+
a hard 3px solid accent bar on the left edge; `--active` adds the accent
|
|
97
|
+
wash and bold text.
|
|
98
|
+
- **Nav rail** `.rb-nav-rail` — the sidebar container: 14rem fixed-width flex
|
|
99
|
+
column, surface background, a 1px border-strong right edge (this theme's
|
|
100
|
+
spec-sheet convention, not a faint hairline). Composes with `.rb-link` for
|
|
101
|
+
items; introduces no active-state convention of its own.
|
|
102
|
+
- **Form** `.rb-input` / `.rb-textarea` / `.rb-select` / `.rb-label` /
|
|
103
|
+
`.rb-field` / `.rb-choice` / `.rb-checkbox` / `.rb-radio` / `.rb-switch` —
|
|
104
|
+
sunken square fields; focus swaps the border from 1px to 2px solid accent;
|
|
105
|
+
checked checkbox/radio/switch states are a flat accent fill, not a tint
|
|
106
|
+
ring; labels are uppercase, tracked, weight 600.
|
|
107
|
+
- **Badge** `.rb-badge` — uppercase weight 700, near-square (`radius-pill`);
|
|
108
|
+
a 16%-tint fill of its hue behind full-strength text, plus a 1px solid
|
|
109
|
+
border of that same hue — badges carry a border here, unlike softer themes.
|
|
110
|
+
- **Alert** `.rb-alert` — surface panel with a 6px solid left bar (thicker
|
|
111
|
+
than the library norm) in the semantic colour, square corners.
|
|
112
|
+
- **Dialog** `.rb-dialog` — native `<dialog>`, surface bg, a 2px
|
|
113
|
+
`border-strong` edge, `shadow-lg`, a flat unblurred backdrop, uppercase
|
|
114
|
+
weight-800 title.
|
|
115
|
+
- **Tabs** `.rb-tabs` / `.rb-tab` / `.rb-tabpanel` — uppercase text tabs; the
|
|
116
|
+
active tab is accent, underlined with the rationed 2-stop gradient.
|
|
117
|
+
- **Table** `.rb-table` (+ `.rb-num`) — dense, uppercase weight-700 headers,
|
|
118
|
+
1px `border-strong` rules throughout (a spec-sheet read, not faint
|
|
119
|
+
hairlines), tabular numerals, instant row hover to surface-2.
|
|
120
|
+
`--interactive` marks clickable rows: pointer cursor, plus an (equally
|
|
121
|
+
instant) focus-visible ring and surface-2 wash for a `tabindex` row or a
|
|
122
|
+
row-wrapping button/link.
|
|
123
|
+
- **Progress / Spinner** `.rb-progress` / `.rb-spinner` — sunken square
|
|
124
|
+
trough, solid accent fill (no gradient fill); the spinner keeps the
|
|
125
|
+
zero-radius signature as a square rotating frame.
|
|
126
|
+
- **Stepper** `.rb-stepper` (+ `__step` / `__node` / `__label`, `--complete` /
|
|
127
|
+
`--current` / `--upcoming`) — a milestone rail: complete nodes solid accent
|
|
128
|
+
with a checkmark, current a surface-fill ring with an accent border,
|
|
129
|
+
lifted with the hard, literal offset `shadow-lg` (never a glow or blur), upcoming faint
|
|
130
|
+
surface-2. Labels carry the brutalist uppercase/tracked voice through
|
|
131
|
+
weight and case, same as every other label here. Rail fill snaps instantly
|
|
132
|
+
instead of transitioning, matching this theme's every other hover/fill.
|
|
133
|
+
- **Muted text** `.rb-muted` — faint secondary/empty-state text;
|
|
134
|
+
`color: var(--rb-text-faint)` only, no italic — brutalism carries its voice
|
|
135
|
+
through weight, case, and tracking, never a softening slant.
|
|
136
|
+
- **Pre / log block** `.rb-pre` — command/log `<pre>`; surface-sunken
|
|
137
|
+
background, hairline border, zero radius (falls out of `--rb-radius`),
|
|
138
|
+
small mono, horizontal scroll. Pair with `.rb-log`
|
|
139
|
+
(`<pre class="rb-pre rb-log">`) for multi-line streaming output: a capped
|
|
140
|
+
16rem height with vertical scroll, wrapped lines instead of horizontal
|
|
141
|
+
scroll, and roomier line-height for dense text.
|
|
142
|
+
|
|
143
|
+
## Light counterpart
|
|
144
|
+
|
|
145
|
+
`concrete-signal-light` — the AA-tuned light secondary, same brutalist
|
|
146
|
+
mechanics, same `rb-*` classes and behaviour, only the palette inverted onto
|
|
147
|
+
a poured-concrete off-white ground.
|
|
148
|
+
|
|
149
|
+
| Role | Value |
|
|
150
|
+
| --- | --- |
|
|
151
|
+
| Background | `#eeece6` |
|
|
152
|
+
| Surface | `#f7f6f2` |
|
|
153
|
+
| Surface 2 | `#e4e2da` |
|
|
154
|
+
| Surface sunken | `#dcdad2` |
|
|
155
|
+
| Text | `#141311` |
|
|
156
|
+
| Text soft | `#4a4844` |
|
|
157
|
+
| Text faint | `#5f5d58` |
|
|
158
|
+
| Border | `#c9c6bc` |
|
|
159
|
+
| Border strong | `#a8a59a` |
|
|
160
|
+
| Accent | `#cc4611` |
|
|
161
|
+
| Accent fg | `#ffffff` |
|
|
162
|
+
| Gradient | `linear-gradient(90deg,#cc4611,#b8281f)` |
|
|
163
|
+
|
|
164
|
+
See `concrete-signal-light`'s own `design.md` for its full color table and
|
|
165
|
+
notes — the behaviour is identical; only the palette is light.
|
|
166
|
+
|
|
167
|
+
## Scoping
|
|
168
|
+
|
|
169
|
+
Every rule is guarded by `data-rb-style="concrete-signal"` (self or
|
|
170
|
+
ancestor), wrapped in zero-specificity `:where()`. Set the attribute on
|
|
171
|
+
`<html>` for a page or on a container for an embedded island.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* concrete-signal — 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 — design tokens
|
|
2
|
+
* Brutalist industrial: raw poured concrete + hazard signage. The coldest,
|
|
3
|
+
* hardest theme in the library — zero border-radius everywhere, thick hairline
|
|
4
|
+
* borders, and hard offset shadows (Npx Npx 0, no blur) instead of glow or
|
|
5
|
+
* soft blur, so depth reads as literal physical offset, like a stamped card.
|
|
6
|
+
* Safety-orange is the sole accent, used exactly as functionally as
|
|
7
|
+
* arcane-obsidian's violet: interaction/focus/emphasis only, never decoration.
|
|
8
|
+
* Consume via:
|
|
9
|
+
* @import "@rackbops/styles/concrete-signal/tokens";
|
|
10
|
+
* or pull the whole theme with ./index.css.
|
|
11
|
+
*
|
|
12
|
+
* Nothing applies until an element carries data-rb-style="concrete-signal" —
|
|
13
|
+
* set it on <html> for a page, or on any container for an embedded island.
|
|
14
|
+
* The :where() keeps specificity at zero, so any consumer rule overrides.
|
|
15
|
+
*
|
|
16
|
+
* This theme ships its dark, primary look; its light counterpart
|
|
17
|
+
* "concrete-signal-light" is a separate theme directory with the identical
|
|
18
|
+
* component contract — only the palette differs.
|
|
19
|
+
*/
|
|
20
|
+
:where([data-rb-style="concrete-signal"]) {
|
|
21
|
+
color-scheme: dark;
|
|
22
|
+
|
|
23
|
+
/* color — raw poured concrete */
|
|
24
|
+
--rb-bg: #121212;
|
|
25
|
+
--rb-surface: #1a1a1a;
|
|
26
|
+
--rb-surface-2: #232323;
|
|
27
|
+
--rb-surface-sunken: #0a0a0a;
|
|
28
|
+
--rb-text: #f2f2f0;
|
|
29
|
+
--rb-text-soft: #b8b8b4;
|
|
30
|
+
--rb-text-faint: #8f8f8a;
|
|
31
|
+
--rb-border: #3a3a38;
|
|
32
|
+
--rb-border-strong: #55534e;
|
|
33
|
+
|
|
34
|
+
/* accent — safety-orange is the sole brand voice: interaction/focus/emphasis only */
|
|
35
|
+
--rb-accent: #ff5e1a;
|
|
36
|
+
--rb-accent-fg: #121212;
|
|
37
|
+
--rb-accent-wash: rgba(255, 94, 26, 0.16);
|
|
38
|
+
|
|
39
|
+
/* the ONE gradient — rationed to the active-tab underline only */
|
|
40
|
+
--rb-accent-grad: linear-gradient(90deg, #ff5e1a, #e8342a);
|
|
41
|
+
|
|
42
|
+
/* semantic — colour beyond the accent is earned: severity/status only */
|
|
43
|
+
--rb-info: #4ea1e0;
|
|
44
|
+
--rb-success: #4caa5c;
|
|
45
|
+
--rb-warning: #e8b23a;
|
|
46
|
+
--rb-danger: #e8342a;
|
|
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(0, 0, 0, 0.6);
|
|
65
|
+
--rb-shadow-lg: 4px 4px 0 rgba(0, 0, 0, 0.6);
|
|
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,57 @@
|
|
|
1
|
+
/* concrete-signal-light — 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-light"]) {
|
|
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-light"], [data-rb-style="concrete-signal-light"] *),
|
|
18
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *)::before,
|
|
19
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *)::after {
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:where(html[data-rb-style="concrete-signal-light"]) 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-light"], [data-rb-style="concrete-signal-light"] *):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-light"], [data-rb-style="concrete-signal-light"] *):where(p) {
|
|
42
|
+
margin: 0 0 var(--rb-space-3);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *):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-light"], [data-rb-style="concrete-signal-light"] *):where(a) {
|
|
51
|
+
color: var(--rb-accent);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *)::selection {
|
|
55
|
+
background: var(--rb-accent);
|
|
56
|
+
color: var(--rb-accent-fg);
|
|
57
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* concrete-signal-light — 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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--info {
|
|
22
|
+
border-left-color: var(--rb-info);
|
|
23
|
+
}
|
|
24
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--success {
|
|
25
|
+
border-left-color: var(--rb-success);
|
|
26
|
+
}
|
|
27
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--warning {
|
|
28
|
+
border-left-color: var(--rb-warning);
|
|
29
|
+
}
|
|
30
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--danger {
|
|
31
|
+
border-left-color: var(--rb-danger);
|
|
32
|
+
}
|
|
33
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--info .rb-alert__title {
|
|
34
|
+
color: var(--rb-info);
|
|
35
|
+
}
|
|
36
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--success .rb-alert__title {
|
|
37
|
+
color: var(--rb-success);
|
|
38
|
+
}
|
|
39
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--warning .rb-alert__title {
|
|
40
|
+
color: var(--rb-warning);
|
|
41
|
+
}
|
|
42
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-alert--danger .rb-alert__title {
|
|
43
|
+
color: var(--rb-danger);
|
|
44
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* concrete-signal-light — 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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light — 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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).rb-btn:hover,
|
|
44
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary:hover,
|
|
59
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary:focus-visible,
|
|
60
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--ghost {
|
|
78
|
+
background: transparent;
|
|
79
|
+
border-color: transparent;
|
|
80
|
+
color: var(--rb-text-soft);
|
|
81
|
+
}
|
|
82
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--ghost:hover,
|
|
83
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).rb-btn,
|
|
95
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-btn--primary {
|
|
96
|
+
transition: none;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* concrete-signal-light — 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-light"], [data-rb-style="concrete-signal-light"] *).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-light"], [data-rb-style="concrete-signal-light"] *).rb-card--raised {
|
|
14
|
+
box-shadow: var(--rb-shadow-lg);
|
|
15
|
+
}
|
|
16
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-card > :first-child {
|
|
17
|
+
margin-top: 0;
|
|
18
|
+
}
|
|
19
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-card > :last-child {
|
|
20
|
+
margin-bottom: 0;
|
|
21
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/* concrete-signal-light — dialog (native <dialog>)
|
|
2
|
+
* A square-cornered slab dropped onto a flat, unblurred backdrop — this
|
|
3
|
+
* theme never uses blur/glass, so the scrim behind the dialog stays flat. */
|
|
4
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog {
|
|
5
|
+
padding: 0;
|
|
6
|
+
max-width: min(92vw, 32rem);
|
|
7
|
+
width: calc(100vw - 2rem);
|
|
8
|
+
background: var(--rb-surface);
|
|
9
|
+
border: 2px solid var(--rb-border-strong);
|
|
10
|
+
border-radius: var(--rb-radius);
|
|
11
|
+
color: var(--rb-text);
|
|
12
|
+
box-shadow: var(--rb-shadow-lg);
|
|
13
|
+
}
|
|
14
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog::backdrop {
|
|
15
|
+
background: rgba(0, 0, 0, 0.6);
|
|
16
|
+
}
|
|
17
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog__body {
|
|
18
|
+
padding: var(--rb-space-5);
|
|
19
|
+
}
|
|
20
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog__title {
|
|
21
|
+
margin: 0 0 var(--rb-space-3);
|
|
22
|
+
text-transform: uppercase;
|
|
23
|
+
font-family: var(--rb-font-display);
|
|
24
|
+
font-weight: var(--rb-font-weight-bold);
|
|
25
|
+
letter-spacing: var(--rb-label-tracking);
|
|
26
|
+
}
|
|
27
|
+
:where([data-rb-style="concrete-signal-light"], [data-rb-style="concrete-signal-light"] *).rb-dialog__actions {
|
|
28
|
+
display: flex;
|
|
29
|
+
justify-content: flex-end;
|
|
30
|
+
gap: var(--rb-space-2);
|
|
31
|
+
padding: var(--rb-space-3) var(--rb-space-5);
|
|
32
|
+
border-top: 1px solid var(--rb-border);
|
|
33
|
+
}
|