@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,39 @@
|
|
|
1
|
+
/* rackbops-noir — badge
|
|
2
|
+
* A bordered mono pill, like the studio's capability tags. Default is an
|
|
3
|
+
* outline chip; semantic modifiers tint to their hue. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-badge {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: var(--rb-space-1);
|
|
8
|
+
padding: 4px 10px;
|
|
9
|
+
border: 1px solid var(--rb-border);
|
|
10
|
+
border-radius: var(--rb-radius-pill);
|
|
11
|
+
font-family: var(--rb-font-mono);
|
|
12
|
+
font-size: 11.5px;
|
|
13
|
+
letter-spacing: 0.02em;
|
|
14
|
+
color: var(--rb-text-soft);
|
|
15
|
+
background: var(--rb-surface);
|
|
16
|
+
}
|
|
17
|
+
/* Semantic variants: a tint fill + tinted border carry the hue, while the label
|
|
18
|
+
* uses --rb-text so it clears WCAG AA against the tint (raw semantic colours as
|
|
19
|
+
* small text fall short of AA). */
|
|
20
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-badge--info {
|
|
21
|
+
background: color-mix(in srgb, var(--rb-info) 14%, var(--rb-surface));
|
|
22
|
+
border-color: color-mix(in srgb, var(--rb-info) 45%, var(--rb-border));
|
|
23
|
+
color: var(--rb-text);
|
|
24
|
+
}
|
|
25
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-badge--success {
|
|
26
|
+
background: color-mix(in srgb, var(--rb-success) 14%, var(--rb-surface));
|
|
27
|
+
border-color: color-mix(in srgb, var(--rb-success) 45%, var(--rb-border));
|
|
28
|
+
color: var(--rb-text);
|
|
29
|
+
}
|
|
30
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-badge--warning {
|
|
31
|
+
background: color-mix(in srgb, var(--rb-warning) 16%, var(--rb-surface));
|
|
32
|
+
border-color: color-mix(in srgb, var(--rb-warning) 45%, var(--rb-border));
|
|
33
|
+
color: var(--rb-text);
|
|
34
|
+
}
|
|
35
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-badge--danger {
|
|
36
|
+
background: color-mix(in srgb, var(--rb-danger) 14%, var(--rb-surface));
|
|
37
|
+
border-color: color-mix(in srgb, var(--rb-danger) 45%, var(--rb-border));
|
|
38
|
+
color: var(--rb-text);
|
|
39
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/* rackbops-noir — button
|
|
2
|
+
* Primary is a light high-contrast fill that warms to vermillion on hover; ghost
|
|
3
|
+
* is a bordered outline. A press dips the button; an optional arrow slides on hover. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: var(--rb-space-2);
|
|
8
|
+
padding: 13px 22px;
|
|
9
|
+
border: 1px solid transparent;
|
|
10
|
+
border-radius: var(--rb-radius);
|
|
11
|
+
font-weight: var(--rb-font-weight-medium);
|
|
12
|
+
font-size: 16px;
|
|
13
|
+
text-decoration: none;
|
|
14
|
+
cursor: pointer;
|
|
15
|
+
color: var(--rb-text);
|
|
16
|
+
background: transparent;
|
|
17
|
+
transition:
|
|
18
|
+
transform 0.12s ease,
|
|
19
|
+
background var(--rb-transition) ease,
|
|
20
|
+
border-color var(--rb-transition) ease,
|
|
21
|
+
color var(--rb-transition) ease;
|
|
22
|
+
}
|
|
23
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn:active {
|
|
24
|
+
transform: translateY(1px);
|
|
25
|
+
}
|
|
26
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--primary {
|
|
27
|
+
background: var(--rb-text); /* light in this theme — a bright neutral fill */
|
|
28
|
+
color: var(--rb-bg); /* dark ink on the light fill */
|
|
29
|
+
}
|
|
30
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--primary:hover,
|
|
31
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--primary:focus-visible {
|
|
32
|
+
background: var(--rb-accent);
|
|
33
|
+
color: var(--rb-accent-fg);
|
|
34
|
+
}
|
|
35
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--accent {
|
|
36
|
+
background: var(--rb-accent);
|
|
37
|
+
color: var(--rb-accent-fg);
|
|
38
|
+
}
|
|
39
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--accent:hover,
|
|
40
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--accent:focus-visible {
|
|
41
|
+
/* mix toward the text colour: lightens in a dark theme, darkens in a light one */
|
|
42
|
+
background: color-mix(in srgb, var(--rb-accent), var(--rb-text) 15%);
|
|
43
|
+
}
|
|
44
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--ghost {
|
|
45
|
+
background: transparent;
|
|
46
|
+
color: var(--rb-text);
|
|
47
|
+
border-color: var(--rb-border-strong);
|
|
48
|
+
}
|
|
49
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--ghost:hover,
|
|
50
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--ghost:focus-visible {
|
|
51
|
+
border-color: var(--rb-text);
|
|
52
|
+
background: var(--rb-surface-2);
|
|
53
|
+
}
|
|
54
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--danger {
|
|
55
|
+
background: transparent;
|
|
56
|
+
color: var(--rb-danger);
|
|
57
|
+
border-color: color-mix(in srgb, var(--rb-danger) 45%, var(--rb-border));
|
|
58
|
+
}
|
|
59
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--danger:hover,
|
|
60
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn--danger:focus-visible {
|
|
61
|
+
border-color: var(--rb-danger);
|
|
62
|
+
}
|
|
63
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn:disabled {
|
|
64
|
+
opacity: 0.5;
|
|
65
|
+
cursor: not-allowed;
|
|
66
|
+
}
|
|
67
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn__arrow {
|
|
68
|
+
transition: transform var(--rb-transition) ease;
|
|
69
|
+
}
|
|
70
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn:hover .rb-btn__arrow {
|
|
71
|
+
transform: translateX(3px);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@media (prefers-reduced-motion: reduce) {
|
|
75
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn,
|
|
76
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-btn__arrow {
|
|
77
|
+
transition: none;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* rackbops-noir — card
|
|
2
|
+
* A surface panel with a soft resting shadow; hovers lift and deepen — the studio's
|
|
3
|
+
* service-card motion. A mono kicker tag can sit at the top. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-card {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
background: var(--rb-surface);
|
|
8
|
+
border: 1px solid var(--rb-border);
|
|
9
|
+
border-radius: var(--rb-radius-lg);
|
|
10
|
+
padding: 26px 24px 28px;
|
|
11
|
+
box-shadow: var(--rb-shadow-sm);
|
|
12
|
+
transition:
|
|
13
|
+
transform 0.16s ease,
|
|
14
|
+
border-color 0.16s ease,
|
|
15
|
+
box-shadow 0.16s ease;
|
|
16
|
+
}
|
|
17
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-card:hover {
|
|
18
|
+
transform: translateY(-4px);
|
|
19
|
+
border-color: var(--rb-border-strong);
|
|
20
|
+
box-shadow: var(--rb-shadow-lg);
|
|
21
|
+
}
|
|
22
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-card__tag {
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: space-between;
|
|
26
|
+
font-family: var(--rb-font-mono);
|
|
27
|
+
font-size: 12px;
|
|
28
|
+
letter-spacing: 0.12em;
|
|
29
|
+
text-transform: uppercase;
|
|
30
|
+
color: var(--rb-accent);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@media (prefers-reduced-motion: reduce) {
|
|
34
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-card {
|
|
35
|
+
transition: none;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/* rackbops-noir — dialog
|
|
2
|
+
* Native <dialog>: a surface pane with the studio's deep lift shadow over a
|
|
3
|
+
* softly dimmed, blurred backdrop; a heavy editorial title. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-dialog {
|
|
5
|
+
padding: 0;
|
|
6
|
+
border: 1px solid var(--rb-border);
|
|
7
|
+
border-radius: var(--rb-radius-lg);
|
|
8
|
+
background: var(--rb-surface);
|
|
9
|
+
color: var(--rb-text);
|
|
10
|
+
box-shadow: var(--rb-shadow-lg);
|
|
11
|
+
max-width: min(92vw, 34rem);
|
|
12
|
+
}
|
|
13
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-dialog::backdrop {
|
|
14
|
+
background: rgba(19, 30, 41, 0.4);
|
|
15
|
+
backdrop-filter: blur(var(--rb-blur));
|
|
16
|
+
}
|
|
17
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-dialog__body {
|
|
18
|
+
padding: var(--rb-space-5);
|
|
19
|
+
}
|
|
20
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-dialog__title {
|
|
21
|
+
margin: 0 0 var(--rb-space-3);
|
|
22
|
+
font-family: var(--rb-font-display);
|
|
23
|
+
font-weight: var(--rb-font-weight-bold);
|
|
24
|
+
letter-spacing: var(--rb-heading-tracking);
|
|
25
|
+
font-size: 1.4rem;
|
|
26
|
+
}
|
|
27
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* rackbops-noir — eyebrow (section kicker)
|
|
2
|
+
* The studio's signature label: a mono, uppercase, wide-tracked accent tag with
|
|
3
|
+
* a short leading rule. Sits above every section headline. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-eyebrow {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: 10px;
|
|
8
|
+
font-family: var(--rb-font-mono);
|
|
9
|
+
font-size: 12.5px;
|
|
10
|
+
font-weight: var(--rb-font-weight-medium);
|
|
11
|
+
letter-spacing: var(--rb-label-tracking);
|
|
12
|
+
text-transform: uppercase;
|
|
13
|
+
color: var(--rb-accent);
|
|
14
|
+
}
|
|
15
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-eyebrow::before {
|
|
16
|
+
content: "";
|
|
17
|
+
width: 22px;
|
|
18
|
+
height: 1.5px;
|
|
19
|
+
background: var(--rb-accent);
|
|
20
|
+
display: inline-block;
|
|
21
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* rackbops-noir — form controls
|
|
2
|
+
* Fields on the surface; focus is a vermillion border + soft wash.
|
|
3
|
+
* Comfortable, roomy sizing to match the editorial body. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-field {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
gap: var(--rb-space-1);
|
|
8
|
+
}
|
|
9
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-label {
|
|
10
|
+
font-size: var(--rb-text-sm);
|
|
11
|
+
font-weight: var(--rb-font-weight-medium);
|
|
12
|
+
color: var(--rb-text-soft);
|
|
13
|
+
}
|
|
14
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-input,
|
|
15
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-textarea,
|
|
16
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-select {
|
|
17
|
+
width: 100%;
|
|
18
|
+
padding: 12px 14px;
|
|
19
|
+
background: var(--rb-surface);
|
|
20
|
+
border: 1px solid var(--rb-border-strong);
|
|
21
|
+
border-radius: var(--rb-radius);
|
|
22
|
+
color: var(--rb-text);
|
|
23
|
+
font-family: var(--rb-font-body);
|
|
24
|
+
font-size: 16px;
|
|
25
|
+
transition:
|
|
26
|
+
border-color var(--rb-transition),
|
|
27
|
+
box-shadow var(--rb-transition);
|
|
28
|
+
}
|
|
29
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-textarea {
|
|
30
|
+
min-height: 6rem;
|
|
31
|
+
resize: vertical;
|
|
32
|
+
}
|
|
33
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-input:focus-visible,
|
|
34
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-textarea:focus-visible,
|
|
35
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-select:focus-visible {
|
|
36
|
+
outline: none;
|
|
37
|
+
border-color: var(--rb-accent);
|
|
38
|
+
box-shadow: 0 0 0 3px var(--rb-accent-wash);
|
|
39
|
+
}
|
|
40
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-input::placeholder,
|
|
41
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-textarea::placeholder {
|
|
42
|
+
color: var(--rb-text-faint);
|
|
43
|
+
}
|
|
44
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-choice {
|
|
45
|
+
display: inline-flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
gap: var(--rb-space-1);
|
|
48
|
+
font-size: 16px;
|
|
49
|
+
color: var(--rb-text);
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
}
|
|
52
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-checkbox,
|
|
53
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-radio,
|
|
54
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-switch {
|
|
55
|
+
accent-color: var(--rb-accent);
|
|
56
|
+
width: 1.1rem;
|
|
57
|
+
height: 1.1rem;
|
|
58
|
+
cursor: pointer;
|
|
59
|
+
}
|
|
60
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-switch {
|
|
61
|
+
width: 2.2rem;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@media (prefers-reduced-motion: reduce) {
|
|
65
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-input,
|
|
66
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-textarea,
|
|
67
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-select {
|
|
68
|
+
transition: none;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* rackbops-noir — nav link
|
|
2
|
+
* The header's quiet mono nav: soft ink that fills to a surface pill on hover;
|
|
3
|
+
* accent on the active route. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-link {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: var(--rb-space-1);
|
|
8
|
+
padding: 8px 12px;
|
|
9
|
+
border-radius: 8px;
|
|
10
|
+
font-family: var(--rb-font-mono);
|
|
11
|
+
font-size: var(--rb-text-sm);
|
|
12
|
+
color: var(--rb-text-soft);
|
|
13
|
+
text-decoration: none;
|
|
14
|
+
cursor: pointer;
|
|
15
|
+
transition:
|
|
16
|
+
color var(--rb-transition),
|
|
17
|
+
background var(--rb-transition);
|
|
18
|
+
}
|
|
19
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-link:hover {
|
|
20
|
+
color: var(--rb-text);
|
|
21
|
+
background: var(--rb-surface-2);
|
|
22
|
+
}
|
|
23
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-link.rb-link--active {
|
|
24
|
+
color: var(--rb-accent);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@media (prefers-reduced-motion: reduce) {
|
|
28
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-link {
|
|
29
|
+
transition: none;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* rackbops-noir — principle (theme extra)
|
|
2
|
+
* The studio's numbered "how we work" list: a mono /0N marker in the accent
|
|
3
|
+
* beside a heading + paragraph, rows divided by hairlines. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principles {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
}
|
|
8
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principle {
|
|
9
|
+
display: grid;
|
|
10
|
+
grid-template-columns: 56px 1fr;
|
|
11
|
+
gap: 18px;
|
|
12
|
+
padding: 22px 0;
|
|
13
|
+
border-top: 1px solid var(--rb-border);
|
|
14
|
+
}
|
|
15
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principles > .rb-principle:first-child {
|
|
16
|
+
border-top: 0;
|
|
17
|
+
}
|
|
18
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principle__n {
|
|
19
|
+
font-family: var(--rb-font-mono);
|
|
20
|
+
font-size: 13px;
|
|
21
|
+
font-weight: var(--rb-font-weight-medium);
|
|
22
|
+
color: var(--rb-accent);
|
|
23
|
+
padding-top: 3px;
|
|
24
|
+
}
|
|
25
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principle__body h3 {
|
|
26
|
+
font-size: 1.16rem;
|
|
27
|
+
}
|
|
28
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-principle__body p {
|
|
29
|
+
margin: 7px 0 0;
|
|
30
|
+
color: var(--rb-text-soft);
|
|
31
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* rackbops-noir — progress + spinner
|
|
2
|
+
* A pill trough with a vermillion fill; the spinner is a single accent arc. */
|
|
3
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-progress {
|
|
4
|
+
appearance: none;
|
|
5
|
+
width: 100%;
|
|
6
|
+
height: 8px;
|
|
7
|
+
border: 0;
|
|
8
|
+
border-radius: var(--rb-radius-pill);
|
|
9
|
+
overflow: hidden;
|
|
10
|
+
background: var(--rb-surface-sunken);
|
|
11
|
+
}
|
|
12
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-progress::-webkit-progress-bar {
|
|
13
|
+
background: var(--rb-surface-sunken);
|
|
14
|
+
}
|
|
15
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-progress::-webkit-progress-value {
|
|
16
|
+
background: var(--rb-accent);
|
|
17
|
+
}
|
|
18
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-progress::-moz-progress-bar {
|
|
19
|
+
background: var(--rb-accent);
|
|
20
|
+
}
|
|
21
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-spinner {
|
|
22
|
+
display: inline-block;
|
|
23
|
+
width: 1.25rem;
|
|
24
|
+
height: 1.25rem;
|
|
25
|
+
border: 2px solid var(--rb-border-strong);
|
|
26
|
+
border-top-color: var(--rb-accent);
|
|
27
|
+
border-radius: 50%;
|
|
28
|
+
animation: rb-noir-spin 0.7s linear infinite;
|
|
29
|
+
}
|
|
30
|
+
@keyframes rb-noir-spin {
|
|
31
|
+
to {
|
|
32
|
+
transform: rotate(360deg);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@media (prefers-reduced-motion: reduce) {
|
|
37
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-spinner {
|
|
38
|
+
animation-duration: 2s;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/* rackbops-noir — rack panel (theme extra)
|
|
2
|
+
* The studio's visual pun: a dark "rack" unit with an animated vermillion
|
|
3
|
+
* equaliser (the "bops" — signal) and a pulsing live dot. The panel palette
|
|
4
|
+
* matches rackbops.com's *dark*-mode rack — a near-canvas block set off by its
|
|
5
|
+
* border (vs. the studio theme, which uses the site's light-mode rack). */
|
|
6
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack {
|
|
7
|
+
--rb-rack-panel: #0a121a;
|
|
8
|
+
--rb-rack-ink: #e7eef4;
|
|
9
|
+
--rb-rack-faint: #7d90a2;
|
|
10
|
+
--rb-rack-line: #1e2b37;
|
|
11
|
+
background: var(--rb-rack-panel);
|
|
12
|
+
border: 1px solid var(--rb-rack-line);
|
|
13
|
+
border-radius: 16px;
|
|
14
|
+
padding: 24px;
|
|
15
|
+
box-shadow: var(--rb-shadow-lg);
|
|
16
|
+
color: var(--rb-rack-ink);
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
}
|
|
19
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__top {
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
justify-content: space-between;
|
|
23
|
+
font-family: var(--rb-font-mono);
|
|
24
|
+
font-size: 11.5px;
|
|
25
|
+
letter-spacing: 0.14em;
|
|
26
|
+
text-transform: uppercase;
|
|
27
|
+
color: var(--rb-rack-faint);
|
|
28
|
+
}
|
|
29
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__live {
|
|
30
|
+
display: inline-flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
gap: 7px;
|
|
33
|
+
color: var(--rb-rack-ink);
|
|
34
|
+
}
|
|
35
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__live::before {
|
|
36
|
+
content: "";
|
|
37
|
+
width: 7px;
|
|
38
|
+
height: 7px;
|
|
39
|
+
border-radius: 50%;
|
|
40
|
+
background: var(--rb-accent);
|
|
41
|
+
animation: rb-noir-pulse 1.8s ease-in-out infinite;
|
|
42
|
+
}
|
|
43
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars {
|
|
44
|
+
display: flex;
|
|
45
|
+
align-items: flex-end;
|
|
46
|
+
gap: 7px;
|
|
47
|
+
height: 132px;
|
|
48
|
+
margin: 22px 2px 16px;
|
|
49
|
+
}
|
|
50
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i {
|
|
51
|
+
flex: 1;
|
|
52
|
+
background: var(--rb-accent-grad);
|
|
53
|
+
border-radius: 4px 4px 2px 2px;
|
|
54
|
+
transform-origin: bottom;
|
|
55
|
+
animation: rb-noir-bop 1.4s ease-in-out infinite;
|
|
56
|
+
opacity: 0.92;
|
|
57
|
+
}
|
|
58
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i:nth-child(1) { height: 52%; animation-delay: -0.2s; }
|
|
59
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i:nth-child(2) { height: 88%; animation-delay: -1.1s; }
|
|
60
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i:nth-child(3) { height: 34%; animation-delay: -0.6s; }
|
|
61
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i:nth-child(4) { height: 70%; animation-delay: -0.9s; }
|
|
62
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i:nth-child(5) { height: 100%; animation-delay: -0.35s; }
|
|
63
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i:nth-child(6) { height: 46%; animation-delay: -1.3s; }
|
|
64
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__foot {
|
|
65
|
+
display: flex;
|
|
66
|
+
justify-content: space-between;
|
|
67
|
+
gap: 12px;
|
|
68
|
+
border-top: 1px solid var(--rb-rack-line);
|
|
69
|
+
padding-top: 14px;
|
|
70
|
+
font-family: var(--rb-font-mono);
|
|
71
|
+
font-size: 11.5px;
|
|
72
|
+
color: var(--rb-rack-faint);
|
|
73
|
+
letter-spacing: 0.04em;
|
|
74
|
+
}
|
|
75
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__foot b {
|
|
76
|
+
color: var(--rb-rack-ink);
|
|
77
|
+
font-weight: var(--rb-font-weight-medium);
|
|
78
|
+
}
|
|
79
|
+
@keyframes rb-noir-bop {
|
|
80
|
+
0%, 100% { transform: scaleY(0.5); }
|
|
81
|
+
50% { transform: scaleY(1); }
|
|
82
|
+
}
|
|
83
|
+
@keyframes rb-noir-pulse {
|
|
84
|
+
0%, 100% { opacity: 1; }
|
|
85
|
+
50% { opacity: 0.35; }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@media (prefers-reduced-motion: reduce) {
|
|
89
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__bars > i,
|
|
90
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-rack__live::before {
|
|
91
|
+
animation: none;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* rackbops-noir — table
|
|
2
|
+
* A clean editorial table: a strong header rule, generous row padding, a quiet
|
|
3
|
+
* hover wash. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table {
|
|
5
|
+
width: 100%;
|
|
6
|
+
border-collapse: collapse;
|
|
7
|
+
font-size: 15px;
|
|
8
|
+
}
|
|
9
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table th {
|
|
10
|
+
text-align: left;
|
|
11
|
+
padding: var(--rb-space-2) var(--rb-space-3);
|
|
12
|
+
border-bottom: 2px solid var(--rb-border-strong);
|
|
13
|
+
color: var(--rb-text-soft); /* text-faint is below AA at header size */
|
|
14
|
+
font-family: var(--rb-font-mono);
|
|
15
|
+
font-size: 12px;
|
|
16
|
+
letter-spacing: 0.06em;
|
|
17
|
+
text-transform: uppercase;
|
|
18
|
+
font-weight: var(--rb-font-weight-medium);
|
|
19
|
+
}
|
|
20
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table td {
|
|
21
|
+
padding: var(--rb-space-2) var(--rb-space-3);
|
|
22
|
+
border-bottom: 1px solid var(--rb-border);
|
|
23
|
+
color: var(--rb-text);
|
|
24
|
+
}
|
|
25
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table tbody tr:hover td {
|
|
26
|
+
background: var(--rb-surface-2);
|
|
27
|
+
}
|
|
28
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-table .rb-num {
|
|
29
|
+
text-align: right;
|
|
30
|
+
font-variant-numeric: tabular-nums;
|
|
31
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* rackbops-noir — tabs
|
|
2
|
+
* Understated editorial tabs: soft-ink labels, the active one goes ink and
|
|
3
|
+
* grows a solid vermillion underbar. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tabs {
|
|
5
|
+
display: flex;
|
|
6
|
+
gap: var(--rb-space-4);
|
|
7
|
+
border-bottom: 1px solid var(--rb-border);
|
|
8
|
+
}
|
|
9
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tab {
|
|
10
|
+
position: relative;
|
|
11
|
+
padding: var(--rb-space-2) 0;
|
|
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: 15px;
|
|
18
|
+
cursor: pointer;
|
|
19
|
+
transition: color var(--rb-transition);
|
|
20
|
+
}
|
|
21
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tab:hover {
|
|
22
|
+
color: var(--rb-text);
|
|
23
|
+
}
|
|
24
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tab.rb-tab--active {
|
|
25
|
+
color: var(--rb-text);
|
|
26
|
+
}
|
|
27
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tab.rb-tab--active::after {
|
|
28
|
+
content: "";
|
|
29
|
+
position: absolute;
|
|
30
|
+
left: 0;
|
|
31
|
+
right: 0;
|
|
32
|
+
bottom: -1px;
|
|
33
|
+
height: 2px;
|
|
34
|
+
border-radius: 2px 2px 0 0;
|
|
35
|
+
background: var(--rb-accent);
|
|
36
|
+
}
|
|
37
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tabpanel {
|
|
38
|
+
padding: var(--rb-space-4) 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@media (prefers-reduced-motion: reduce) {
|
|
42
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tab {
|
|
43
|
+
transition: none;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* rackbops-noir — capability tag (theme extra)
|
|
2
|
+
* The small mono pill used in flex-wrap lists inside service cards — a quieter,
|
|
3
|
+
* borderless-feel counterpart to the semantic .rb-badge. */
|
|
4
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tags {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-wrap: wrap;
|
|
7
|
+
gap: 8px;
|
|
8
|
+
margin: 0;
|
|
9
|
+
padding: 0;
|
|
10
|
+
list-style: none;
|
|
11
|
+
}
|
|
12
|
+
:where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-tag {
|
|
13
|
+
font-family: var(--rb-font-mono);
|
|
14
|
+
font-size: 11.5px;
|
|
15
|
+
color: var(--rb-text-soft);
|
|
16
|
+
border: 1px solid var(--rb-border);
|
|
17
|
+
border-radius: var(--rb-radius-pill);
|
|
18
|
+
padding: 4px 10px;
|
|
19
|
+
letter-spacing: 0.02em;
|
|
20
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# rackbops-noir
|
|
2
|
+
|
|
3
|
+
The dark counterpart of **rackbops-studio** — the mode rackbops.com toggles into.
|
|
4
|
+
Same editorial studio language (heavy 800 headlines with tight tracking, the mono
|
|
5
|
+
eyebrow, vermillion as the single warm voice, the rack-equaliser motif, soft
|
|
6
|
+
two-step shadow depth) rendered on a deep slate canvas instead of paper. It ships
|
|
7
|
+
the identical `rb-*` component set as rackbops-studio — token-driven, so only the
|
|
8
|
+
palette differs, plus a dark-appropriate accent-fg and a lighter accent ramp —
|
|
9
|
+
and swaps in with a single attribute flip. Derived from rackbops.com's dark scheme.
|
|
10
|
+
|
|
11
|
+
## Color
|
|
12
|
+
|
|
13
|
+
Palette values match rackbops.com's dark scheme. On the dark ground the vermillion
|
|
14
|
+
accent clears **~5.5:1 as text**, so — unlike the light studio theme — noir's
|
|
15
|
+
accent labels are AA.
|
|
16
|
+
|
|
17
|
+
| Role | Value | Usage |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| Background | `#0d141d` (deep slate) | Page canvas |
|
|
20
|
+
| Surface | `#141f2a` | Cards, fields, raised panels |
|
|
21
|
+
| Surface 2 | `#19242f` | Hover wash, secondary sections |
|
|
22
|
+
| Surface sunken | `#0f1720` | Progress troughs, insets |
|
|
23
|
+
| Text | `#e9eff4` | Headlines and body |
|
|
24
|
+
| Text soft | `#a4b4c3` | Lead paragraphs, secondary text |
|
|
25
|
+
| Text faint | `#697a8c` | Meta, footnotes, placeholders (below AA as normal text — secondary use only; the shared table header uses `--rb-text-soft`) |
|
|
26
|
+
| Border | `#243140` | Hairline dividers |
|
|
27
|
+
| Border strong | `#31404f` | Field borders, ghost-button outline |
|
|
28
|
+
| Accent | `#ff5d3d` (vermillion) | The single warm voice: emphasis, CTAs, the equaliser (~5.5:1 as text) |
|
|
29
|
+
| Accent fg | `#0d141d` | Dark ink on the vermillion fill (keeps it AA) |
|
|
30
|
+
| Accent wash | `rgba(255,93,61,.13)` | Focus ring, faint accent tint |
|
|
31
|
+
| Info | `#4c9df0` | Informational chips (std-lib addition; brightened for the dark ground) |
|
|
32
|
+
| Success | `#43c97e` | Positive status |
|
|
33
|
+
| Warning | `#f2a93b` | Caution status |
|
|
34
|
+
| Danger | `#f0616d` | Destructive/error |
|
|
35
|
+
|
|
36
|
+
**Rules.** The canvas is deep and calm; vermillion is spent sparingly — CTAs, the
|
|
37
|
+
eyebrow rule, the live dot, the equaliser. Elevation is soft shadow (deeper on the
|
|
38
|
+
dark ground), not frosted glass — the one blurred surface is the dialog backdrop.
|
|
39
|
+
The marketing site itself uses no colour beyond the accent; `--rb-surface-sunken`
|
|
40
|
+
and the four semantic hues are std-lib additions for the shared components
|
|
41
|
+
(progress trough, badges, alerts) the marketing site lacks.
|
|
42
|
+
|
|
43
|
+
## Typography
|
|
44
|
+
|
|
45
|
+
Identical to rackbops-studio: the system sans at weight **800** for headlines
|
|
46
|
+
(tracking `-0.02em`, `text-wrap: balance`), the same sans body, and the mono voice
|
|
47
|
+
(`ui-monospace, "SF Mono", …`) for eyebrows, nav, tags, and the rack readouts. The
|
|
48
|
+
eyebrow is mono, uppercase, tracked `0.18em`, accent-coloured, with a leading rule.
|
|
49
|
+
|
|
50
|
+
## Shape & effects
|
|
51
|
+
|
|
52
|
+
- Radius `0.6875rem` (11px) for buttons/inputs; `0.9375rem` (15px) for cards;
|
|
53
|
+
pills for tags and troughs.
|
|
54
|
+
- Depth is a soft two-step shadow (`--rb-shadow-sm` resting, `--rb-shadow-lg` on
|
|
55
|
+
hover/lift), deepened for the dark ground. Cards lift `-4px` on hover.
|
|
56
|
+
- Focus is a `2.5px` vermillion outline offset `3px`; fields add an accent border
|
|
57
|
+
plus a soft wash ring.
|
|
58
|
+
- Primary buttons are a **bright neutral fill with dark ink** that warms to
|
|
59
|
+
vermillion on hover (the studio's ink-fill idiom, inverted for dark); a press
|
|
60
|
+
dips the button `1px`; an optional arrow slides on hover.
|
|
61
|
+
- The gradient (`--rb-accent-grad`) is a vertical vermillion ramp — spent on the
|
|
62
|
+
rack equaliser bars.
|
|
63
|
+
- Every animation respects `prefers-reduced-motion`.
|
|
64
|
+
|
|
65
|
+
## Components
|
|
66
|
+
|
|
67
|
+
Class prefix `rb-`; the full rackbops-studio inventory, styled identically from
|
|
68
|
+
tokens — `.rb-btn`, `.rb-card` (+ `__tag`), `.rb-link`, the form set, `.rb-badge`,
|
|
69
|
+
`.rb-alert`, `.rb-dialog`, `.rb-tabs`, `.rb-table`, `.rb-progress`/`.rb-spinner`,
|
|
70
|
+
`.rb-eyebrow` — plus the studio extras `.rb-rack` (equaliser panel; its panel palette
|
|
71
|
+
matches rackbops.com's dark-mode rack — a near-canvas block set off by its border), `.rb-principles`/
|
|
72
|
+
`.rb-principle`, and `.rb-tags`/`.rb-tag`. See rackbops-studio's `design.md` for
|
|
73
|
+
the per-component notes. The Boppy mascot asset ships with rackbops-studio
|
|
74
|
+
(`styles/rackbops-studio/assets/boppy.svg`) and is shared.
|
|
75
|
+
|
|
76
|
+
## Light counterpart
|
|
77
|
+
|
|
78
|
+
`rackbops-studio` — the canonical light look. Same `--rb-*` baseline and `rb-*`
|
|
79
|
+
classes, so switching `data-rb-style` restyles a page without touching markup.
|
|
80
|
+
|
|
81
|
+
## Scoping
|
|
82
|
+
|
|
83
|
+
Every rule is guarded by `data-rb-style="rackbops-noir"` (self or ancestor),
|
|
84
|
+
wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a page
|
|
85
|
+
or on a container for an embedded island.
|