@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,133 @@
1
+ # arcane-obsidian
2
+
3
+ The design language of **artifact-console** — "Arcane Obsidian". A dark-primary
4
+ developer console: deep obsidian foundation, tonal indigo surfaces, and a single
5
+ brand voice — arcane-violet — used functionally, never for decoration. Depth is
6
+ luminance-first (tonal layers + a restrained shadow ramp), not glass or glow;
7
+ glass is reserved for the live interactive shell and never used on static report
8
+ pages. The display voice is monospace — the gradient-clipped wordmark and mono
9
+ labels give it a commanding developer-console feel — over a `system-ui` body,
10
+ with tabular numerals so counts, ages, and sizes align in a column. Dark
11
+ ("Obsidian") is the primary look; an AA-tuned light counterpart ("Parchment") is
12
+ documented at the end. Derived from artifact-console#31.
13
+
14
+ ## Color
15
+
16
+ Values are the dark ("Obsidian") scheme; the light ("Parchment") counterpart is
17
+ tabled at the end. Palette parity with `artifact-console/static/style.css` and
18
+ `report_theme.py`.
19
+
20
+ | Role | Value | Usage |
21
+ | --- | --- | --- |
22
+ | Background | `#0c0f14` (deep obsidian) | Page canvas |
23
+ | Surface | `#141922` (indigo) | Cards, header, panels |
24
+ | Surface 2 | `#1c2331` | Raised/hover surface, active tab wash base |
25
+ | Surface sunken | `#080b10` | Inset fields, log wells, progress troughs |
26
+ | Text | `#eceff4` | Body text |
27
+ | Text soft | `#a6b0c0` | Secondary text |
28
+ | Text faint | `#8290a6` | Labels, table headers, meta |
29
+ | Border | `#232c39` | Resting hairline borders |
30
+ | Border strong | `#33404f` | Dialog edges, header rules |
31
+ | Accent | `#8b7cf6` (arcane-violet) | The sole brand voice: emphasis, active state, focus |
32
+ | Accent fg | `#0c0f14` | Dark ink on the solid violet fill (keeps AA) |
33
+ | Accent wash | `rgba(139,124,246,.16)` | Active/hover tint behind accent text |
34
+ | Info | `#4c9df0` | Informational chips |
35
+ | Success | `#43c97e` | Healthy/live status |
36
+ | Warning | `#f2a93b` | Caution status |
37
+ | Danger | `#f0616d` | Destructive actions, errors |
38
+
39
+ **Rules.** Colour is functional. Resting UI is obsidian, indigo, and faint;
40
+ violet appears only on interaction, focus, active state, and emphasis. Colour
41
+ beyond the accent is *earned* — severity and status chips are the one place other
42
+ hues appear. The dark resting palette never uses pure white or pure black.
43
+ Muted-on-surface is tuned to clear WCAG AA (4.5:1) on every surface; the light
44
+ "Parchment" counterpart tabled below does use `#ffffff` for its raised surface.
45
+
46
+ ## Typography
47
+
48
+ - **Display / wordmark:** the mono stack (`ui-monospace, "Cascadia Code", …`),
49
+ weight 600, tight tracking (`-0.01em`). Monospace *is* the display voice.
50
+ - **Body & UI:** `system-ui, -apple-system, "Segoe UI", Roboto, …`, weight 400.
51
+ - **Numerals:** `font-variant-numeric: tabular-nums` everywhere data is shown.
52
+ - **Labels** (eyebrows, badges, table headers): mono, uppercase, ~11px, tracked
53
+ `0.06em`.
54
+
55
+ ## Shape & effects
56
+
57
+ - Radius `0.4375rem` (7px) for buttons, inputs, and rows; `0.75rem` (12px) for
58
+ cards and dialogs; pills reserved for chips/badges and progress troughs.
59
+ - Depth is luminance-first: tonal surface layers do most of the work, with a
60
+ two-step shadow ramp (`--rb-shadow-sm` resting, `--rb-shadow-lg` for dialogs
61
+ and raised cards). No glow on resting UI.
62
+ - Focus is the accent: inputs swap their border for a violet line plus a soft
63
+ `--rb-accent-wash` ring; interactive elements take a 2px accent outline.
64
+ - The **one gradient** (`--rb-accent-grad`, violet → orchid → gold) is rationed
65
+ to exactly two places: the wordmark and the active-tab underline. Primary
66
+ buttons stay a solid AA-safe accent fill — never the gradient.
67
+ - Transitions `0.15s`. Every animation and transition respects
68
+ `prefers-reduced-motion`.
69
+ - 4px spacing rhythm (`--rb-space-1..5`).
70
+
71
+ ## Components
72
+
73
+ Class prefix `rb-`; shared token/class contract with the other themes.
74
+
75
+ - **Wordmark** `.rb-wordmark` (+ `__spark`) — mono h1 with the gradient clipped
76
+ into the text; the spark mark stays solid accent.
77
+ - **Button** `.rb-btn` — surface-2 ghost by default; `--primary` is the one solid
78
+ violet fill (dark ink), `--accent` a violet-wash chip, `--danger` a rose ghost,
79
+ `--ghost` chromeless.
80
+ - **Card** `.rb-card` (+ `--raised`) — solid panel, hairline border, shadow-sm.
81
+ - **NavLink** `.rb-link` — tree/sidebar row; hover fills to surface-2 and lights a
82
+ 2px accent bar on the left edge; `--active` carries the accent wash.
83
+ - **Form** `.rb-input` / `.rb-textarea` / `.rb-select` / `.rb-label` / `.rb-field`
84
+ / `.rb-choice` / `.rb-checkbox` / `.rb-radio` / `.rb-switch` — sunken fields;
85
+ focus swaps to the accent border + wash ring; controls use `accent-color`.
86
+ - **Badge** `.rb-badge` — mono uppercase pill: a 16% tint of its hue behind
87
+ full-strength text (semantic modifiers `--info/--success/--warning/--danger`).
88
+ - **Alert** `.rb-alert` — surface panel, 3px left bar carries the semantic colour.
89
+ - **Dialog** `.rb-dialog` — native `<dialog>`, obsidian pane, blurred backdrop,
90
+ mono title.
91
+ - **Tabs** `.rb-tabs` / `.rb-tab` / `.rb-tabpanel` — text tabs; the active tab is
92
+ accent, underlined with the rationed gradient.
93
+ - **Tabstrip** `.rb-tabstrip` — top-level view nav: bordered pill buttons; active
94
+ gets accent text + wash + accent-tinted border.
95
+ - **Table** `.rb-table` (+ `.rb-num`) — dense data table, faint header rule,
96
+ tabular numerals, row hover to surface-2.
97
+ - **Progress / Spinner** `.rb-progress` / `.rb-spinner` — sunken trough with an
98
+ accent fill; the spinner is a single accent arc.
99
+ - **Eyebrow** `.rb-eyebrow` — small mono uppercase section label in the accent,
100
+ wide-tracked; subtler than the studio eyebrow (no leading rule).
101
+
102
+ ## Code syntax
103
+
104
+ Tokens `--rb-code-*` (a per-theme extra, since only this theme renders code):
105
+ violet keywords, green strings, gold numbers, info-blue functions, light-violet
106
+ types, soft-rose variables, dimmed comments, faint meta — the palette's own
107
+ voices reused, never new decorative hues.
108
+
109
+ ## Light counterpart — "Parchment"
110
+
111
+ The AA-tuned light secondary. Not shipped as a separate theme yet; documented so
112
+ it can become one additively.
113
+
114
+ | Role | Value |
115
+ | --- | --- |
116
+ | Background | `#f6f7f9` |
117
+ | Surface | `#ffffff` |
118
+ | Surface 2 | `#f1f3f7` |
119
+ | Surface sunken | `#edeff3` |
120
+ | Text | `#191d26` |
121
+ | Text soft | `#4a5261` |
122
+ | Text faint | `#5f6b7d` (a touch darker than report's `#7c8598` so muted-on-surface clears AA) |
123
+ | Border | `#e2e6ec` |
124
+ | Border strong | `#cbd2dc` |
125
+ | Accent | `#6a4fe0` |
126
+ | Accent fg | `#ffffff` |
127
+ | Gradient | `linear-gradient(120deg,#6a4fe0,#a25be0 46%,#d99a2a)` |
128
+
129
+ ## Scoping
130
+
131
+ Every rule is guarded by `data-rb-style="arcane-obsidian"` (self or ancestor),
132
+ wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a page
133
+ or on a container for an embedded island.
@@ -0,0 +1,16 @@
1
+ /* arcane-obsidian — full theme entry point */
2
+ @import "./tokens.css";
3
+ @import "./base.css";
4
+ @import "./components/button.css";
5
+ @import "./components/card.css";
6
+ @import "./components/link.css";
7
+ @import "./components/form.css";
8
+ @import "./components/badge.css";
9
+ @import "./components/alert.css";
10
+ @import "./components/dialog.css";
11
+ @import "./components/tabs.css";
12
+ @import "./components/table.css";
13
+ @import "./components/progress.css";
14
+ @import "./components/eyebrow.css";
15
+ @import "./components/wordmark.css";
16
+ @import "./components/tabstrip.css";
@@ -0,0 +1,81 @@
1
+ /* arcane-obsidian — design tokens
2
+ * Reverse-documented from artifact-console's "Arcane Obsidian" theme
3
+ * (artifact-console/static/style.css + report_theme.py). Consume via:
4
+ * @import "@rackbops/styles/arcane-obsidian/tokens";
5
+ * or pull the whole theme with ./index.css.
6
+ *
7
+ * Nothing applies until an element carries data-rb-style="arcane-obsidian"
8
+ * — set it on <html> for a page, or on any container for an embedded island.
9
+ * The :where() keeps specificity at zero, so any consumer rule overrides.
10
+ *
11
+ * Every theme declares the same baseline token set (styles/test enforces
12
+ * parity); names marked (extra) are additions beyond it that only this
13
+ * theme's own component CSS may rely on. This theme ships its dark, primary
14
+ * look ("Obsidian"); its AA-tuned light counterpart ("Parchment") is
15
+ * documented in design.md and can become its own theme later.
16
+ */
17
+ :where([data-rb-style="arcane-obsidian"]) {
18
+ color-scheme: dark;
19
+
20
+ /* color — deep obsidian foundation, tonal indigo surfaces */
21
+ --rb-bg: #0c0f14;
22
+ --rb-surface: #141922;
23
+ --rb-surface-2: #1c2331;
24
+ --rb-surface-sunken: #080b10; /* inset fields, log wells */
25
+ --rb-text: #eceff4;
26
+ --rb-text-soft: #a6b0c0;
27
+ --rb-text-faint: #8290a6;
28
+ --rb-border: #232c39;
29
+ --rb-border-strong: #33404f;
30
+
31
+ /* accent — arcane-violet is the sole brand voice */
32
+ --rb-accent: #8b7cf6;
33
+ --rb-accent-fg: #0c0f14; /* dark ink on the light-violet solid fill (AA) */
34
+ --rb-accent-wash: rgba(139, 124, 246, 0.16);
35
+
36
+ /* the ONE gradient — rationed to wordmark + active tab only */
37
+ --rb-accent-grad: linear-gradient(120deg, #8b7cf6, #c48bff 46%, #f5c15a);
38
+
39
+ /* semantic — colour beyond the accent is earned: severity/status only */
40
+ --rb-info: #4c9df0;
41
+ --rb-success: #43c97e;
42
+ --rb-warning: #f2a93b;
43
+ --rb-danger: #f0616d;
44
+
45
+ /* code syntax (extra) — palette-derived; only this theme renders code */
46
+ --rb-code-keyword: #8b7cf6;
47
+ --rb-code-string: #43c97e;
48
+ --rb-code-number: #f5c15a;
49
+ --rb-code-comment: #6b7688;
50
+ --rb-code-function: #4c9df0;
51
+ --rb-code-variable: #f0879b;
52
+ --rb-code-type: #c48bff;
53
+ --rb-code-meta: #8290a6;
54
+
55
+ /* typography — monospace display voice over a system-ui body; tabular numerals */
56
+ --rb-font-display: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
57
+ --rb-font-body: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
58
+ --rb-font-mono: ui-monospace, "Cascadia Code", "Cascadia Mono", "Segoe UI Mono", Consolas, Menlo, monospace;
59
+ --rb-font-weight: 400;
60
+ --rb-font-weight-medium: 600;
61
+ --rb-font-weight-bold: 700;
62
+ --rb-heading-tracking: -0.01em;
63
+ --rb-label-tracking: 0.06em;
64
+ --rb-text-sm: 13px;
65
+
66
+ /* shape & effects — luminance-first depth, compact console radii */
67
+ --rb-radius: 0.4375rem; /* 7px — buttons, inputs, rows */
68
+ --rb-radius-lg: 0.75rem; /* 12px — cards, dialogs */
69
+ --rb-radius-pill: 999px;
70
+ --rb-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35);
71
+ --rb-shadow-lg: 0 8px 28px rgba(0, 0, 0, 0.5);
72
+ --rb-blur: 12px; /* glass is reserved for the interactive shell */
73
+ --rb-transition: 0.15s;
74
+
75
+ /* spacing — 4px rhythm */
76
+ --rb-space-1: 0.25rem;
77
+ --rb-space-2: 0.5rem;
78
+ --rb-space-3: 0.75rem;
79
+ --rb-space-4: 1rem;
80
+ --rb-space-5: 1.5rem;
81
+ }
@@ -0,0 +1,46 @@
1
+ /* arcane-parchment — base styles
2
+ * Scoped defaults. Requires tokens.css. Fonts are system stacks (system-ui +
3
+ * ui-monospace) — nothing to load; the console renders offline.
4
+ *
5
+ * The element carrying data-rb-style is the theme's canvas: it gets the
6
+ * background, text color, and body font — whether that is <html> for a page
7
+ * or a mount container for an embedded island. Page-only rules (body margin,
8
+ * viewport height) apply only when the attribute sits on <html>.
9
+ */
10
+ :where([data-rb-style="arcane-parchment"]) {
11
+ background-color: var(--rb-bg);
12
+ color: var(--rb-text);
13
+ font-family: var(--rb-font-body);
14
+ font-weight: var(--rb-font-weight);
15
+ font-variant-numeric: tabular-nums; /* counts/ages/sizes align in a column */
16
+ }
17
+
18
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *),
19
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *)::before,
20
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *)::after {
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ :where(html[data-rb-style="arcane-parchment"]) body {
25
+ margin: 0;
26
+ min-height: 100vh;
27
+ background-color: var(--rb-bg);
28
+ color: var(--rb-text);
29
+ font-family: var(--rb-font-body);
30
+ font-weight: var(--rb-font-weight);
31
+ font-variant-numeric: tabular-nums;
32
+ }
33
+
34
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *):where(a) {
35
+ color: var(--rb-accent);
36
+ }
37
+
38
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *):where(:focus-visible) {
39
+ outline: 2px solid var(--rb-accent);
40
+ outline-offset: 2px;
41
+ }
42
+
43
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *)::selection {
44
+ background: var(--rb-accent);
45
+ color: var(--rb-accent-fg);
46
+ }
@@ -0,0 +1,28 @@
1
+ /* arcane-parchment — alert
2
+ * A surface panel with a 3px left bar carrying the semantic colour. */
3
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-alert {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--rb-space-1);
7
+ padding: var(--rb-space-3) var(--rb-space-4);
8
+ background: var(--rb-surface);
9
+ border: 1px solid var(--rb-border);
10
+ border-left: 3px solid var(--rb-accent);
11
+ border-radius: var(--rb-radius);
12
+ color: var(--rb-text);
13
+ }
14
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-alert__title {
15
+ font-weight: var(--rb-font-weight-medium);
16
+ }
17
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-alert--info {
18
+ border-left-color: var(--rb-info);
19
+ }
20
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-alert--success {
21
+ border-left-color: var(--rb-success);
22
+ }
23
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-alert--warning {
24
+ border-left-color: var(--rb-warning);
25
+ }
26
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-alert--danger {
27
+ border-left-color: var(--rb-danger);
28
+ }
@@ -0,0 +1,33 @@
1
+ /* arcane-parchment — badge / status chip
2
+ * A pill: a faint tint of its hue behind full-strength text. Severity and
3
+ * status are the one place colour beyond the accent is earned. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-badge {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ gap: var(--rb-space-1);
8
+ padding: 2px var(--rb-space-2);
9
+ border-radius: var(--rb-radius-pill);
10
+ font-family: var(--rb-font-mono);
11
+ font-size: 11px;
12
+ font-weight: var(--rb-font-weight-medium);
13
+ letter-spacing: var(--rb-label-tracking);
14
+ text-transform: uppercase;
15
+ background: var(--rb-accent-wash);
16
+ color: var(--rb-accent);
17
+ }
18
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-badge--info {
19
+ background: color-mix(in srgb, var(--rb-info) 16%, transparent);
20
+ color: var(--rb-info);
21
+ }
22
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-badge--success {
23
+ background: color-mix(in srgb, var(--rb-success) 16%, transparent);
24
+ color: var(--rb-success);
25
+ }
26
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-badge--warning {
27
+ background: color-mix(in srgb, var(--rb-warning) 16%, transparent);
28
+ color: var(--rb-warning);
29
+ }
30
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-badge--danger {
31
+ background: color-mix(in srgb, var(--rb-danger) 16%, transparent);
32
+ color: var(--rb-danger);
33
+ }
@@ -0,0 +1,75 @@
1
+ /* arcane-parchment — button
2
+ * Ghost by default; --primary is the one solid accent fill (--accent-fg text).
3
+ * Flat depth: no glow, no drop shadow on resting UI. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ gap: var(--rb-space-2);
9
+ padding: var(--rb-space-2) var(--rb-space-4);
10
+ background: var(--rb-surface-2);
11
+ border: 1px solid var(--rb-border);
12
+ border-radius: var(--rb-radius);
13
+ color: var(--rb-text);
14
+ font-family: var(--rb-font-body);
15
+ font-weight: var(--rb-font-weight-medium);
16
+ font-size: var(--rb-text-sm);
17
+ line-height: 1;
18
+ cursor: pointer;
19
+ transition:
20
+ border-color var(--rb-transition),
21
+ background var(--rb-transition),
22
+ color var(--rb-transition);
23
+ }
24
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn:hover,
25
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn:focus-visible {
26
+ border-color: var(--rb-accent);
27
+ outline: none;
28
+ }
29
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--primary {
30
+ background: var(--rb-accent);
31
+ border-color: var(--rb-accent);
32
+ color: var(--rb-accent-fg);
33
+ }
34
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--primary:hover,
35
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--primary:focus-visible {
36
+ /* Darken the fill on a light ground (mix toward --rb-text) so the white label
37
+ stays AA — lightening it, as the dark sibling does, would drop it to 4.37:1. */
38
+ background: color-mix(in srgb, var(--rb-accent), var(--rb-text) 12%);
39
+ border-color: color-mix(in srgb, var(--rb-accent), var(--rb-text) 12%);
40
+ }
41
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--accent {
42
+ background: var(--rb-accent-wash);
43
+ border-color: color-mix(in srgb, var(--rb-accent) 40%, var(--rb-border));
44
+ color: var(--rb-accent);
45
+ }
46
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--danger {
47
+ background: transparent;
48
+ border-color: color-mix(in srgb, var(--rb-danger) 40%, var(--rb-border));
49
+ color: var(--rb-danger);
50
+ }
51
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--danger:hover,
52
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--danger:focus-visible {
53
+ border-color: var(--rb-danger);
54
+ }
55
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--ghost {
56
+ background: transparent;
57
+ border-color: transparent;
58
+ color: var(--rb-text-soft);
59
+ }
60
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--ghost:hover,
61
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn--ghost:focus-visible {
62
+ background: var(--rb-surface-2);
63
+ border-color: var(--rb-border);
64
+ color: var(--rb-text);
65
+ }
66
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn:disabled {
67
+ opacity: 0.5;
68
+ cursor: not-allowed;
69
+ }
70
+
71
+ @media (prefers-reduced-motion: reduce) {
72
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-btn {
73
+ transition: none;
74
+ }
75
+ }
@@ -0,0 +1,14 @@
1
+ /* arcane-parchment — card
2
+ * Solid raised panel, hairline border, shadow-based elevation (no glass). */
3
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-card {
4
+ background: var(--rb-surface);
5
+ border: 1px solid var(--rb-border);
6
+ border-radius: var(--rb-radius-lg);
7
+ padding: var(--rb-space-5);
8
+ color: var(--rb-text);
9
+ box-shadow: var(--rb-shadow-sm);
10
+ }
11
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-card--raised {
12
+ background: var(--rb-surface-2);
13
+ box-shadow: var(--rb-shadow-lg);
14
+ }
@@ -0,0 +1,31 @@
1
+ /* arcane-parchment — dialog
2
+ * Native <dialog>: a raised surface pane over a blurred backdrop. */
3
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-dialog {
4
+ padding: 0;
5
+ border: 1px solid var(--rb-border-strong);
6
+ border-radius: var(--rb-radius-lg);
7
+ background: var(--rb-surface);
8
+ color: var(--rb-text);
9
+ box-shadow: var(--rb-shadow-lg);
10
+ max-width: min(92vw, 34rem);
11
+ }
12
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-dialog::backdrop {
13
+ background: rgba(8, 11, 16, 0.6);
14
+ backdrop-filter: blur(var(--rb-blur));
15
+ }
16
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-dialog__body {
17
+ padding: var(--rb-space-5);
18
+ }
19
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-dialog__title {
20
+ margin: 0 0 var(--rb-space-3);
21
+ font-family: var(--rb-font-display);
22
+ font-weight: var(--rb-font-weight-medium);
23
+ letter-spacing: var(--rb-heading-tracking);
24
+ }
25
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-dialog__actions {
26
+ display: flex;
27
+ justify-content: flex-end;
28
+ gap: var(--rb-space-2);
29
+ padding: var(--rb-space-3) var(--rb-space-5);
30
+ border-top: 1px solid var(--rb-border);
31
+ }
@@ -0,0 +1,12 @@
1
+ /* arcane-parchment — eyebrow (section / kicker label)
2
+ * Small mono uppercase label in the accent, wide-tracked. Subtler than the
3
+ * studio eyebrow: no leading rule, this is a data console. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-eyebrow {
5
+ display: inline-block;
6
+ font-family: var(--rb-font-mono);
7
+ font-size: 11px;
8
+ font-weight: var(--rb-font-weight-medium);
9
+ letter-spacing: var(--rb-label-tracking);
10
+ text-transform: uppercase;
11
+ color: var(--rb-accent);
12
+ }
@@ -0,0 +1,70 @@
1
+ /* arcane-parchment — form controls
2
+ * Sunken fields on the surface; focus swaps the border for the accent
3
+ * plus a faint accent ring. checked/accent states use the accent, not glow. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-field {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--rb-space-1);
8
+ }
9
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).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="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-input,
15
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-textarea,
16
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-select {
17
+ width: 100%;
18
+ padding: var(--rb-space-2) var(--rb-space-3);
19
+ background: var(--rb-surface-sunken);
20
+ border: 1px solid var(--rb-border);
21
+ border-radius: var(--rb-radius);
22
+ color: var(--rb-text);
23
+ font-family: var(--rb-font-body);
24
+ font-size: var(--rb-text-sm);
25
+ transition:
26
+ border-color var(--rb-transition),
27
+ box-shadow var(--rb-transition);
28
+ }
29
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-textarea {
30
+ min-height: 5rem;
31
+ resize: vertical;
32
+ }
33
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-input:focus-visible,
34
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-textarea:focus-visible,
35
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).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="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-input::placeholder,
41
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-textarea::placeholder {
42
+ color: var(--rb-text-faint);
43
+ }
44
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-choice {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ gap: var(--rb-space-2);
48
+ font-size: var(--rb-text-sm);
49
+ color: var(--rb-text);
50
+ cursor: pointer;
51
+ }
52
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-checkbox,
53
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-radio,
54
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-switch {
55
+ accent-color: var(--rb-accent);
56
+ width: 1rem;
57
+ height: 1rem;
58
+ cursor: pointer;
59
+ }
60
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-switch {
61
+ width: 2rem;
62
+ }
63
+
64
+ @media (prefers-reduced-motion: reduce) {
65
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-input,
66
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-textarea,
67
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-select {
68
+ transition: none;
69
+ }
70
+ }
@@ -0,0 +1,46 @@
1
+ /* arcane-parchment — nav link (tree/sidebar row)
2
+ * A list row; hover fills to surface-2 and lights a 2px accent bar on the left
3
+ * edge; active carries a faint accent wash. Mirrors the console's tree rows. */
4
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-link {
5
+ position: relative;
6
+ display: flex;
7
+ align-items: center;
8
+ gap: var(--rb-space-2);
9
+ padding: var(--rb-space-2) var(--rb-space-3);
10
+ border-radius: var(--rb-radius);
11
+ color: var(--rb-text);
12
+ font-size: var(--rb-text-sm);
13
+ text-decoration: none;
14
+ cursor: pointer;
15
+ transition:
16
+ background var(--rb-transition),
17
+ color var(--rb-transition);
18
+ }
19
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-link:hover {
20
+ background: var(--rb-surface-2);
21
+ }
22
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-link::before {
23
+ content: "";
24
+ position: absolute;
25
+ left: 0;
26
+ top: 6px;
27
+ bottom: 6px;
28
+ width: 2px;
29
+ border-radius: 2px;
30
+ background: transparent;
31
+ transition: background var(--rb-transition);
32
+ }
33
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-link:hover::before,
34
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-link.rb-link--active::before {
35
+ background: var(--rb-accent);
36
+ }
37
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-link.rb-link--active {
38
+ background: var(--rb-accent-wash);
39
+ color: var(--rb-accent);
40
+ }
41
+
42
+ @media (prefers-reduced-motion: reduce) {
43
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-link {
44
+ transition: none;
45
+ }
46
+ }
@@ -0,0 +1,40 @@
1
+ /* arcane-parchment — progress + spinner
2
+ * A sunken trough with an accent fill; the spinner is a single accent arc. */
3
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-progress {
4
+ appearance: none;
5
+ width: 100%;
6
+ height: 6px;
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="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-progress::-webkit-progress-bar {
13
+ background: var(--rb-surface-sunken);
14
+ }
15
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-progress::-webkit-progress-value {
16
+ background: var(--rb-accent);
17
+ }
18
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-progress::-moz-progress-bar {
19
+ background: var(--rb-accent);
20
+ }
21
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).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-parchment-spin 0.7s linear infinite;
29
+ }
30
+ @keyframes rb-parchment-spin {
31
+ to {
32
+ transform: rotate(360deg);
33
+ }
34
+ }
35
+
36
+ @media (prefers-reduced-motion: reduce) {
37
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-spinner {
38
+ animation-duration: 2s;
39
+ }
40
+ }
@@ -0,0 +1,27 @@
1
+ /* arcane-parchment — table
2
+ * Dense data table: a header rule, tabular numerals, row hover to surface-2. */
3
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table {
4
+ width: 100%;
5
+ border-collapse: collapse;
6
+ font-size: var(--rb-text-sm);
7
+ font-variant-numeric: tabular-nums;
8
+ }
9
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table th {
10
+ text-align: left;
11
+ padding: var(--rb-space-2) var(--rb-space-3);
12
+ border-bottom: 1px solid var(--rb-border-strong);
13
+ color: var(--rb-text-faint);
14
+ font-weight: var(--rb-font-weight-medium);
15
+ }
16
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table td {
17
+ padding: var(--rb-space-2) var(--rb-space-3);
18
+ border-bottom: 1px solid var(--rb-border);
19
+ color: var(--rb-text);
20
+ }
21
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table tbody tr:hover td {
22
+ background: var(--rb-surface-2);
23
+ }
24
+ :where([data-rb-style="arcane-parchment"], [data-rb-style="arcane-parchment"] *).rb-table .rb-num {
25
+ text-align: right;
26
+ font-variant-numeric: tabular-nums;
27
+ }