@rackbops/styles 0.1.0
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 +14 -0
- package/arcane-obsidian/base.css +46 -0
- package/arcane-obsidian/components/alert.css +28 -0
- package/arcane-obsidian/components/badge.css +33 -0
- package/arcane-obsidian/components/button.css +73 -0
- package/arcane-obsidian/components/card.css +14 -0
- package/arcane-obsidian/components/dialog.css +31 -0
- package/arcane-obsidian/components/eyebrow.css +12 -0
- package/arcane-obsidian/components/form.css +70 -0
- package/arcane-obsidian/components/link.css +46 -0
- package/arcane-obsidian/components/progress.css +40 -0
- package/arcane-obsidian/components/table.css +27 -0
- package/arcane-obsidian/components/tabs.css +45 -0
- package/arcane-obsidian/components/tabstrip.css +35 -0
- package/arcane-obsidian/components/wordmark.css +23 -0
- package/arcane-obsidian/design.md +133 -0
- package/arcane-obsidian/index.css +16 -0
- package/arcane-obsidian/tokens.css +81 -0
- package/arcane-parchment/base.css +46 -0
- package/arcane-parchment/components/alert.css +28 -0
- package/arcane-parchment/components/badge.css +33 -0
- package/arcane-parchment/components/button.css +75 -0
- package/arcane-parchment/components/card.css +14 -0
- package/arcane-parchment/components/dialog.css +31 -0
- package/arcane-parchment/components/eyebrow.css +12 -0
- package/arcane-parchment/components/form.css +70 -0
- package/arcane-parchment/components/link.css +46 -0
- package/arcane-parchment/components/progress.css +40 -0
- package/arcane-parchment/components/table.css +27 -0
- package/arcane-parchment/components/tabs.css +45 -0
- package/arcane-parchment/components/tabstrip.css +35 -0
- package/arcane-parchment/components/wordmark.css +23 -0
- package/arcane-parchment/design.md +89 -0
- package/arcane-parchment/index.css +16 -0
- package/arcane-parchment/tokens.css +78 -0
- package/luminous-precision/base.css +58 -0
- package/luminous-precision/components/alert.css +26 -0
- package/luminous-precision/components/badge.css +19 -0
- package/luminous-precision/components/button.css +88 -0
- package/luminous-precision/components/card.css +12 -0
- package/luminous-precision/components/dialog.css +31 -0
- package/luminous-precision/components/form.css +126 -0
- package/luminous-precision/components/link.css +46 -0
- package/luminous-precision/components/progress.css +41 -0
- package/luminous-precision/components/table.css +28 -0
- package/luminous-precision/components/tabs.css +33 -0
- package/luminous-precision/design.md +124 -0
- package/luminous-precision/index.css +13 -0
- package/luminous-precision/tokens.css +89 -0
- package/manifest.json +39 -0
- package/neon-butterfly/assets/butterfly-circuit.png +0 -0
- package/neon-butterfly/base.css +49 -0
- package/neon-butterfly/components/alert.css +26 -0
- package/neon-butterfly/components/badge.css +17 -0
- package/neon-butterfly/components/button.css +54 -0
- package/neon-butterfly/components/card.css +11 -0
- package/neon-butterfly/components/dialog.css +29 -0
- package/neon-butterfly/components/form.css +124 -0
- package/neon-butterfly/components/link.css +55 -0
- package/neon-butterfly/components/progress.css +41 -0
- package/neon-butterfly/components/table.css +27 -0
- package/neon-butterfly/components/tabs.css +33 -0
- package/neon-butterfly/design.md +103 -0
- package/neon-butterfly/index.css +13 -0
- package/neon-butterfly/tokens.css +89 -0
- package/package.json +60 -0
- package/rackbops-noir/base.css +53 -0
- package/rackbops-noir/components/alert.css +30 -0
- package/rackbops-noir/components/badge.css +39 -0
- package/rackbops-noir/components/button.css +79 -0
- package/rackbops-noir/components/card.css +37 -0
- package/rackbops-noir/components/dialog.css +33 -0
- package/rackbops-noir/components/eyebrow.css +21 -0
- package/rackbops-noir/components/form.css +70 -0
- package/rackbops-noir/components/link.css +31 -0
- package/rackbops-noir/components/principle.css +31 -0
- package/rackbops-noir/components/progress.css +40 -0
- package/rackbops-noir/components/rack.css +93 -0
- package/rackbops-noir/components/table.css +31 -0
- package/rackbops-noir/components/tabs.css +45 -0
- package/rackbops-noir/components/tag.css +20 -0
- package/rackbops-noir/design.md +85 -0
- package/rackbops-noir/index.css +17 -0
- package/rackbops-noir/tokens.css +66 -0
- package/rackbops-studio/assets/boppy.svg +17 -0
- package/rackbops-studio/base.css +53 -0
- package/rackbops-studio/components/alert.css +30 -0
- package/rackbops-studio/components/badge.css +39 -0
- package/rackbops-studio/components/button.css +78 -0
- package/rackbops-studio/components/card.css +37 -0
- package/rackbops-studio/components/dialog.css +33 -0
- package/rackbops-studio/components/eyebrow.css +21 -0
- package/rackbops-studio/components/form.css +70 -0
- package/rackbops-studio/components/link.css +31 -0
- package/rackbops-studio/components/principle.css +31 -0
- package/rackbops-studio/components/progress.css +40 -0
- package/rackbops-studio/components/rack.css +94 -0
- package/rackbops-studio/components/table.css +31 -0
- package/rackbops-studio/components/tabs.css +45 -0
- package/rackbops-studio/components/tag.css +20 -0
- package/rackbops-studio/design.md +157 -0
- package/rackbops-studio/index.css +17 -0
- package/rackbops-studio/tokens.css +77 -0
- package/summer-cloud/base.css +58 -0
- package/summer-cloud/components/alert.css +29 -0
- package/summer-cloud/components/badge.css +49 -0
- package/summer-cloud/components/button.css +109 -0
- package/summer-cloud/components/card.css +35 -0
- package/summer-cloud/components/dialog.css +30 -0
- package/summer-cloud/components/form.css +146 -0
- package/summer-cloud/components/link.css +60 -0
- package/summer-cloud/components/progress.css +43 -0
- package/summer-cloud/components/table.css +34 -0
- package/summer-cloud/components/tabs.css +38 -0
- package/summer-cloud/design.md +165 -0
- package/summer-cloud/index.css +13 -0
- package/summer-cloud/tokens.css +103 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* arcane-parchment — tabs
|
|
2
|
+
* The active tab carries accent text + a faint wash, and the ONE gradient is
|
|
3
|
+
* rationed here as a 2px underline indicator — the console's signature flair. */
|
|
4
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabs {
|
|
5
|
+
display: flex;
|
|
6
|
+
gap: var(--rb-space-2);
|
|
7
|
+
border-bottom: 1px solid var(--rb-border);
|
|
8
|
+
}
|
|
9
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab {
|
|
10
|
+
position: relative;
|
|
11
|
+
padding: var(--rb-space-2) var(--rb-space-4);
|
|
12
|
+
background: transparent;
|
|
13
|
+
border: 0;
|
|
14
|
+
color: var(--rb-text-soft);
|
|
15
|
+
font-family: var(--rb-font-body);
|
|
16
|
+
font-weight: var(--rb-font-weight-medium);
|
|
17
|
+
font-size: var(--rb-text-sm);
|
|
18
|
+
cursor: pointer;
|
|
19
|
+
transition: color var(--rb-transition);
|
|
20
|
+
}
|
|
21
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab:hover {
|
|
22
|
+
color: var(--rb-text);
|
|
23
|
+
}
|
|
24
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab.rb-tab--active {
|
|
25
|
+
color: var(--rb-accent);
|
|
26
|
+
}
|
|
27
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab.rb-tab--active::after {
|
|
28
|
+
content: "";
|
|
29
|
+
position: absolute;
|
|
30
|
+
left: var(--rb-space-3);
|
|
31
|
+
right: var(--rb-space-3);
|
|
32
|
+
bottom: -1px;
|
|
33
|
+
height: 2px;
|
|
34
|
+
border-radius: 2px 2px 0 0;
|
|
35
|
+
background: var(--rb-accent-grad);
|
|
36
|
+
}
|
|
37
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabpanel {
|
|
38
|
+
padding: var(--rb-space-4) 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@media (prefers-reduced-motion: reduce) {
|
|
42
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tab {
|
|
43
|
+
transition: none;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* arcane-parchment — tabstrip (theme extra)
|
|
2
|
+
* The console's top-level view nav: natural-width bordered pill buttons.
|
|
3
|
+
* The active button gets accent text + a faint wash and an accent-tinted
|
|
4
|
+
* border; distinct from the text-underline .rb-tabs used inside a panel. */
|
|
5
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip {
|
|
6
|
+
display: flex;
|
|
7
|
+
gap: var(--rb-space-2);
|
|
8
|
+
padding: var(--rb-space-2) 0;
|
|
9
|
+
}
|
|
10
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab {
|
|
11
|
+
position: relative;
|
|
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
|
+
font-size: var(--rb-text-sm);
|
|
18
|
+
font-weight: var(--rb-font-weight-medium);
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
transition: border-color var(--rb-transition);
|
|
21
|
+
}
|
|
22
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab:hover {
|
|
23
|
+
border-color: var(--rb-accent);
|
|
24
|
+
}
|
|
25
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab.rb-tabstrip__tab--active {
|
|
26
|
+
color: var(--rb-accent);
|
|
27
|
+
border-color: color-mix(in srgb, var(--rb-accent) 40%, var(--rb-border));
|
|
28
|
+
background: var(--rb-accent-wash);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@media (prefers-reduced-motion: reduce) {
|
|
32
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-tabstrip__tab {
|
|
33
|
+
transition: none;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* arcane-parchment — wordmark (theme extra)
|
|
2
|
+
* The brand voice: a mono display h1 with the ONE gradient clipped into the
|
|
3
|
+
* text, and a solid-accent spark mark that stays un-clipped. This and the
|
|
4
|
+
* active tab underline are the only two places the gradient is spent. */
|
|
5
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-wordmark {
|
|
6
|
+
display: inline-flex;
|
|
7
|
+
align-items: baseline;
|
|
8
|
+
gap: 0.4em;
|
|
9
|
+
margin: 0;
|
|
10
|
+
font-family: var(--rb-font-display);
|
|
11
|
+
font-weight: var(--rb-font-weight-medium);
|
|
12
|
+
font-size: 15px;
|
|
13
|
+
letter-spacing: var(--rb-heading-tracking);
|
|
14
|
+
background-image: var(--rb-accent-grad);
|
|
15
|
+
background-clip: text;
|
|
16
|
+
-webkit-background-clip: text;
|
|
17
|
+
color: transparent;
|
|
18
|
+
-webkit-text-fill-color: transparent;
|
|
19
|
+
}
|
|
20
|
+
:where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-wordmark__spark {
|
|
21
|
+
color: var(--rb-accent);
|
|
22
|
+
-webkit-text-fill-color: var(--rb-accent);
|
|
23
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# arcane-parchment
|
|
2
|
+
|
|
3
|
+
The light, AA-tuned counterpart of **arcane-obsidian** — artifact-console's
|
|
4
|
+
"Parchment" scheme. Same developer-console language (monospace display voice over
|
|
5
|
+
a `system-ui` body, tabular numerals, the sole arcane-violet accent, the one
|
|
6
|
+
rationed violet→gold gradient, flat shadow-based depth) rendered on a cool
|
|
7
|
+
off-white ground instead of obsidian. It ships the identical `rb-*` component set
|
|
8
|
+
as arcane-obsidian — the components are token-driven, so only the palette differs
|
|
9
|
+
— and swaps in with a single attribute flip. Derived from artifact-console#31.
|
|
10
|
+
|
|
11
|
+
## Color
|
|
12
|
+
|
|
13
|
+
Palette values match artifact-console's light scheme. Unlike the studio themes,
|
|
14
|
+
the arcane accent (a darker violet) stays **above WCAG AA as text on white**
|
|
15
|
+
(~5.5:1), so accent labels, body text, and the muted ramp all clear AA. The one
|
|
16
|
+
exception — inherited from artifact-console itself — is the semantic chip colours
|
|
17
|
+
(`--rb-success/--rb-warning/...`) used as small text on their faint tint, which
|
|
18
|
+
sit below 4.5:1; treat those as status accents, not body copy.
|
|
19
|
+
|
|
20
|
+
| Role | Value | Usage |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Background | `#f6f7f9` (cool parchment) | Page canvas |
|
|
23
|
+
| Surface | `#ffffff` | Cards, header, panels |
|
|
24
|
+
| Surface 2 | `#f1f3f7` | Raised/hover surface, active-tab wash base |
|
|
25
|
+
| Surface sunken | `#edeff3` | Inset fields, log wells, progress troughs |
|
|
26
|
+
| Text | `#191d26` | Body text |
|
|
27
|
+
| Text soft | `#4a5261` | Secondary text |
|
|
28
|
+
| Text faint | `#5f6b7d` | Labels, headers, meta (tuned darker than report's `#7c8598` for AA) |
|
|
29
|
+
| Border | `#e2e6ec` | Resting hairline borders |
|
|
30
|
+
| Border strong | `#cbd2dc` | Dialog edges, header rules |
|
|
31
|
+
| Accent | `#6a4fe0` (arcane-violet) | The sole brand voice: emphasis, active state, focus (~5.5:1 on white) |
|
|
32
|
+
| Accent fg | `#ffffff` | White on the solid violet fill |
|
|
33
|
+
| Accent wash | `rgba(106,79,224,.12)` | Active/hover tint behind accent text |
|
|
34
|
+
| Info | `#1e6fd0` | Informational chips |
|
|
35
|
+
| Success | `#1f9d57` | Healthy/live status |
|
|
36
|
+
| Warning | `#c07d12` | Caution status |
|
|
37
|
+
| Danger | `#d64550` | Destructive actions, errors |
|
|
38
|
+
|
|
39
|
+
**Rules.** Colour is functional. Resting UI is parchment, white, and faint;
|
|
40
|
+
violet appears only on interaction, focus, active state, and emphasis. Colour
|
|
41
|
+
beyond the accent is *earned* — severity and status chips are the one place other
|
|
42
|
+
hues appear. Muted-on-surface is tuned to clear WCAG AA (4.5:1) on every surface.
|
|
43
|
+
|
|
44
|
+
## Typography
|
|
45
|
+
|
|
46
|
+
Identical to arcane-obsidian: monospace display voice (the wordmark, weight 600,
|
|
47
|
+
tracking `-0.01em`) over a `system-ui` body (weight 400); `tabular-nums` wherever
|
|
48
|
+
data is shown; mono uppercase labels tracked `0.06em`.
|
|
49
|
+
|
|
50
|
+
## Shape & effects
|
|
51
|
+
|
|
52
|
+
- Radius `0.4375rem` (7px) for buttons/inputs/rows; `0.75rem` (12px) for cards
|
|
53
|
+
and dialogs; pills for chips/badges and progress troughs.
|
|
54
|
+
- Flat, shadow-based depth: a two-step light shadow ramp (`--rb-shadow-sm`
|
|
55
|
+
resting, `--rb-shadow-lg` for dialogs/raised cards). No glow.
|
|
56
|
+
- Focus is the accent: inputs swap to a violet border + a soft `--rb-accent-wash`
|
|
57
|
+
ring; interactive elements take a 2px accent outline.
|
|
58
|
+
- The **one gradient** (`--rb-accent-grad`, violet → orchid → gold) is rationed
|
|
59
|
+
to the wordmark and the active-tab underline only; primary buttons stay a solid
|
|
60
|
+
accent fill.
|
|
61
|
+
- Transitions `0.15s`; every animation respects `prefers-reduced-motion`.
|
|
62
|
+
- 4px spacing rhythm.
|
|
63
|
+
|
|
64
|
+
## Components
|
|
65
|
+
|
|
66
|
+
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`. See arcane-obsidian's `design.md`
|
|
71
|
+
for the per-component notes — the behaviour is the same; only the palette is light.
|
|
72
|
+
|
|
73
|
+
## Code syntax
|
|
74
|
+
|
|
75
|
+
Tokens `--rb-code-*` (a per-theme extra), light-tuned for AA on the parchment
|
|
76
|
+
ground: violet keywords, dark-green strings, dark-amber numbers, info-blue
|
|
77
|
+
functions, dark-violet types, rose variables, dimmed comments/meta.
|
|
78
|
+
|
|
79
|
+
## Dark counterpart
|
|
80
|
+
|
|
81
|
+
`arcane-obsidian` — the primary, dark look. This theme and it share the same
|
|
82
|
+
`--rb-*` baseline and `rb-*` classes, so switching `data-rb-style` between them
|
|
83
|
+
restyles a page without touching markup.
|
|
84
|
+
|
|
85
|
+
## Scoping
|
|
86
|
+
|
|
87
|
+
Every rule is guarded by `data-rb-style="arcane-parchment"` (self or ancestor),
|
|
88
|
+
wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a page
|
|
89
|
+
or on a container for an embedded island.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/* arcane-parchment — full theme entry point */
|
|
2
|
+
@import "./tokens.css";
|
|
3
|
+
@import "./base.css";
|
|
4
|
+
@import "./components/button.css";
|
|
5
|
+
@import "./components/card.css";
|
|
6
|
+
@import "./components/link.css";
|
|
7
|
+
@import "./components/form.css";
|
|
8
|
+
@import "./components/badge.css";
|
|
9
|
+
@import "./components/alert.css";
|
|
10
|
+
@import "./components/dialog.css";
|
|
11
|
+
@import "./components/tabs.css";
|
|
12
|
+
@import "./components/table.css";
|
|
13
|
+
@import "./components/progress.css";
|
|
14
|
+
@import "./components/eyebrow.css";
|
|
15
|
+
@import "./components/wordmark.css";
|
|
16
|
+
@import "./components/tabstrip.css";
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* arcane-parchment — design tokens
|
|
2
|
+
* The light, AA-tuned counterpart of arcane-obsidian: artifact-console's
|
|
3
|
+
* "Parchment" scheme. Same structure, class contract, and component CSS as
|
|
4
|
+
* arcane-obsidian (token-driven) — only the palette and code colours differ.
|
|
5
|
+
* Consume via:
|
|
6
|
+
* @import "@rackbops/styles/arcane-parchment/tokens";
|
|
7
|
+
* or pull the whole theme with ./index.css.
|
|
8
|
+
*
|
|
9
|
+
* Nothing applies until an element carries data-rb-style="arcane-parchment".
|
|
10
|
+
* Every theme declares the same baseline token set (styles/test enforces
|
|
11
|
+
* parity); names marked (extra) are additions this theme's own component CSS
|
|
12
|
+
* may rely on. Palette values match artifact-console's light scheme.
|
|
13
|
+
*/
|
|
14
|
+
:where([data-rb-style="arcane-parchment"]) {
|
|
15
|
+
color-scheme: light;
|
|
16
|
+
|
|
17
|
+
/* color — cool off-white parchment, white raised surfaces */
|
|
18
|
+
--rb-bg: #f6f7f9;
|
|
19
|
+
--rb-surface: #ffffff;
|
|
20
|
+
--rb-surface-2: #f1f3f7;
|
|
21
|
+
--rb-surface-sunken: #edeff3; /* inset fields, log wells */
|
|
22
|
+
--rb-text: #191d26;
|
|
23
|
+
--rb-text-soft: #4a5261;
|
|
24
|
+
--rb-text-faint: #5f6b7d; /* tuned darker than report's #7c8598 so muted-on-surface clears AA */
|
|
25
|
+
--rb-border: #e2e6ec;
|
|
26
|
+
--rb-border-strong: #cbd2dc;
|
|
27
|
+
|
|
28
|
+
/* accent — arcane-violet, the sole brand voice (darker on light for AA) */
|
|
29
|
+
--rb-accent: #6a4fe0;
|
|
30
|
+
--rb-accent-fg: #ffffff; /* white on the solid violet fill */
|
|
31
|
+
--rb-accent-wash: rgba(106, 79, 224, 0.12);
|
|
32
|
+
|
|
33
|
+
/* the ONE gradient — rationed to wordmark + active tab only */
|
|
34
|
+
--rb-accent-grad: linear-gradient(120deg, #6a4fe0, #a25be0 46%, #d99a2a);
|
|
35
|
+
|
|
36
|
+
/* semantic — earned: severity/status only */
|
|
37
|
+
--rb-info: #1e6fd0;
|
|
38
|
+
--rb-success: #1f9d57;
|
|
39
|
+
--rb-warning: #c07d12;
|
|
40
|
+
--rb-danger: #d64550;
|
|
41
|
+
|
|
42
|
+
/* code syntax (extra) — light-tuned; only this theme renders code */
|
|
43
|
+
--rb-code-keyword: #6a4fe0;
|
|
44
|
+
--rb-code-string: #0f7a3d;
|
|
45
|
+
--rb-code-number: #9a6400;
|
|
46
|
+
--rb-code-comment: #7c8598;
|
|
47
|
+
--rb-code-function: #1e6fd0;
|
|
48
|
+
--rb-code-variable: #c2255c;
|
|
49
|
+
--rb-code-type: #7a3ecc;
|
|
50
|
+
--rb-code-meta: #5f6b7d;
|
|
51
|
+
|
|
52
|
+
/* typography — monospace display voice over a system-ui body; tabular numerals */
|
|
53
|
+
--rb-font-display: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
|
|
54
|
+
--rb-font-body: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
55
|
+
--rb-font-mono: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
|
|
56
|
+
--rb-font-weight: 400;
|
|
57
|
+
--rb-font-weight-medium: 600;
|
|
58
|
+
--rb-font-weight-bold: 700;
|
|
59
|
+
--rb-heading-tracking: -0.01em;
|
|
60
|
+
--rb-label-tracking: 0.06em;
|
|
61
|
+
--rb-text-sm: 13px;
|
|
62
|
+
|
|
63
|
+
/* shape & effects — flat, compact console radii; soft light shadows */
|
|
64
|
+
--rb-radius: 0.4375rem; /* 7px */
|
|
65
|
+
--rb-radius-lg: 0.75rem; /* 12px */
|
|
66
|
+
--rb-radius-pill: 999px;
|
|
67
|
+
--rb-shadow-sm: 0 1px 2px rgba(20, 25, 40, 0.06);
|
|
68
|
+
--rb-shadow-lg: 0 6px 24px rgba(20, 25, 40, 0.1);
|
|
69
|
+
--rb-blur: 12px;
|
|
70
|
+
--rb-transition: 0.15s;
|
|
71
|
+
|
|
72
|
+
/* spacing — 4px rhythm */
|
|
73
|
+
--rb-space-1: 0.25rem;
|
|
74
|
+
--rb-space-2: 0.5rem;
|
|
75
|
+
--rb-space-3: 0.75rem;
|
|
76
|
+
--rb-space-4: 1rem;
|
|
77
|
+
--rb-space-5: 1.5rem;
|
|
78
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/* luminous-precision — base styles
|
|
2
|
+
* Scoped defaults. Requires tokens.css. Apps that need webfonts should
|
|
3
|
+
* include the Google Fonts <link>s for Sora (500, 600, 700) and
|
|
4
|
+
* JetBrains Mono (400, 600, 700) or self-host; the token stacks fall back
|
|
5
|
+
* to system families.
|
|
6
|
+
*
|
|
7
|
+
* The element carrying data-rb-style is the theme's canvas: it gets the
|
|
8
|
+
* background, text color, and body font — whether that is <html> for a page
|
|
9
|
+
* or a mount container for an embedded island. Page-only rules (body margin,
|
|
10
|
+
* viewport height) apply only when the attribute sits on <html>.
|
|
11
|
+
*/
|
|
12
|
+
:where([data-rb-style="luminous-precision"]) {
|
|
13
|
+
background-color: var(--rb-bg);
|
|
14
|
+
color: var(--rb-text);
|
|
15
|
+
font-family: var(--rb-font-body);
|
|
16
|
+
font-weight: var(--rb-font-weight);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *),
|
|
20
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *)::before,
|
|
21
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *)::after {
|
|
22
|
+
box-sizing: border-box;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
:where(html[data-rb-style="luminous-precision"]) body {
|
|
26
|
+
margin: 0;
|
|
27
|
+
min-height: 100vh;
|
|
28
|
+
background-color: var(--rb-bg);
|
|
29
|
+
color: var(--rb-text);
|
|
30
|
+
font-family: var(--rb-font-body);
|
|
31
|
+
font-weight: var(--rb-font-weight);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Opt-in page background: soft out-of-focus orchid/teal underlays over the
|
|
35
|
+
* obsidian base — the "luminous underlay" treatment. Apply to <body>, or to
|
|
36
|
+
* the attributed container itself. */
|
|
37
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-bg {
|
|
38
|
+
background:
|
|
39
|
+
radial-gradient(50rem 30rem at 12% -5%, rgba(198, 165, 255, 0.08), transparent 70%),
|
|
40
|
+
radial-gradient(55rem 35rem at 90% 105%, rgba(0, 245, 255, 0.05), transparent 70%),
|
|
41
|
+
var(--rb-bg);
|
|
42
|
+
background-attachment: fixed;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(h1, h2, h3, h4, h5, h6) {
|
|
46
|
+
font-family: var(--rb-font-display);
|
|
47
|
+
font-weight: var(--rb-font-weight-medium);
|
|
48
|
+
letter-spacing: var(--rb-heading-tracking);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *):where(a) {
|
|
52
|
+
color: var(--rb-accent);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *)::selection {
|
|
56
|
+
background: var(--rb-accent);
|
|
57
|
+
color: var(--rb-bg);
|
|
58
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/* luminous-precision — alert / callout */
|
|
2
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert {
|
|
3
|
+
padding: var(--rb-space-3) var(--rb-space-4);
|
|
4
|
+
background: var(--rb-surface-glass);
|
|
5
|
+
border: 1px solid var(--rb-border);
|
|
6
|
+
border-left-width: 3px;
|
|
7
|
+
border-radius: var(--rb-radius);
|
|
8
|
+
backdrop-filter: blur(var(--rb-blur));
|
|
9
|
+
color: var(--rb-text);
|
|
10
|
+
font-size: var(--rb-text-sm);
|
|
11
|
+
}
|
|
12
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--info { border-left-color: var(--rb-info); }
|
|
13
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--success { border-left-color: var(--rb-success); }
|
|
14
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--warning { border-left-color: var(--rb-warning); }
|
|
15
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--danger { border-left-color: var(--rb-danger); }
|
|
16
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert__title {
|
|
17
|
+
display: block;
|
|
18
|
+
margin-bottom: var(--rb-space-1);
|
|
19
|
+
text-transform: uppercase;
|
|
20
|
+
font-weight: var(--rb-font-weight-medium);
|
|
21
|
+
letter-spacing: var(--rb-label-tracking);
|
|
22
|
+
}
|
|
23
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--info .rb-alert__title { color: var(--rb-info); }
|
|
24
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--success .rb-alert__title { color: var(--rb-success); }
|
|
25
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--warning .rb-alert__title { color: var(--rb-warning); }
|
|
26
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-alert--danger .rb-alert__title { color: var(--rb-danger); }
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* luminous-precision — badge: pill chip, 15% tint of its hue behind
|
|
2
|
+
* full-saturation text */
|
|
3
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge {
|
|
4
|
+
display: inline-block;
|
|
5
|
+
padding: 0.15rem var(--rb-space-2);
|
|
6
|
+
background: rgba(255, 255, 255, 0.08);
|
|
7
|
+
border: none;
|
|
8
|
+
border-radius: 9999px;
|
|
9
|
+
color: var(--rb-text-faint);
|
|
10
|
+
text-transform: uppercase;
|
|
11
|
+
font-size: 11px;
|
|
12
|
+
font-weight: var(--rb-font-weight-medium);
|
|
13
|
+
letter-spacing: var(--rb-label-tracking);
|
|
14
|
+
}
|
|
15
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--primary { background: rgba(198, 165, 255, 0.15); color: var(--rb-accent); }
|
|
16
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--info { background: rgba(131, 183, 255, 0.15); color: var(--rb-info); }
|
|
17
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--success { background: rgba(71, 227, 78, 0.15); color: var(--rb-success); }
|
|
18
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--warning { background: rgba(255, 184, 108, 0.15); color: var(--rb-warning); }
|
|
19
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-badge--danger { background: rgba(255, 77, 109, 0.15); color: var(--rb-danger); }
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/* luminous-precision — button */
|
|
2
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: var(--rb-space-2);
|
|
6
|
+
padding: var(--rb-space-2) var(--rb-space-3);
|
|
7
|
+
background: transparent;
|
|
8
|
+
border: 1px solid var(--rb-border-strong);
|
|
9
|
+
border-radius: var(--rb-radius);
|
|
10
|
+
color: var(--rb-text);
|
|
11
|
+
text-transform: uppercase;
|
|
12
|
+
font-family: var(--rb-font-mono);
|
|
13
|
+
font-weight: var(--rb-font-weight-medium);
|
|
14
|
+
font-size: var(--rb-text-sm);
|
|
15
|
+
letter-spacing: var(--rb-label-tracking);
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
transition:
|
|
18
|
+
border-color var(--rb-transition),
|
|
19
|
+
color var(--rb-transition),
|
|
20
|
+
box-shadow var(--rb-transition);
|
|
21
|
+
}
|
|
22
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:hover,
|
|
23
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:focus-visible {
|
|
24
|
+
border-color: var(--rb-accent-border);
|
|
25
|
+
color: var(--rb-accent);
|
|
26
|
+
animation: rb-lp-pulse-glow 2s infinite;
|
|
27
|
+
outline: none;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* primary: solid orchid fill, dark text, glow pulse on hover */
|
|
31
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--primary {
|
|
32
|
+
background: var(--rb-accent);
|
|
33
|
+
border-color: var(--rb-accent);
|
|
34
|
+
color: var(--rb-accent-fg);
|
|
35
|
+
}
|
|
36
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--primary:hover,
|
|
37
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--primary:focus-visible {
|
|
38
|
+
border-color: var(--rb-accent);
|
|
39
|
+
color: var(--rb-accent-fg);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* accent: teal ghost — critical navigation paths */
|
|
43
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--accent {
|
|
44
|
+
border-color: var(--rb-accent-2);
|
|
45
|
+
color: var(--rb-accent-2);
|
|
46
|
+
}
|
|
47
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--accent:hover,
|
|
48
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--accent:focus-visible {
|
|
49
|
+
border-color: var(--rb-accent-2);
|
|
50
|
+
color: var(--rb-accent-2);
|
|
51
|
+
animation-name: rb-lp-pulse-glow-accent;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--danger {
|
|
55
|
+
border-color: var(--rb-danger);
|
|
56
|
+
color: var(--rb-danger);
|
|
57
|
+
}
|
|
58
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--danger:hover,
|
|
59
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn--danger:focus-visible {
|
|
60
|
+
border-color: var(--rb-danger);
|
|
61
|
+
color: var(--rb-danger);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:disabled {
|
|
65
|
+
opacity: 0.5;
|
|
66
|
+
cursor: not-allowed;
|
|
67
|
+
animation: none;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@keyframes rb-lp-pulse-glow-accent {
|
|
71
|
+
0%,
|
|
72
|
+
100% {
|
|
73
|
+
box-shadow: 0 0 5px rgba(0, 245, 255, 0.15);
|
|
74
|
+
}
|
|
75
|
+
50% {
|
|
76
|
+
box-shadow: 0 0 20px var(--rb-accent-2-glow);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@media (prefers-reduced-motion: reduce) {
|
|
81
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn {
|
|
82
|
+
transition: none;
|
|
83
|
+
}
|
|
84
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:hover,
|
|
85
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-btn:focus-visible {
|
|
86
|
+
animation: none;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* luminous-precision — card: glass pane with a lit top edge */
|
|
2
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-card {
|
|
3
|
+
padding: var(--rb-space-4);
|
|
4
|
+
background: var(--rb-surface-glass);
|
|
5
|
+
border: 1px solid var(--rb-border);
|
|
6
|
+
border-top-color: var(--rb-border-strong);
|
|
7
|
+
border-radius: var(--rb-radius-lg);
|
|
8
|
+
backdrop-filter: blur(var(--rb-blur));
|
|
9
|
+
color: var(--rb-text);
|
|
10
|
+
}
|
|
11
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-card > :first-child { margin-top: 0; }
|
|
12
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-card > :last-child { margin-bottom: 0; }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* luminous-precision — dialog (native <dialog>) */
|
|
2
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog {
|
|
3
|
+
padding: var(--rb-space-4);
|
|
4
|
+
max-width: 32rem;
|
|
5
|
+
width: calc(100vw - 2rem);
|
|
6
|
+
background: var(--rb-surface);
|
|
7
|
+
border: 1px solid var(--rb-border);
|
|
8
|
+
border-top-color: var(--rb-border-strong);
|
|
9
|
+
border-radius: var(--rb-radius-lg);
|
|
10
|
+
color: var(--rb-text);
|
|
11
|
+
font-family: var(--rb-font-mono);
|
|
12
|
+
box-shadow: 0 0 40px var(--rb-accent-glow);
|
|
13
|
+
}
|
|
14
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog::backdrop {
|
|
15
|
+
background: rgba(10, 12, 16, 0.6);
|
|
16
|
+
backdrop-filter: blur(var(--rb-blur));
|
|
17
|
+
}
|
|
18
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog__title {
|
|
19
|
+
margin: 0 0 var(--rb-space-3);
|
|
20
|
+
color: var(--rb-accent);
|
|
21
|
+
font-family: var(--rb-font-display);
|
|
22
|
+
font-size: 1.25rem;
|
|
23
|
+
font-weight: var(--rb-font-weight-medium);
|
|
24
|
+
letter-spacing: var(--rb-heading-tracking);
|
|
25
|
+
}
|
|
26
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-dialog__actions {
|
|
27
|
+
display: flex;
|
|
28
|
+
justify-content: flex-end;
|
|
29
|
+
gap: var(--rb-space-2);
|
|
30
|
+
margin-top: var(--rb-space-4);
|
|
31
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/* luminous-precision — form controls: input, textarea, select, checkbox,
|
|
2
|
+
* radio, switch. Focus drops the resting border for an electric-teal line
|
|
3
|
+
* with a soft outer glow. */
|
|
4
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input,
|
|
5
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-select,
|
|
6
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea {
|
|
7
|
+
display: block;
|
|
8
|
+
width: 100%;
|
|
9
|
+
padding: var(--rb-space-2) var(--rb-space-3);
|
|
10
|
+
background: rgba(26, 29, 41, 0.6);
|
|
11
|
+
border: 1px solid var(--rb-border);
|
|
12
|
+
border-radius: var(--rb-radius);
|
|
13
|
+
color: var(--rb-text);
|
|
14
|
+
font-family: var(--rb-font-mono);
|
|
15
|
+
font-weight: var(--rb-font-weight);
|
|
16
|
+
font-size: var(--rb-text-sm);
|
|
17
|
+
transition: border-color var(--rb-transition), box-shadow var(--rb-transition);
|
|
18
|
+
}
|
|
19
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-select {
|
|
20
|
+
appearance: none;
|
|
21
|
+
padding-right: 2.25rem;
|
|
22
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23958e9b' stroke-width='1.5'/%3E%3C/svg%3E");
|
|
23
|
+
background-repeat: no-repeat;
|
|
24
|
+
background-position: right 0.75rem center;
|
|
25
|
+
}
|
|
26
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input::placeholder,
|
|
27
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea::placeholder {
|
|
28
|
+
color: var(--rb-text-faint);
|
|
29
|
+
}
|
|
30
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input:focus,
|
|
31
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-select:focus,
|
|
32
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea:focus {
|
|
33
|
+
outline: none;
|
|
34
|
+
border-color: var(--rb-accent-2);
|
|
35
|
+
box-shadow: 0 0 8px var(--rb-accent-2-glow);
|
|
36
|
+
}
|
|
37
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-input[aria-invalid="true"],
|
|
38
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-textarea[aria-invalid="true"] {
|
|
39
|
+
border-color: var(--rb-danger);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-label {
|
|
43
|
+
display: block;
|
|
44
|
+
margin-bottom: var(--rb-space-1);
|
|
45
|
+
color: var(--rb-text-faint);
|
|
46
|
+
text-transform: uppercase;
|
|
47
|
+
font-size: 12px;
|
|
48
|
+
font-weight: var(--rb-font-weight-medium);
|
|
49
|
+
letter-spacing: var(--rb-label-tracking);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-field {
|
|
53
|
+
margin-bottom: var(--rb-space-3);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* checkbox & radio */
|
|
57
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-checkbox,
|
|
58
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio {
|
|
59
|
+
appearance: none;
|
|
60
|
+
width: 1.1rem;
|
|
61
|
+
height: 1.1rem;
|
|
62
|
+
margin: 0;
|
|
63
|
+
vertical-align: text-bottom;
|
|
64
|
+
background: var(--rb-surface);
|
|
65
|
+
border: 1px solid var(--rb-border-strong);
|
|
66
|
+
border-radius: 0.25rem;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
transition: border-color var(--rb-transition), box-shadow var(--rb-transition);
|
|
69
|
+
}
|
|
70
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio {
|
|
71
|
+
border-radius: 50%;
|
|
72
|
+
}
|
|
73
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-checkbox:checked,
|
|
74
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio:checked {
|
|
75
|
+
border-color: var(--rb-accent-2);
|
|
76
|
+
box-shadow: inset 0 0 0 3px var(--rb-surface), inset 0 0 0 1rem var(--rb-accent-2),
|
|
77
|
+
0 0 6px var(--rb-accent-2-glow);
|
|
78
|
+
}
|
|
79
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-checkbox:focus-visible,
|
|
80
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-radio:focus-visible,
|
|
81
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch:focus-visible {
|
|
82
|
+
outline: none;
|
|
83
|
+
border-color: var(--rb-accent-border);
|
|
84
|
+
}
|
|
85
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-choice {
|
|
86
|
+
display: inline-flex;
|
|
87
|
+
align-items: center;
|
|
88
|
+
gap: var(--rb-space-2);
|
|
89
|
+
color: var(--rb-text);
|
|
90
|
+
font-size: var(--rb-text-sm);
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* switch */
|
|
95
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch {
|
|
96
|
+
appearance: none;
|
|
97
|
+
width: 2.4rem;
|
|
98
|
+
height: 1.3rem;
|
|
99
|
+
margin: 0;
|
|
100
|
+
vertical-align: text-bottom;
|
|
101
|
+
background: var(--rb-surface);
|
|
102
|
+
border: 1px solid var(--rb-border-strong);
|
|
103
|
+
border-radius: 1rem;
|
|
104
|
+
cursor: pointer;
|
|
105
|
+
position: relative;
|
|
106
|
+
transition: border-color var(--rb-transition);
|
|
107
|
+
}
|
|
108
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch::after {
|
|
109
|
+
content: "";
|
|
110
|
+
position: absolute;
|
|
111
|
+
top: 2px;
|
|
112
|
+
left: 2px;
|
|
113
|
+
width: calc(1.3rem - 6px);
|
|
114
|
+
height: calc(1.3rem - 6px);
|
|
115
|
+
border-radius: 50%;
|
|
116
|
+
background: var(--rb-text-faint);
|
|
117
|
+
transition: transform var(--rb-transition), background var(--rb-transition);
|
|
118
|
+
}
|
|
119
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch:checked {
|
|
120
|
+
border-color: var(--rb-accent-2);
|
|
121
|
+
}
|
|
122
|
+
:where([data-rb-style="luminous-precision"], [data-rb-style="luminous-precision"] *).rb-switch:checked::after {
|
|
123
|
+
transform: translateX(1.1rem);
|
|
124
|
+
background: var(--rb-accent-2);
|
|
125
|
+
box-shadow: 0 0 6px var(--rb-accent-2-glow);
|
|
126
|
+
}
|