@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,31 @@
|
|
|
1
|
+
/* rackbops-studio — table
|
|
2
|
+
* A clean editorial table: a strong header rule, generous row padding, a quiet
|
|
3
|
+
* hover wash. */
|
|
4
|
+
:where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table {
|
|
5
|
+
width: 100%;
|
|
6
|
+
border-collapse: collapse;
|
|
7
|
+
font-size: 15px;
|
|
8
|
+
}
|
|
9
|
+
:where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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 on white 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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-table tbody tr:hover td {
|
|
26
|
+
background: var(--rb-surface-2);
|
|
27
|
+
}
|
|
28
|
+
:where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-table .rb-num {
|
|
29
|
+
text-align: right;
|
|
30
|
+
font-variant-numeric: tabular-nums;
|
|
31
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* rackbops-studio — 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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-tab:hover {
|
|
22
|
+
color: var(--rb-text);
|
|
23
|
+
}
|
|
24
|
+
:where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-tab.rb-tab--active {
|
|
25
|
+
color: var(--rb-text);
|
|
26
|
+
}
|
|
27
|
+
:where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-tabpanel {
|
|
38
|
+
padding: var(--rb-space-4) 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@media (prefers-reduced-motion: reduce) {
|
|
42
|
+
:where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-tab {
|
|
43
|
+
transition: none;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* rackbops-studio — 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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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,157 @@
|
|
|
1
|
+
# rackbops-studio
|
|
2
|
+
|
|
3
|
+
The design language of **rackbops.com** — the studio's own editorial brand.
|
|
4
|
+
A light, paper-cool canvas; heavy, balanced headlines with tight tracking; a
|
|
5
|
+
single warm voice — vermillion — over deep navy ink. The texture is print-like,
|
|
6
|
+
not console-like: elevation is soft two-step shadows rather than frosted panels,
|
|
7
|
+
roomy spacing, and a mono "eyebrow" that kickers every section. Two motifs carry the identity: the
|
|
8
|
+
**rack panel** — a dark equaliser unit that puns on "the rack" (infrastructure)
|
|
9
|
+
and "the bops" (signal) — and **Boppy**, the mascot. This theme ships the
|
|
10
|
+
canonical **light** look; the dark mode rackbops.com toggles into is tabled at
|
|
11
|
+
the end. Derived from rackbops/site/index.html.
|
|
12
|
+
|
|
13
|
+
## Color
|
|
14
|
+
|
|
15
|
+
Values are the light (primary) scheme; the dark counterpart is tabled at the end.
|
|
16
|
+
Every value matches rackbops.com's token block, except `Surface sunken` and the
|
|
17
|
+
four semantic hues (Info/Success/Warning/Danger), which are std-lib additions for
|
|
18
|
+
the shared components (progress trough, badges, alerts) the marketing site lacks.
|
|
19
|
+
|
|
20
|
+
| Role | Value | Usage |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Background | `#eaeef1` (cool paper) | Page canvas |
|
|
23
|
+
| Surface | `#ffffff` | Cards, fields, raised panels |
|
|
24
|
+
| Surface 2 | `#f3f6f8` | Hover wash, secondary sections |
|
|
25
|
+
| Surface sunken | `#e4e9ed` | Progress troughs, insets |
|
|
26
|
+
| Text | `#131e29` (navy ink) | Headlines and body |
|
|
27
|
+
| Text soft | `#4c5b6b` | Lead paragraphs, secondary text |
|
|
28
|
+
| Text faint | `#8091a1` | Meta, footnotes, table headers |
|
|
29
|
+
| Border | `#d8e0e6` | Hairline dividers |
|
|
30
|
+
| Border strong | `#c3ced7` | Field borders, ghost-button outline |
|
|
31
|
+
| Accent | `#ef4d28` (vermillion) | The single warm voice: emphasis, CTAs, the equaliser |
|
|
32
|
+
| Accent fg | `#ffffff` | Text on the vermillion fill |
|
|
33
|
+
| Accent wash | `rgba(239,77,40,.09)` | Focus ring, faint accent tint |
|
|
34
|
+
| Info | `#1e6fd0` | Informational chips (std-lib addition; see the Accessibility note) |
|
|
35
|
+
| Success | `#1f9d57` | Positive status |
|
|
36
|
+
| Warning | `#c07d12` | Caution status |
|
|
37
|
+
| Danger | `#d64550` | Destructive/error (distinct rose vs. the vermillion accent) |
|
|
38
|
+
|
|
39
|
+
**Rules.** The canvas is calm and cool; vermillion is spent sparingly — CTAs,
|
|
40
|
+
the eyebrow rule, the live dot, the equaliser. Elevation is soft shadow on white,
|
|
41
|
+
not frosted glass — the one blurred surface is the dialog backdrop (the source
|
|
42
|
+
site also blurs its sticky header, which this library does not ship as a
|
|
43
|
+
component). The marketing site itself uses no colour beyond the accent.
|
|
44
|
+
|
|
45
|
+
## Typography
|
|
46
|
+
|
|
47
|
+
- **Headlines:** the system sans at weight **800** with tight tracking
|
|
48
|
+
(`-0.02em`), `text-wrap: balance`, tight line-height (1.08). Heavy and
|
|
49
|
+
editorial — the studio signature.
|
|
50
|
+
- **Body:** the same system sans, 17px / 1.6, weight 400.
|
|
51
|
+
- **Mono voice:** `ui-monospace, "SF Mono", …` for eyebrows, nav, meta, tags, and
|
|
52
|
+
the rack readouts.
|
|
53
|
+
- **Eyebrow:** mono, uppercase, wide-tracked (`0.18em`), accent-coloured, with a
|
|
54
|
+
short leading rule — the kicker above every section headline.
|
|
55
|
+
|
|
56
|
+
## Shape & effects
|
|
57
|
+
|
|
58
|
+
- Radius `0.6875rem` (11px) for buttons and inputs; `0.9375rem` (15px) for cards;
|
|
59
|
+
16–20px for the large feature panels; pills for tags and troughs.
|
|
60
|
+
- Depth is a soft two-step shadow (`--rb-shadow-sm` resting, `--rb-shadow-lg` on
|
|
61
|
+
hover/lift). Cards lift `-4px` on hover.
|
|
62
|
+
- Focus is a `2.5px` vermillion outline offset `3px`; fields add an accent border
|
|
63
|
+
plus a soft wash ring.
|
|
64
|
+
- Overlay surfaces (the dialog) use a blurred backdrop (`--rb-blur`); the source
|
|
65
|
+
site also blurs its sticky header, which this library does not ship.
|
|
66
|
+
- Primary buttons are an **ink fill that warms to vermillion** on hover; a press
|
|
67
|
+
dips the button `1px`; an optional arrow slides right on hover.
|
|
68
|
+
- The gradient (`--rb-accent-grad`) is a vertical vermillion ramp — spent on the
|
|
69
|
+
rack equaliser bars.
|
|
70
|
+
- Every animation (equaliser, live-dot pulse, hovers) respects
|
|
71
|
+
`prefers-reduced-motion`.
|
|
72
|
+
|
|
73
|
+
## Accessibility
|
|
74
|
+
|
|
75
|
+
This theme faithfully reproduces rackbops.com's editorial palette, and that
|
|
76
|
+
palette makes deliberate below-AA choices for decorative text. Documented so
|
|
77
|
+
consumers can compensate rather than discover it:
|
|
78
|
+
|
|
79
|
+
- **Vermillion as text is ~3.6:1 on white** (below the 4.5:1 AA bar for normal
|
|
80
|
+
text). The source uses it exactly this way for the eyebrow kicker, the card
|
|
81
|
+
kicker tag, the `/0N` principle markers, and the active nav link — all
|
|
82
|
+
reproduced here. Treat accent-coloured text as decorative; never set body copy
|
|
83
|
+
or the sole label of an interactive control in `--rb-accent`.
|
|
84
|
+
- **`--rb-text-faint` (#8091a1) is below AA on white** — use it only for
|
|
85
|
+
genuinely secondary meta (as the source does for footnotes), never for
|
|
86
|
+
essential text. The shared `.rb-table` header therefore uses `--rb-text-soft`,
|
|
87
|
+
which passes.
|
|
88
|
+
- **White on the vermillion fill is ~3.6:1** — the `.rb-btn--accent` fill and the
|
|
89
|
+
`.rb-btn--primary` hover state. Fine for large/bold button text; for small
|
|
90
|
+
labels prefer the default primary (ink fill, ~15:1).
|
|
91
|
+
- **The semantic badge stays AA** by rendering a tint fill + ink text rather than
|
|
92
|
+
coloured text on white.
|
|
93
|
+
- The dark **arcane-obsidian** theme is much stronger on contrast (text ramp
|
|
94
|
+
5.4–8.8:1, semantic chips 4.5–6.5:1; only a few accent-on-tint states — the
|
|
95
|
+
default chip, the active link/tab — sit near ~4.3:1). Reach for it where
|
|
96
|
+
full-contrast UI matters.
|
|
97
|
+
|
|
98
|
+
## Components
|
|
99
|
+
|
|
100
|
+
Class prefix `rb-`; shared token/class contract with the other themes.
|
|
101
|
+
|
|
102
|
+
- **Button** `.rb-btn` — `--primary` ink-fill→vermillion, `--accent` solid
|
|
103
|
+
vermillion, `--ghost` bordered outline, `--danger` rose outline; `.rb-btn__arrow`
|
|
104
|
+
slides on hover.
|
|
105
|
+
- **Card** `.rb-card` (+ `__tag`) — white panel, soft shadow, `-4px` hover lift.
|
|
106
|
+
- **NavLink** `.rb-link` — mono header nav; hover fills to a surface pill; accent
|
|
107
|
+
on the active route.
|
|
108
|
+
- **Form** `.rb-input` / `.rb-textarea` / `.rb-select` / `.rb-label` / `.rb-field`
|
|
109
|
+
/ `.rb-choice` / `.rb-checkbox` / `.rb-radio` / `.rb-switch` — white fields;
|
|
110
|
+
focus is a vermillion border + wash ring.
|
|
111
|
+
- **Badge** `.rb-badge` — bordered mono pill; semantic modifiers tint the border
|
|
112
|
+
and text.
|
|
113
|
+
- **Alert** `.rb-alert` — white surface card, soft shadow, 4px semantic left bar.
|
|
114
|
+
- **Dialog** `.rb-dialog` — native `<dialog>`, white pane, deep lift shadow,
|
|
115
|
+
blurred navy backdrop, heavy title.
|
|
116
|
+
- **Tabs** `.rb-tabs` / `.rb-tab` / `.rb-tabpanel` — understated; active goes ink
|
|
117
|
+
with a vermillion underbar.
|
|
118
|
+
- **Table** `.rb-table` (+ `.rb-num`) — mono uppercase header rule, generous rows,
|
|
119
|
+
quiet hover wash.
|
|
120
|
+
- **Progress / Spinner** `.rb-progress` / `.rb-spinner` — pill trough with a
|
|
121
|
+
vermillion fill; single-arc spinner.
|
|
122
|
+
- **Eyebrow** `.rb-eyebrow` — the mono kicker with leading rule.
|
|
123
|
+
|
|
124
|
+
### Theme extras
|
|
125
|
+
|
|
126
|
+
- **Rack** `.rb-rack` (+ `__top` / `__live` / `__bars` / `__foot`) — the dark navy
|
|
127
|
+
equaliser panel; a pulsing live dot and animated vermillion bars. Its inverted
|
|
128
|
+
panel palette is fixed dark regardless of the light canvas.
|
|
129
|
+
- **Principles** `.rb-principles` / `.rb-principle` (+ `__n` / `__body`) — the
|
|
130
|
+
numbered `/0N` "how we work" list.
|
|
131
|
+
- **Tags** `.rb-tags` / `.rb-tag` — mono capability pills in a flex-wrap row.
|
|
132
|
+
- **Boppy** — the mascot ships as `assets/boppy.svg` (navy body, round eyes, a
|
|
133
|
+
vermillion equaliser smile).
|
|
134
|
+
|
|
135
|
+
## Dark counterpart
|
|
136
|
+
|
|
137
|
+
The dark mode rackbops.com toggles into. Not shipped as a separate theme yet;
|
|
138
|
+
documented so it can become one additively.
|
|
139
|
+
|
|
140
|
+
| Role | Value |
|
|
141
|
+
| --- | --- |
|
|
142
|
+
| Background | `#0d141d` |
|
|
143
|
+
| Surface | `#141f2a` |
|
|
144
|
+
| Surface 2 | `#19242f` |
|
|
145
|
+
| Text | `#e9eff4` |
|
|
146
|
+
| Text soft | `#a4b4c3` |
|
|
147
|
+
| Text faint | `#697a8c` |
|
|
148
|
+
| Border | `#243140` |
|
|
149
|
+
| Border strong | `#31404f` |
|
|
150
|
+
| Accent | `#ff5d3d` |
|
|
151
|
+
| Accent soft | `#ff7a5f` |
|
|
152
|
+
|
|
153
|
+
## Scoping
|
|
154
|
+
|
|
155
|
+
Every rule is guarded by `data-rb-style="rackbops-studio"` (self or ancestor),
|
|
156
|
+
wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a page
|
|
157
|
+
or on a container for an embedded island.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* rackbops-studio — 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/rack.css";
|
|
16
|
+
@import "./components/principle.css";
|
|
17
|
+
@import "./components/tag.css";
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* rackbops-studio — design tokens
|
|
2
|
+
* Reverse-documented from rackbops.com (rackbops/site/index.html). Consume via:
|
|
3
|
+
* @import "@rackbops/styles/rackbops-studio/tokens";
|
|
4
|
+
* or pull the whole theme with ./index.css.
|
|
5
|
+
*
|
|
6
|
+
* Nothing applies until an element carries data-rb-style="rackbops-studio"
|
|
7
|
+
* — set it on <html> for a page, or on any container for an embedded island.
|
|
8
|
+
* The :where() keeps specificity at zero, so any consumer rule overrides.
|
|
9
|
+
*
|
|
10
|
+
* This theme ships its canonical, primary look (light); the dark counterpart
|
|
11
|
+
* that rackbops.com toggles into is documented in design.md and can become its
|
|
12
|
+
* own theme later. Every theme declares the same baseline token set (styles/test
|
|
13
|
+
* enforces parity); names marked (extra) are additions this theme's own
|
|
14
|
+
* component CSS may rely on.
|
|
15
|
+
*/
|
|
16
|
+
:where([data-rb-style="rackbops-studio"]) {
|
|
17
|
+
color-scheme: light;
|
|
18
|
+
|
|
19
|
+
/* color — cool paper canvas, white raised surfaces, navy ink */
|
|
20
|
+
--rb-bg: #eaeef1;
|
|
21
|
+
--rb-surface: #ffffff;
|
|
22
|
+
--rb-surface-2: #f3f6f8;
|
|
23
|
+
--rb-surface-sunken: #e4e9ed;
|
|
24
|
+
--rb-text: #131e29; /* navy ink */
|
|
25
|
+
--rb-text-soft: #4c5b6b;
|
|
26
|
+
--rb-text-faint: #8091a1;
|
|
27
|
+
--rb-border: #d8e0e6;
|
|
28
|
+
--rb-border-strong: #c3ced7;
|
|
29
|
+
|
|
30
|
+
/* accent — vermillion, the studio's single warm voice */
|
|
31
|
+
--rb-accent: #ef4d28;
|
|
32
|
+
--rb-accent-fg: #ffffff; /* white text on the vermillion fill */
|
|
33
|
+
--rb-accent-wash: rgba(239, 77, 40, 0.09);
|
|
34
|
+
|
|
35
|
+
/* the signature gradient — a vertical vermillion ramp (the rack equaliser) */
|
|
36
|
+
--rb-accent-grad: linear-gradient(180deg, #ef4d28, #c93c1c);
|
|
37
|
+
|
|
38
|
+
/* semantic — the marketing site is accent-only; these serve the shared
|
|
39
|
+
badge/alert/status components. As a thin border (alert) they clear the 3:1
|
|
40
|
+
graphical bar; the studio badge renders them as a tint + ink text so its
|
|
41
|
+
label stays AA. Used directly as small text on white they are below 4.5:1
|
|
42
|
+
— see design.md's Accessibility note. */
|
|
43
|
+
--rb-info: #1e6fd0;
|
|
44
|
+
--rb-success: #1f9d57;
|
|
45
|
+
--rb-warning: #c07d12;
|
|
46
|
+
--rb-danger: #d64550;
|
|
47
|
+
|
|
48
|
+
/* typography — bold editorial sans headlines over a system-ui body; mono for
|
|
49
|
+
eyebrows, nav, tags, and meta */
|
|
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, "SF Mono", "Cascadia Code", "JetBrains Mono", Menlo, Consolas, monospace;
|
|
53
|
+
--rb-font-weight: 400;
|
|
54
|
+
--rb-font-weight-medium: 600;
|
|
55
|
+
--rb-font-weight-bold: 800; /* headlines are heavy — the studio signature */
|
|
56
|
+
--rb-heading-tracking: -0.02em;
|
|
57
|
+
--rb-label-tracking: 0.18em; /* the mono eyebrow's wide tracking */
|
|
58
|
+
--rb-text-sm: 13.5px;
|
|
59
|
+
|
|
60
|
+
/* shape & effects — soft two-step shadow depth, roomy editorial radii */
|
|
61
|
+
--rb-radius: 0.6875rem; /* 11px — buttons, inputs */
|
|
62
|
+
--rb-radius-lg: 0.9375rem; /* 15px — cards */
|
|
63
|
+
--rb-radius-pill: 99px;
|
|
64
|
+
--rb-shadow-sm: 0 1px 2px rgba(19, 30, 41, 0.06);
|
|
65
|
+
--rb-shadow-lg: 0 2px 6px rgba(19, 30, 41, 0.05), 0 22px 48px -24px rgba(19, 30, 41, 0.28);
|
|
66
|
+
--rb-blur: 10px; /* backdrop blur for overlay surfaces (dialog); the source
|
|
67
|
+
site also uses it on its sticky header, which this library
|
|
68
|
+
does not ship as a component */
|
|
69
|
+
--rb-transition: 0.15s;
|
|
70
|
+
|
|
71
|
+
/* spacing — generous, editorial rhythm */
|
|
72
|
+
--rb-space-1: 0.5rem;
|
|
73
|
+
--rb-space-2: 0.75rem;
|
|
74
|
+
--rb-space-3: 1rem;
|
|
75
|
+
--rb-space-4: 1.5rem;
|
|
76
|
+
--rb-space-5: 2.25rem;
|
|
77
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/* summer-cloud — base styles
|
|
2
|
+
* Scoped defaults. Requires tokens.css. Apps that need the webfonts should
|
|
3
|
+
* include the Google Fonts <link>s for Plus Jakarta Sans (400;600;700;800),
|
|
4
|
+
* Inter (400;600) and JetBrains Mono (500;700), or self-host; every token
|
|
5
|
+
* stack falls back to a system family.
|
|
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="summer-cloud"]) {
|
|
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
|
+
-webkit-font-smoothing: antialiased;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *),
|
|
21
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *)::before,
|
|
22
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *)::after {
|
|
23
|
+
box-sizing: border-box;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:where(html[data-rb-style="summer-cloud"]) body {
|
|
27
|
+
margin: 0;
|
|
28
|
+
min-height: 100vh;
|
|
29
|
+
background-color: var(--rb-bg);
|
|
30
|
+
color: var(--rb-text);
|
|
31
|
+
font-family: var(--rb-font-body);
|
|
32
|
+
font-weight: var(--rb-font-weight);
|
|
33
|
+
-webkit-font-smoothing: antialiased;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Opt-in page background: the sky gradient. Flat --rb-bg is also correct, but
|
|
37
|
+
* the gradient is the signature — the theme reads as "airy" only against it.
|
|
38
|
+
* Apply to <body>, or to the attributed container itself. */
|
|
39
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-bg {
|
|
40
|
+
background: linear-gradient(135deg, var(--rb-sky-start) 0%, var(--rb-sky-end) 100%);
|
|
41
|
+
background-attachment: fixed;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *):where(h1, h2, h3, h4) {
|
|
45
|
+
font-family: var(--rb-font-display);
|
|
46
|
+
font-weight: var(--rb-font-weight-bold);
|
|
47
|
+
letter-spacing: var(--rb-heading-tracking);
|
|
48
|
+
color: var(--rb-text);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *):where(a) {
|
|
52
|
+
color: var(--rb-accent);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *)::selection {
|
|
56
|
+
background: var(--rb-accent);
|
|
57
|
+
color: #fff;
|
|
58
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* summer-cloud — alert / callout: glass card with a semantic left rule */
|
|
2
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert {
|
|
3
|
+
padding: var(--rb-space-4);
|
|
4
|
+
background: var(--rb-surface-glass);
|
|
5
|
+
border: 1px solid var(--rb-border);
|
|
6
|
+
border-left: 4px solid var(--rb-accent-2);
|
|
7
|
+
border-radius: var(--rb-radius);
|
|
8
|
+
backdrop-filter: blur(var(--rb-blur));
|
|
9
|
+
-webkit-backdrop-filter: blur(var(--rb-blur));
|
|
10
|
+
box-shadow: var(--rb-shadow-sm);
|
|
11
|
+
color: var(--rb-text);
|
|
12
|
+
font-size: var(--rb-text-sm);
|
|
13
|
+
}
|
|
14
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--info { border-left-color: var(--rb-info); }
|
|
15
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--success { border-left-color: var(--rb-success); }
|
|
16
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--warning { border-left-color: var(--rb-warning); }
|
|
17
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--danger { border-left-color: var(--rb-danger); }
|
|
18
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert__title {
|
|
19
|
+
display: block;
|
|
20
|
+
margin-bottom: var(--rb-space-1);
|
|
21
|
+
font-family: var(--rb-font-display);
|
|
22
|
+
font-weight: var(--rb-font-weight-medium);
|
|
23
|
+
font-size: var(--rb-text-sm);
|
|
24
|
+
color: var(--rb-text);
|
|
25
|
+
}
|
|
26
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--info .rb-alert__title { color: var(--rb-accent-2-deep); }
|
|
27
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--success .rb-alert__title { color: #1a7a1a; }
|
|
28
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--warning .rb-alert__title { color: #594400; }
|
|
29
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-alert--danger .rb-alert__title { color: #93000a; }
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* summer-cloud — badge: solid pill, mono uppercase, for retail energy */
|
|
2
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-badge {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: var(--rb-space-1);
|
|
6
|
+
padding: 0.25rem 0.75rem;
|
|
7
|
+
background: var(--rb-surface-glass-high);
|
|
8
|
+
border: 1px solid var(--rb-border);
|
|
9
|
+
border-radius: var(--rb-radius-pill);
|
|
10
|
+
color: var(--rb-text-faint);
|
|
11
|
+
text-transform: uppercase;
|
|
12
|
+
font-family: var(--rb-font-mono);
|
|
13
|
+
font-size: 12px;
|
|
14
|
+
font-weight: 500;
|
|
15
|
+
letter-spacing: var(--rb-label-tracking);
|
|
16
|
+
box-shadow: 0 1px 2px rgba(93, 43, 255, 0.06);
|
|
17
|
+
}
|
|
18
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-badge--primary { background: var(--rb-accent); border-color: transparent; color: #fff; }
|
|
19
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-badge--info { background: var(--rb-info); border-color: transparent; color: #004261; }
|
|
20
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-badge--success { background: var(--rb-success); border-color: transparent; color: #0a2e0a; }
|
|
21
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-badge--warning { background: var(--rb-warning); border-color: transparent; color: #241a00; }
|
|
22
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-badge--danger { background: var(--rb-danger); border-color: transparent; color: #4a0000; }
|
|
23
|
+
|
|
24
|
+
/* Chip — the filter variant: outlined until selected. */
|
|
25
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-chip {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
gap: var(--rb-space-1);
|
|
29
|
+
padding: var(--rb-space-2) var(--rb-space-3);
|
|
30
|
+
background: none;
|
|
31
|
+
border: 1px solid var(--rb-outline);
|
|
32
|
+
border-radius: var(--rb-radius-pill);
|
|
33
|
+
color: var(--rb-text-faint);
|
|
34
|
+
font-family: var(--rb-font-display);
|
|
35
|
+
font-size: 12px;
|
|
36
|
+
font-weight: var(--rb-font-weight-medium);
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
transition: background var(--rb-transition), color var(--rb-transition),
|
|
39
|
+
border-color var(--rb-transition);
|
|
40
|
+
}
|
|
41
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-chip:hover {
|
|
42
|
+
background: var(--rb-sky-tint);
|
|
43
|
+
}
|
|
44
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-chip--selected,
|
|
45
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-chip[aria-pressed="true"] {
|
|
46
|
+
background: var(--rb-accent-bright);
|
|
47
|
+
border-color: transparent;
|
|
48
|
+
color: #fff;
|
|
49
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/* summer-cloud — button: pill-shaped, bouncy, tinted-shadow lift */
|
|
2
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
gap: var(--rb-space-2);
|
|
7
|
+
padding: 0.75rem var(--rb-space-4);
|
|
8
|
+
background: rgba(255, 255, 255, 0.4);
|
|
9
|
+
border: 1px solid var(--rb-border);
|
|
10
|
+
border-radius: var(--rb-radius-pill);
|
|
11
|
+
color: var(--rb-text-faint);
|
|
12
|
+
font-family: var(--rb-font-display);
|
|
13
|
+
font-weight: var(--rb-font-weight-medium);
|
|
14
|
+
font-size: var(--rb-text-sm);
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
transition:
|
|
17
|
+
background var(--rb-transition),
|
|
18
|
+
border-color var(--rb-transition),
|
|
19
|
+
color var(--rb-transition),
|
|
20
|
+
box-shadow 0.2s ease,
|
|
21
|
+
transform 0.2s var(--rb-ease-bounce);
|
|
22
|
+
}
|
|
23
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:hover,
|
|
24
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:focus-visible {
|
|
25
|
+
background: rgba(255, 255, 255, 0.6);
|
|
26
|
+
border-color: var(--rb-accent-border);
|
|
27
|
+
color: var(--rb-accent);
|
|
28
|
+
transform: scale(1.03);
|
|
29
|
+
outline: none;
|
|
30
|
+
}
|
|
31
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:focus-visible {
|
|
32
|
+
box-shadow: 0 0 0 4px var(--rb-accent-2-glow);
|
|
33
|
+
}
|
|
34
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:active {
|
|
35
|
+
transform: scale(0.95);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Primary — the solid violet CTA. One per view. */
|
|
39
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--primary {
|
|
40
|
+
background: var(--rb-accent);
|
|
41
|
+
border-color: transparent;
|
|
42
|
+
color: #fff;
|
|
43
|
+
font-weight: var(--rb-font-weight-bold);
|
|
44
|
+
box-shadow: var(--rb-shadow-raised);
|
|
45
|
+
}
|
|
46
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--primary:hover {
|
|
47
|
+
background: var(--rb-accent-bright);
|
|
48
|
+
color: #fff;
|
|
49
|
+
box-shadow: var(--rb-shadow-raised-hover);
|
|
50
|
+
}
|
|
51
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--primary:focus-visible {
|
|
52
|
+
background: var(--rb-accent-bright);
|
|
53
|
+
color: #fff;
|
|
54
|
+
box-shadow: var(--rb-shadow-raised-hover), 0 0 0 4px var(--rb-accent-glow);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Accent — glass with a sky-blue edge, for the secondary path. */
|
|
58
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--accent {
|
|
59
|
+
border-color: var(--rb-accent-2);
|
|
60
|
+
color: var(--rb-accent-2-deep);
|
|
61
|
+
}
|
|
62
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--accent:hover,
|
|
63
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--accent:focus-visible {
|
|
64
|
+
color: var(--rb-accent-2-deep);
|
|
65
|
+
box-shadow: 0 0 0 4px var(--rb-accent-2-glow);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Ghost — no chrome until hovered. */
|
|
69
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--ghost {
|
|
70
|
+
background: none;
|
|
71
|
+
border-color: transparent;
|
|
72
|
+
box-shadow: none;
|
|
73
|
+
}
|
|
74
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--ghost:hover,
|
|
75
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--ghost:focus-visible {
|
|
76
|
+
background: var(--rb-sky-tint);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--danger {
|
|
80
|
+
background: var(--rb-danger-deep);
|
|
81
|
+
border-color: transparent;
|
|
82
|
+
color: #fff;
|
|
83
|
+
font-weight: var(--rb-font-weight-bold);
|
|
84
|
+
box-shadow: 0 4px 14px rgba(204, 31, 31, 0.39);
|
|
85
|
+
}
|
|
86
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--danger:hover,
|
|
87
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn--danger:focus-visible {
|
|
88
|
+
background: var(--rb-danger);
|
|
89
|
+
color: #4a0000;
|
|
90
|
+
box-shadow: 0 6px 20px rgba(255, 77, 77, 0.5);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:disabled {
|
|
94
|
+
opacity: 0.5;
|
|
95
|
+
cursor: not-allowed;
|
|
96
|
+
transform: none;
|
|
97
|
+
box-shadow: none;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@media (prefers-reduced-motion: reduce) {
|
|
101
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn {
|
|
102
|
+
transition: background var(--rb-transition), color var(--rb-transition);
|
|
103
|
+
}
|
|
104
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:hover,
|
|
105
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:focus-visible,
|
|
106
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-btn:active {
|
|
107
|
+
transform: none;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* summer-cloud — card: the glassmorphic panel everything else sits in */
|
|
2
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-card {
|
|
3
|
+
padding: var(--rb-space-5);
|
|
4
|
+
background: var(--rb-surface-glass);
|
|
5
|
+
border: 1px solid var(--rb-border);
|
|
6
|
+
border-radius: var(--rb-radius);
|
|
7
|
+
backdrop-filter: blur(var(--rb-blur));
|
|
8
|
+
-webkit-backdrop-filter: blur(var(--rb-blur));
|
|
9
|
+
box-shadow: var(--rb-shadow-lg);
|
|
10
|
+
color: var(--rb-text);
|
|
11
|
+
}
|
|
12
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-card > :first-child { margin-top: 0; }
|
|
13
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-card > :last-child { margin-bottom: 0; }
|
|
14
|
+
|
|
15
|
+
/* Level 2 — floating: higher-opacity white, lifts on hover. Use for
|
|
16
|
+
* interactive cards (products, tiles), not for static content panels. */
|
|
17
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-card--floating {
|
|
18
|
+
background: var(--rb-surface-glass-high);
|
|
19
|
+
backdrop-filter: blur(var(--rb-blur-high));
|
|
20
|
+
-webkit-backdrop-filter: blur(var(--rb-blur-high));
|
|
21
|
+
transition: transform var(--rb-transition), box-shadow var(--rb-transition);
|
|
22
|
+
}
|
|
23
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-card--floating:hover {
|
|
24
|
+
transform: translateY(-4px);
|
|
25
|
+
box-shadow: var(--rb-shadow-raised-hover);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@media (prefers-reduced-motion: reduce) {
|
|
29
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-card--floating {
|
|
30
|
+
transition: none;
|
|
31
|
+
}
|
|
32
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-card--floating:hover {
|
|
33
|
+
transform: none;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* summer-cloud — dialog (native <dialog>): the floating tier, fully opaque */
|
|
2
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-dialog {
|
|
3
|
+
padding: var(--rb-space-5);
|
|
4
|
+
max-width: 32rem;
|
|
5
|
+
width: calc(100vw - 2rem);
|
|
6
|
+
background: var(--rb-surface);
|
|
7
|
+
border: 1px solid var(--rb-border);
|
|
8
|
+
border-radius: var(--rb-radius);
|
|
9
|
+
color: var(--rb-text);
|
|
10
|
+
font-family: var(--rb-font-body);
|
|
11
|
+
box-shadow: var(--rb-shadow-lg);
|
|
12
|
+
}
|
|
13
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-dialog::backdrop {
|
|
14
|
+
background: rgba(23, 28, 31, 0.3);
|
|
15
|
+
backdrop-filter: blur(4px);
|
|
16
|
+
}
|
|
17
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-dialog__title {
|
|
18
|
+
margin: 0 0 var(--rb-space-3);
|
|
19
|
+
color: var(--rb-accent);
|
|
20
|
+
font-family: var(--rb-font-display);
|
|
21
|
+
font-size: 1.5rem;
|
|
22
|
+
font-weight: var(--rb-font-weight-bold);
|
|
23
|
+
letter-spacing: var(--rb-heading-tracking);
|
|
24
|
+
}
|
|
25
|
+
:where([data-rb-style="summer-cloud"], [data-rb-style="summer-cloud"] *).rb-dialog__actions {
|
|
26
|
+
display: flex;
|
|
27
|
+
justify-content: flex-end;
|
|
28
|
+
gap: var(--rb-space-2);
|
|
29
|
+
margin-top: var(--rb-space-5);
|
|
30
|
+
}
|