@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.
Files changed (117) hide show
  1. package/all.css +14 -0
  2. package/arcane-obsidian/base.css +46 -0
  3. package/arcane-obsidian/components/alert.css +28 -0
  4. package/arcane-obsidian/components/badge.css +33 -0
  5. package/arcane-obsidian/components/button.css +73 -0
  6. package/arcane-obsidian/components/card.css +14 -0
  7. package/arcane-obsidian/components/dialog.css +31 -0
  8. package/arcane-obsidian/components/eyebrow.css +12 -0
  9. package/arcane-obsidian/components/form.css +70 -0
  10. package/arcane-obsidian/components/link.css +46 -0
  11. package/arcane-obsidian/components/progress.css +40 -0
  12. package/arcane-obsidian/components/table.css +27 -0
  13. package/arcane-obsidian/components/tabs.css +45 -0
  14. package/arcane-obsidian/components/tabstrip.css +35 -0
  15. package/arcane-obsidian/components/wordmark.css +23 -0
  16. package/arcane-obsidian/design.md +133 -0
  17. package/arcane-obsidian/index.css +16 -0
  18. package/arcane-obsidian/tokens.css +81 -0
  19. package/arcane-parchment/base.css +46 -0
  20. package/arcane-parchment/components/alert.css +28 -0
  21. package/arcane-parchment/components/badge.css +33 -0
  22. package/arcane-parchment/components/button.css +75 -0
  23. package/arcane-parchment/components/card.css +14 -0
  24. package/arcane-parchment/components/dialog.css +31 -0
  25. package/arcane-parchment/components/eyebrow.css +12 -0
  26. package/arcane-parchment/components/form.css +70 -0
  27. package/arcane-parchment/components/link.css +46 -0
  28. package/arcane-parchment/components/progress.css +40 -0
  29. package/arcane-parchment/components/table.css +27 -0
  30. package/arcane-parchment/components/tabs.css +45 -0
  31. package/arcane-parchment/components/tabstrip.css +35 -0
  32. package/arcane-parchment/components/wordmark.css +23 -0
  33. package/arcane-parchment/design.md +89 -0
  34. package/arcane-parchment/index.css +16 -0
  35. package/arcane-parchment/tokens.css +78 -0
  36. package/luminous-precision/base.css +58 -0
  37. package/luminous-precision/components/alert.css +26 -0
  38. package/luminous-precision/components/badge.css +19 -0
  39. package/luminous-precision/components/button.css +88 -0
  40. package/luminous-precision/components/card.css +12 -0
  41. package/luminous-precision/components/dialog.css +31 -0
  42. package/luminous-precision/components/form.css +126 -0
  43. package/luminous-precision/components/link.css +46 -0
  44. package/luminous-precision/components/progress.css +41 -0
  45. package/luminous-precision/components/table.css +28 -0
  46. package/luminous-precision/components/tabs.css +33 -0
  47. package/luminous-precision/design.md +124 -0
  48. package/luminous-precision/index.css +13 -0
  49. package/luminous-precision/tokens.css +89 -0
  50. package/manifest.json +39 -0
  51. package/neon-butterfly/assets/butterfly-circuit.png +0 -0
  52. package/neon-butterfly/base.css +49 -0
  53. package/neon-butterfly/components/alert.css +26 -0
  54. package/neon-butterfly/components/badge.css +17 -0
  55. package/neon-butterfly/components/button.css +54 -0
  56. package/neon-butterfly/components/card.css +11 -0
  57. package/neon-butterfly/components/dialog.css +29 -0
  58. package/neon-butterfly/components/form.css +124 -0
  59. package/neon-butterfly/components/link.css +55 -0
  60. package/neon-butterfly/components/progress.css +41 -0
  61. package/neon-butterfly/components/table.css +27 -0
  62. package/neon-butterfly/components/tabs.css +33 -0
  63. package/neon-butterfly/design.md +103 -0
  64. package/neon-butterfly/index.css +13 -0
  65. package/neon-butterfly/tokens.css +89 -0
  66. package/package.json +60 -0
  67. package/rackbops-noir/base.css +53 -0
  68. package/rackbops-noir/components/alert.css +30 -0
  69. package/rackbops-noir/components/badge.css +39 -0
  70. package/rackbops-noir/components/button.css +79 -0
  71. package/rackbops-noir/components/card.css +37 -0
  72. package/rackbops-noir/components/dialog.css +33 -0
  73. package/rackbops-noir/components/eyebrow.css +21 -0
  74. package/rackbops-noir/components/form.css +70 -0
  75. package/rackbops-noir/components/link.css +31 -0
  76. package/rackbops-noir/components/principle.css +31 -0
  77. package/rackbops-noir/components/progress.css +40 -0
  78. package/rackbops-noir/components/rack.css +93 -0
  79. package/rackbops-noir/components/table.css +31 -0
  80. package/rackbops-noir/components/tabs.css +45 -0
  81. package/rackbops-noir/components/tag.css +20 -0
  82. package/rackbops-noir/design.md +85 -0
  83. package/rackbops-noir/index.css +17 -0
  84. package/rackbops-noir/tokens.css +66 -0
  85. package/rackbops-studio/assets/boppy.svg +17 -0
  86. package/rackbops-studio/base.css +53 -0
  87. package/rackbops-studio/components/alert.css +30 -0
  88. package/rackbops-studio/components/badge.css +39 -0
  89. package/rackbops-studio/components/button.css +78 -0
  90. package/rackbops-studio/components/card.css +37 -0
  91. package/rackbops-studio/components/dialog.css +33 -0
  92. package/rackbops-studio/components/eyebrow.css +21 -0
  93. package/rackbops-studio/components/form.css +70 -0
  94. package/rackbops-studio/components/link.css +31 -0
  95. package/rackbops-studio/components/principle.css +31 -0
  96. package/rackbops-studio/components/progress.css +40 -0
  97. package/rackbops-studio/components/rack.css +94 -0
  98. package/rackbops-studio/components/table.css +31 -0
  99. package/rackbops-studio/components/tabs.css +45 -0
  100. package/rackbops-studio/components/tag.css +20 -0
  101. package/rackbops-studio/design.md +157 -0
  102. package/rackbops-studio/index.css +17 -0
  103. package/rackbops-studio/tokens.css +77 -0
  104. package/summer-cloud/base.css +58 -0
  105. package/summer-cloud/components/alert.css +29 -0
  106. package/summer-cloud/components/badge.css +49 -0
  107. package/summer-cloud/components/button.css +109 -0
  108. package/summer-cloud/components/card.css +35 -0
  109. package/summer-cloud/components/dialog.css +30 -0
  110. package/summer-cloud/components/form.css +146 -0
  111. package/summer-cloud/components/link.css +60 -0
  112. package/summer-cloud/components/progress.css +43 -0
  113. package/summer-cloud/components/table.css +34 -0
  114. package/summer-cloud/components/tabs.css +38 -0
  115. package/summer-cloud/design.md +165 -0
  116. package/summer-cloud/index.css +13 -0
  117. 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
+ }