@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,17 @@
1
+ /* rackbops-noir — 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,66 @@
1
+ /* rackbops-noir — design tokens
2
+ * The dark counterpart of rackbops-studio: the mode rackbops.com toggles into.
3
+ * Same structure, class contract, and component CSS as rackbops-studio
4
+ * (token-driven) — only the palette differs, plus a dark-appropriate accent-fg
5
+ * and a lighter accent ramp. Consume via:
6
+ * @import "@rackbops/styles/rackbops-noir/tokens";
7
+ * or pull the whole theme with ./index.css.
8
+ *
9
+ * Nothing applies until an element carries data-rb-style="rackbops-noir".
10
+ * Palette values match rackbops.com's dark scheme.
11
+ */
12
+ :where([data-rb-style="rackbops-noir"]) {
13
+ color-scheme: dark;
14
+
15
+ /* color — deep slate canvas, tonal navy surfaces */
16
+ --rb-bg: #0d141d;
17
+ --rb-surface: #141f2a;
18
+ --rb-surface-2: #19242f;
19
+ --rb-surface-sunken: #0f1720; /* progress troughs, insets */
20
+ --rb-text: #e9eff4;
21
+ --rb-text-soft: #a4b4c3;
22
+ --rb-text-faint: #697a8c;
23
+ --rb-border: #243140;
24
+ --rb-border-strong: #31404f;
25
+
26
+ /* accent — vermillion, brighter on the dark ground */
27
+ --rb-accent: #ff5d3d;
28
+ --rb-accent-fg: #0d141d; /* dark ink on the vermillion fill keeps it AA */
29
+ --rb-accent-wash: rgba(255, 93, 61, 0.13);
30
+
31
+ /* the signature gradient — a vertical vermillion ramp (the rack equaliser) */
32
+ --rb-accent-grad: linear-gradient(180deg, #ff5d3d, #ff7a5f);
33
+
34
+ /* semantic — brightened for AA on the dark ground */
35
+ --rb-info: #4c9df0;
36
+ --rb-success: #43c97e;
37
+ --rb-warning: #f2a93b;
38
+ --rb-danger: #f0616d;
39
+
40
+ /* typography — bold editorial sans headlines; mono for eyebrows/nav/tags */
41
+ --rb-font-display: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
42
+ --rb-font-body: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
43
+ --rb-font-mono: ui-monospace, "SF Mono", "Cascadia Code", "JetBrains Mono", Menlo, Consolas, monospace;
44
+ --rb-font-weight: 400;
45
+ --rb-font-weight-medium: 600;
46
+ --rb-font-weight-bold: 800; /* heavy headlines — the studio signature */
47
+ --rb-heading-tracking: -0.02em;
48
+ --rb-label-tracking: 0.18em;
49
+ --rb-text-sm: 13.5px;
50
+
51
+ /* shape & effects — soft two-step shadow depth (deeper on dark), roomy radii */
52
+ --rb-radius: 0.6875rem; /* 11px */
53
+ --rb-radius-lg: 0.9375rem; /* 15px */
54
+ --rb-radius-pill: 99px;
55
+ --rb-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.35);
56
+ --rb-shadow-lg: 0 2px 6px rgba(0, 0, 0, 0.4), 0 24px 50px -24px rgba(0, 0, 0, 0.7);
57
+ --rb-blur: 10px;
58
+ --rb-transition: 0.15s;
59
+
60
+ /* spacing — generous, editorial rhythm */
61
+ --rb-space-1: 0.5rem;
62
+ --rb-space-2: 0.75rem;
63
+ --rb-space-3: 1rem;
64
+ --rb-space-4: 1.5rem;
65
+ --rb-space-5: 2.25rem;
66
+ }
@@ -0,0 +1,17 @@
1
+ <svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Boppy — the rackbops mascot">
2
+ <rect width="512" height="512" rx="116" fill="#2c4256"/>
3
+ <rect x="80" y="80" width="352" height="44" rx="22" fill="#3d576e" opacity="0.35"/>
4
+ <circle cx="428" cy="86" r="18" fill="#ef4d28"/>
5
+ <circle cx="421" cy="80" r="6" fill="#ff9d84"/>
6
+ <rect x="96" y="150" width="320" height="224" rx="52" fill="#0f1922"/>
7
+ <rect x="110" y="164" width="292" height="196" rx="42" fill="#eef3f6"/>
8
+ <circle cx="196" cy="236" r="36" fill="#16232f"/>
9
+ <circle cx="316" cy="236" r="36" fill="#16232f"/>
10
+ <circle cx="182" cy="222" r="13" fill="#ffffff"/>
11
+ <circle cx="302" cy="222" r="13" fill="#ffffff"/>
12
+ <rect x="187" y="304" width="18" height="22" rx="6" fill="#ef4d28"/>
13
+ <rect x="217" y="288" width="18" height="38" rx="6" fill="#ef4d28"/>
14
+ <rect x="247" y="276" width="18" height="50" rx="6" fill="#ef4d28"/>
15
+ <rect x="277" y="288" width="18" height="38" rx="6" fill="#ef4d28"/>
16
+ <rect x="307" y="304" width="18" height="22" rx="6" fill="#ef4d28"/>
17
+ </svg>
@@ -0,0 +1,53 @@
1
+ /* rackbops-studio — base styles
2
+ * Scoped defaults. Requires tokens.css. Fonts are system stacks — nothing to
3
+ * load. The element carrying data-rb-style is the theme's canvas (page <html>
4
+ * or an embedded island container).
5
+ */
6
+ :where([data-rb-style="rackbops-studio"]) {
7
+ background-color: var(--rb-bg);
8
+ color: var(--rb-text);
9
+ font-family: var(--rb-font-body);
10
+ font-weight: var(--rb-font-weight);
11
+ font-size: 17px;
12
+ line-height: 1.6;
13
+ }
14
+
15
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *),
16
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *)::before,
17
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *)::after {
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ :where(html[data-rb-style="rackbops-studio"]) body {
22
+ margin: 0;
23
+ min-height: 100vh;
24
+ background-color: var(--rb-bg);
25
+ color: var(--rb-text);
26
+ font-family: var(--rb-font-body);
27
+ font-weight: var(--rb-font-weight);
28
+ }
29
+
30
+ /* Heavy, balanced headlines with tight tracking — the studio's editorial voice. */
31
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(h1, h2, h3) {
32
+ margin: 0;
33
+ font-family: var(--rb-font-display);
34
+ font-weight: var(--rb-font-weight-bold);
35
+ letter-spacing: var(--rb-heading-tracking);
36
+ line-height: 1.08;
37
+ text-wrap: balance;
38
+ }
39
+
40
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(a) {
41
+ color: inherit;
42
+ }
43
+
44
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *):where(:focus-visible) {
45
+ outline: 2.5px solid var(--rb-accent);
46
+ outline-offset: 3px;
47
+ border-radius: 3px;
48
+ }
49
+
50
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *)::selection {
51
+ background: var(--rb-accent);
52
+ color: #fff;
53
+ }
@@ -0,0 +1,30 @@
1
+ /* rackbops-studio — alert
2
+ * A white surface card with a soft resting shadow and a 4px left bar in the
3
+ * semantic colour. */
4
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-alert {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--rb-space-1);
8
+ padding: var(--rb-space-3) var(--rb-space-4);
9
+ background: var(--rb-surface);
10
+ border: 1px solid var(--rb-border);
11
+ border-left: 4px solid var(--rb-accent);
12
+ border-radius: var(--rb-radius);
13
+ box-shadow: var(--rb-shadow-sm);
14
+ color: var(--rb-text);
15
+ }
16
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-alert__title {
17
+ font-weight: var(--rb-font-weight-medium);
18
+ }
19
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-alert--info {
20
+ border-left-color: var(--rb-info);
21
+ }
22
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-alert--success {
23
+ border-left-color: var(--rb-success);
24
+ }
25
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-alert--warning {
26
+ border-left-color: var(--rb-warning);
27
+ }
28
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-alert--danger {
29
+ border-left-color: var(--rb-danger);
30
+ }
@@ -0,0 +1,39 @@
1
+ /* rackbops-studio — 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-studio"], [data-rb-style="rackbops-studio"] *).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
+ * stays ink so it clears WCAG AA on the light ground (the raw semantic colors as
19
+ * small text on white are ~3.4-4.4:1). */
20
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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,78 @@
1
+ /* rackbops-studio — button
2
+ * Primary is an ink fill that warms to vermillion on hover; ghost is a bordered
3
+ * outline. A press dips the button; an optional arrow slides on hover. */
4
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-btn:active {
24
+ transform: translateY(1px);
25
+ }
26
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--primary {
27
+ background: var(--rb-text);
28
+ color: #f4f7f9;
29
+ }
30
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--primary:hover,
31
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--primary:focus-visible {
32
+ background: var(--rb-accent);
33
+ color: var(--rb-accent-fg);
34
+ }
35
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--accent {
36
+ background: var(--rb-accent);
37
+ color: var(--rb-accent-fg);
38
+ }
39
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--accent:hover,
40
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--accent:focus-visible {
41
+ background: #c93c1c;
42
+ }
43
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--ghost {
44
+ background: transparent;
45
+ color: var(--rb-text);
46
+ border-color: var(--rb-border-strong);
47
+ }
48
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--ghost:hover,
49
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--ghost:focus-visible {
50
+ border-color: var(--rb-text);
51
+ background: var(--rb-surface-2);
52
+ }
53
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--danger {
54
+ background: transparent;
55
+ color: var(--rb-danger);
56
+ border-color: color-mix(in srgb, var(--rb-danger) 45%, var(--rb-border));
57
+ }
58
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--danger:hover,
59
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn--danger:focus-visible {
60
+ border-color: var(--rb-danger);
61
+ }
62
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn:disabled {
63
+ opacity: 0.5;
64
+ cursor: not-allowed;
65
+ }
66
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn__arrow {
67
+ transition: transform var(--rb-transition) ease;
68
+ }
69
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn:hover .rb-btn__arrow {
70
+ transform: translateX(3px);
71
+ }
72
+
73
+ @media (prefers-reduced-motion: reduce) {
74
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn,
75
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-btn__arrow {
76
+ transition: none;
77
+ }
78
+ }
@@ -0,0 +1,37 @@
1
+ /* rackbops-studio — card
2
+ * White 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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-card {
35
+ transition: none;
36
+ }
37
+ }
@@ -0,0 +1,33 @@
1
+ /* rackbops-studio — dialog
2
+ * Native <dialog>: a white 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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-dialog__body {
18
+ padding: var(--rb-space-5);
19
+ }
20
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio — 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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).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-studio — form controls
2
+ * White fields on the paper ground; focus is a vermillion border + soft wash.
3
+ * Comfortable, roomy sizing to match the editorial body. */
4
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-field {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--rb-space-1);
8
+ }
9
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-input,
15
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-textarea,
16
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-textarea {
30
+ min-height: 6rem;
31
+ resize: vertical;
32
+ }
33
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-input:focus-visible,
34
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-textarea:focus-visible,
35
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-input::placeholder,
41
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-textarea::placeholder {
42
+ color: var(--rb-text-faint);
43
+ }
44
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-checkbox,
53
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-radio,
54
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-switch {
61
+ width: 2.2rem;
62
+ }
63
+
64
+ @media (prefers-reduced-motion: reduce) {
65
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-input,
66
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-textarea,
67
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-select {
68
+ transition: none;
69
+ }
70
+ }
@@ -0,0 +1,31 @@
1
+ /* rackbops-studio — 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-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-link:hover {
20
+ color: var(--rb-text);
21
+ background: var(--rb-surface-2);
22
+ }
23
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-link.rb-link--active {
24
+ color: var(--rb-accent);
25
+ }
26
+
27
+ @media (prefers-reduced-motion: reduce) {
28
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-link {
29
+ transition: none;
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ /* rackbops-studio — 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-studio"], [data-rb-style="rackbops-studio"] *).rb-principles {
5
+ display: flex;
6
+ flex-direction: column;
7
+ }
8
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-principles > .rb-principle:first-child {
16
+ border-top: 0;
17
+ }
18
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-principle__body h3 {
26
+ font-size: 1.16rem;
27
+ }
28
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-principle__body p {
29
+ margin: 7px 0 0;
30
+ color: var(--rb-text-soft);
31
+ }
@@ -0,0 +1,40 @@
1
+ /* rackbops-studio — progress + spinner
2
+ * A pill trough with a vermillion fill; the spinner is a single accent arc. */
3
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio"], [data-rb-style="rackbops-studio"] *).rb-progress::-webkit-progress-bar {
13
+ background: var(--rb-surface-sunken);
14
+ }
15
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-progress::-webkit-progress-value {
16
+ background: var(--rb-accent);
17
+ }
18
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-progress::-moz-progress-bar {
19
+ background: var(--rb-accent);
20
+ }
21
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).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-studio-spin 0.7s linear infinite;
29
+ }
30
+ @keyframes rb-studio-spin {
31
+ to {
32
+ transform: rotate(360deg);
33
+ }
34
+ }
35
+
36
+ @media (prefers-reduced-motion: reduce) {
37
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-spinner {
38
+ animation-duration: 2s;
39
+ }
40
+ }
@@ -0,0 +1,94 @@
1
+ /* rackbops-studio — rack panel (theme extra)
2
+ * The studio's visual pun: a dark navy "rack" unit sitting on the light page,
3
+ * with an animated vermillion equaliser (the "bops" — signal) and a pulsing
4
+ * live dot. The inverted panel palette is this theme's own; it is intentionally
5
+ * a fixed dark block regardless of the light canvas.
6
+ */
7
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack {
8
+ --rb-rack-panel: #101a24;
9
+ --rb-rack-ink: #e7eef4;
10
+ --rb-rack-faint: #7d90a2;
11
+ --rb-rack-line: #26333f;
12
+ background: var(--rb-rack-panel);
13
+ border: 1px solid var(--rb-rack-line);
14
+ border-radius: 16px;
15
+ padding: 24px;
16
+ box-shadow: var(--rb-shadow-lg);
17
+ color: var(--rb-rack-ink);
18
+ overflow: hidden;
19
+ }
20
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__top {
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: space-between;
24
+ font-family: var(--rb-font-mono);
25
+ font-size: 11.5px;
26
+ letter-spacing: 0.14em;
27
+ text-transform: uppercase;
28
+ color: var(--rb-rack-faint);
29
+ }
30
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__live {
31
+ display: inline-flex;
32
+ align-items: center;
33
+ gap: 7px;
34
+ color: var(--rb-rack-ink);
35
+ }
36
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__live::before {
37
+ content: "";
38
+ width: 7px;
39
+ height: 7px;
40
+ border-radius: 50%;
41
+ background: var(--rb-accent);
42
+ animation: rb-studio-pulse 1.8s ease-in-out infinite;
43
+ }
44
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars {
45
+ display: flex;
46
+ align-items: flex-end;
47
+ gap: 7px;
48
+ height: 132px;
49
+ margin: 22px 2px 16px;
50
+ }
51
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i {
52
+ flex: 1;
53
+ background: var(--rb-accent-grad);
54
+ border-radius: 4px 4px 2px 2px;
55
+ transform-origin: bottom;
56
+ animation: rb-studio-bop 1.4s ease-in-out infinite;
57
+ opacity: 0.92;
58
+ }
59
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i:nth-child(1) { height: 52%; animation-delay: -0.2s; }
60
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i:nth-child(2) { height: 88%; animation-delay: -1.1s; }
61
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i:nth-child(3) { height: 34%; animation-delay: -0.6s; }
62
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i:nth-child(4) { height: 70%; animation-delay: -0.9s; }
63
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i:nth-child(5) { height: 100%; animation-delay: -0.35s; }
64
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i:nth-child(6) { height: 46%; animation-delay: -1.3s; }
65
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__foot {
66
+ display: flex;
67
+ justify-content: space-between;
68
+ gap: 12px;
69
+ border-top: 1px solid var(--rb-rack-line);
70
+ padding-top: 14px;
71
+ font-family: var(--rb-font-mono);
72
+ font-size: 11.5px;
73
+ color: var(--rb-rack-faint);
74
+ letter-spacing: 0.04em;
75
+ }
76
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__foot b {
77
+ color: var(--rb-rack-ink);
78
+ font-weight: var(--rb-font-weight-medium);
79
+ }
80
+ @keyframes rb-studio-bop {
81
+ 0%, 100% { transform: scaleY(0.5); }
82
+ 50% { transform: scaleY(1); }
83
+ }
84
+ @keyframes rb-studio-pulse {
85
+ 0%, 100% { opacity: 1; }
86
+ 50% { opacity: 0.35; }
87
+ }
88
+
89
+ @media (prefers-reduced-motion: reduce) {
90
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__bars > i,
91
+ :where([data-rb-style="rackbops-studio"], [data-rb-style="rackbops-studio"] *).rb-rack__live::before {
92
+ animation: none;
93
+ }
94
+ }