@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,124 @@
1
+ /* neon-butterfly — form controls: input, textarea, select, checkbox, radio, switch */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-input,
3
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-select,
4
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-textarea {
5
+ display: block;
6
+ width: 100%;
7
+ padding: var(--rb-space-2) var(--rb-space-3);
8
+ background: var(--rb-surface);
9
+ border: 1px solid var(--rb-border);
10
+ border-radius: var(--rb-radius);
11
+ color: var(--rb-text);
12
+ font-family: var(--rb-font-mono);
13
+ font-weight: var(--rb-font-weight);
14
+ font-size: var(--rb-text-sm);
15
+ transition: border-color var(--rb-transition), box-shadow var(--rb-transition);
16
+ }
17
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-select {
18
+ appearance: none;
19
+ padding-right: 2.25rem;
20
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23958da1' stroke-width='1.5'/%3E%3C/svg%3E");
21
+ background-repeat: no-repeat;
22
+ background-position: right 0.75rem center;
23
+ }
24
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-input::placeholder,
25
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-textarea::placeholder {
26
+ color: var(--rb-text-faint);
27
+ }
28
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-input:focus,
29
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-select:focus,
30
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-textarea:focus {
31
+ outline: none;
32
+ border-color: var(--rb-accent-border);
33
+ box-shadow: 0 0 8px rgba(210, 187, 255, 0.3);
34
+ }
35
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-input[aria-invalid="true"],
36
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-textarea[aria-invalid="true"] {
37
+ border-color: var(--rb-danger);
38
+ }
39
+
40
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-label {
41
+ display: block;
42
+ margin-bottom: var(--rb-space-1);
43
+ color: var(--rb-text-faint);
44
+ text-transform: uppercase;
45
+ font-size: 12px;
46
+ font-weight: var(--rb-font-weight-bold);
47
+ letter-spacing: var(--rb-label-tracking);
48
+ }
49
+
50
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-field {
51
+ margin-bottom: var(--rb-space-3);
52
+ }
53
+
54
+ /* checkbox & radio */
55
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-checkbox,
56
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-radio {
57
+ appearance: none;
58
+ width: 1.1rem;
59
+ height: 1.1rem;
60
+ margin: 0;
61
+ vertical-align: text-bottom;
62
+ background: var(--rb-surface);
63
+ border: 1px solid var(--rb-border);
64
+ border-radius: 0.25rem;
65
+ cursor: pointer;
66
+ transition: border-color var(--rb-transition), box-shadow var(--rb-transition);
67
+ }
68
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-radio {
69
+ border-radius: 50%;
70
+ }
71
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-checkbox:checked,
72
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-radio:checked {
73
+ border-color: var(--rb-accent-2);
74
+ box-shadow: inset 0 0 0 3px var(--rb-surface), inset 0 0 0 1rem var(--rb-accent-2),
75
+ 0 0 6px var(--rb-accent-2-glow);
76
+ }
77
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-checkbox:focus-visible,
78
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-radio:focus-visible,
79
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-switch:focus-visible {
80
+ outline: none;
81
+ border-color: var(--rb-accent-border);
82
+ }
83
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-choice {
84
+ display: inline-flex;
85
+ align-items: center;
86
+ gap: var(--rb-space-2);
87
+ color: var(--rb-text);
88
+ font-size: var(--rb-text-sm);
89
+ cursor: pointer;
90
+ }
91
+
92
+ /* switch */
93
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-switch {
94
+ appearance: none;
95
+ width: 2.4rem;
96
+ height: 1.3rem;
97
+ margin: 0;
98
+ vertical-align: text-bottom;
99
+ background: var(--rb-surface);
100
+ border: 1px solid var(--rb-border);
101
+ border-radius: 1rem;
102
+ cursor: pointer;
103
+ position: relative;
104
+ transition: border-color var(--rb-transition);
105
+ }
106
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-switch::after {
107
+ content: "";
108
+ position: absolute;
109
+ top: 2px;
110
+ left: 2px;
111
+ width: calc(1.3rem - 6px);
112
+ height: calc(1.3rem - 6px);
113
+ border-radius: 50%;
114
+ background: var(--rb-text-faint);
115
+ transition: transform var(--rb-transition), background var(--rb-transition);
116
+ }
117
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-switch:checked {
118
+ border-color: var(--rb-accent-2);
119
+ }
120
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-switch:checked::after {
121
+ transform: translateX(1.1rem);
122
+ background: var(--rb-accent-2);
123
+ box-shadow: 0 0 6px var(--rb-accent-2-glow);
124
+ }
@@ -0,0 +1,55 @@
1
+ /* neon-butterfly — nav link: uppercase mono link with ">" chevron and glow hover */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-link {
3
+ display: flex;
4
+ align-items: baseline;
5
+ gap: var(--rb-space-3);
6
+ padding: 1.25rem var(--rb-space-4);
7
+ background: var(--rb-surface-glass);
8
+ border: 1px solid var(--rb-border);
9
+ border-radius: var(--rb-radius);
10
+ backdrop-filter: blur(var(--rb-blur));
11
+ color: var(--rb-text);
12
+ text-decoration: none;
13
+ text-transform: uppercase;
14
+ font-weight: var(--rb-font-weight-bold);
15
+ font-size: var(--rb-text-sm);
16
+ letter-spacing: var(--rb-label-tracking);
17
+ transition:
18
+ border-color var(--rb-transition),
19
+ color var(--rb-transition),
20
+ transform var(--rb-transition);
21
+ }
22
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-link::before {
23
+ content: ">";
24
+ color: var(--rb-text-faint);
25
+ transition: color var(--rb-transition);
26
+ }
27
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-link:hover {
28
+ border-color: var(--rb-accent-border);
29
+ color: var(--rb-accent);
30
+ transform: translateX(4px);
31
+ animation: rb-nb-pulse-glow 2s infinite;
32
+ }
33
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-link:hover::before {
34
+ color: var(--rb-accent-2);
35
+ text-shadow: 0 0 5px var(--rb-accent-2-glow);
36
+ }
37
+
38
+ @keyframes rb-nb-pulse-glow {
39
+ 0%,
40
+ 100% {
41
+ box-shadow: 0 0 5px rgba(210, 187, 255, 0.2);
42
+ }
43
+ 50% {
44
+ box-shadow: 0 0 20px var(--rb-accent-glow);
45
+ }
46
+ }
47
+
48
+ @media (prefers-reduced-motion: reduce) {
49
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-link {
50
+ transition: none;
51
+ }
52
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-link:hover {
53
+ animation: none;
54
+ }
55
+ }
@@ -0,0 +1,41 @@
1
+ /* neon-butterfly — progress bar & spinner */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-progress {
3
+ display: block;
4
+ width: 100%;
5
+ height: 0.5rem;
6
+ background: var(--rb-surface);
7
+ border: 1px solid var(--rb-border);
8
+ border-radius: 1rem;
9
+ overflow: hidden;
10
+ }
11
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-progress__bar {
12
+ height: 100%;
13
+ background: var(--rb-accent);
14
+ box-shadow: 0 0 8px var(--rb-accent-glow);
15
+ border-radius: 1rem;
16
+ transition: width var(--rb-transition);
17
+ }
18
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-progress__bar--accent {
19
+ background: var(--rb-accent-2);
20
+ box-shadow: 0 0 8px var(--rb-accent-2-glow);
21
+ }
22
+
23
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-spinner {
24
+ display: inline-block;
25
+ width: 1.5rem;
26
+ height: 1.5rem;
27
+ border: 2px solid var(--rb-border);
28
+ border-top-color: var(--rb-accent);
29
+ border-radius: 50%;
30
+ animation: rb-nb-spin 0.8s linear infinite;
31
+ }
32
+ @keyframes rb-nb-spin {
33
+ to {
34
+ transform: rotate(360deg);
35
+ }
36
+ }
37
+ @media (prefers-reduced-motion: reduce) {
38
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-spinner {
39
+ animation-duration: 2s;
40
+ }
41
+ }
@@ -0,0 +1,27 @@
1
+ /* neon-butterfly — table */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-table {
3
+ width: 100%;
4
+ border-collapse: collapse;
5
+ font-size: var(--rb-text-sm);
6
+ color: var(--rb-text);
7
+ }
8
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-table th {
9
+ padding: var(--rb-space-2) var(--rb-space-3);
10
+ border-bottom: 1px solid var(--rb-accent-border);
11
+ color: var(--rb-text-faint);
12
+ text-align: left;
13
+ text-transform: uppercase;
14
+ font-size: 12px;
15
+ font-weight: var(--rb-font-weight-bold);
16
+ letter-spacing: var(--rb-label-tracking);
17
+ }
18
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-table td {
19
+ padding: var(--rb-space-2) var(--rb-space-3);
20
+ border-bottom: 1px solid var(--rb-border);
21
+ }
22
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-table tbody tr {
23
+ transition: background var(--rb-transition);
24
+ }
25
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-table tbody tr:hover {
26
+ background: var(--rb-surface-glass);
27
+ }
@@ -0,0 +1,33 @@
1
+ /* neon-butterfly — tabs */
2
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-tabs {
3
+ display: flex;
4
+ gap: var(--rb-space-2);
5
+ border-bottom: 1px solid var(--rb-border);
6
+ }
7
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-tab {
8
+ padding: var(--rb-space-2) var(--rb-space-3);
9
+ margin-bottom: -1px;
10
+ background: none;
11
+ border: none;
12
+ border-bottom: 2px solid transparent;
13
+ color: var(--rb-text-faint);
14
+ text-transform: uppercase;
15
+ font-family: var(--rb-font-mono);
16
+ font-weight: var(--rb-font-weight-bold);
17
+ font-size: var(--rb-text-sm);
18
+ letter-spacing: var(--rb-label-tracking);
19
+ cursor: pointer;
20
+ transition: color var(--rb-transition), border-color var(--rb-transition);
21
+ }
22
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-tab:hover {
23
+ color: var(--rb-text);
24
+ }
25
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-tab--active,
26
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-tab[aria-selected="true"] {
27
+ color: var(--rb-accent);
28
+ border-bottom-color: var(--rb-accent);
29
+ text-shadow: 0 0 8px var(--rb-accent-glow);
30
+ }
31
+ :where([data-rb-style="neon-butterfly"], [data-rb-style="neon-butterfly"] *).rb-tabpanel {
32
+ padding: var(--rb-space-3) 0;
33
+ }
@@ -0,0 +1,103 @@
1
+ # neon-butterfly
2
+
3
+ > **Source & attribution.** Ported from
4
+ > [`nazuraki/ui-std-lib`](https://github.com/nazuraki/ui-std-lib)'s
5
+ > `@nazuraki/styles` "neon-butterfly" theme (MIT, Copyright (c) 2026 nazuraki —
6
+ > see the repo [`NOTICE`](../../NOTICE)), re-namespaced from `--nb-*` / `.nb-*` /
7
+ > `data-nb-style` to the rackbops `--rb-*` contract. The aesthetic below is
8
+ > nazuraki's; only the token/class names changed.
9
+
10
+ Dark, mono-spaced, neon-accented terminal aesthetic. Deep navy backgrounds with
11
+ frosted-glass surfaces; lilac is the primary voice, neon lime the accent that
12
+ signals activity. Everything is uppercase, tracked-out JetBrains Mono — the UI
13
+ should feel like a beautiful command console, not a document.
14
+
15
+ ## Token mapping (dual accent)
16
+
17
+ neon-butterfly is a two-accent design, but the rackbops baseline carries a single
18
+ `--rb-accent`. The mapping:
19
+
20
+ | Role | rackbops token | Value |
21
+ | --- | --- | --- |
22
+ | Primary / brand voice (lilac) | `--rb-accent` (+ `--rb-accent-fg`, `--rb-accent-glow`, `--rb-accent-border`) | `#d2bbff` |
23
+ | Active / critical (neon lime) | `--rb-accent-2` (+ `--rb-accent-2-glow`) — theme extra | `#39ff14` |
24
+ | Lit glass edge | `--rb-border-strong` | `rgba(255,255,255,0.25)` |
25
+ | Glass pane fill | `--rb-surface-glass` — theme extra | `rgba(23,31,51,0.55)` |
26
+
27
+ ## Color
28
+
29
+ | Role | Value | Usage |
30
+ | --- | --- | --- |
31
+ | Background | `#0b1326` | Page background (often blended over imagery with `luminosity`) |
32
+ | Surface | `#171f33` | Solid panels, inputs, dialogs |
33
+ | Surface glass | `rgba(23,31,51,0.55)` + 12px blur | Cards, nav links, alerts |
34
+ | Text | `#dae2fd` | Body text |
35
+ | Text faint | `#958da1` | Secondary text, labels, idle chevrons |
36
+ | Accent (lilac) | `#d2bbff` | Emphasis, hover states, active tabs, glow |
37
+ | Accent-2 (neon lime) | `#39ff14` | Activity signals: checked states, chevrons on hover, success |
38
+ | Info | `#4dc9ff` | Informational callouts and badges |
39
+ | Success | `#39ff14` | Shares the accent-2 hue — success *is* the neon signal |
40
+ | Warning | `#ffd23f` | Caution states |
41
+ | Danger | `#ff2d78` | Destructive actions, errors |
42
+ | Border | `rgba(255,255,255,0.1)` | All resting borders |
43
+
44
+ The signature page background is the butterfly-circuit artwork
45
+ (`assets/butterfly-circuit.png`) blended into the navy with `luminosity` — apply
46
+ via `.rb-bg` on `<body>`. Optional; plain `--rb-bg` navy is also correct.
47
+
48
+ Rules: color is communication — resting UI stays in navy/faint; lilac and lime
49
+ appear only on interaction or state. Never use pure white or pure black.
50
+
51
+ ## Typography
52
+
53
+ - **Family:** JetBrains Mono (weights 450 regular, 700 bold; `--rb-font-weight`
54
+ is 450, `--rb-font-weight-medium`/`-bold` are 700); fallback `ui-monospace`.
55
+ - **Interactive text** (buttons, links, tabs, labels, table headers): uppercase,
56
+ 700, 14px (labels/headers 11–12px), letter-spacing `0.1em` (`--rb-label-tracking`).
57
+ - **Body text:** sentence case, 450.
58
+
59
+ Webfonts (JetBrains Mono) are declared in `styles/manifest.json`
60
+ (`neon-butterfly.fonts`); consumers load that stylesheet or self-host, and the
61
+ token stack falls back to `ui-monospace`.
62
+
63
+ ## Shape & effects
64
+
65
+ - Radius `0.5rem` everywhere (`--rb-radius` == `--rb-radius-lg`); pills
66
+ (`--rb-radius-pill`) for switches/progress.
67
+ - Borders are 1px hairlines; emphasis comes from border *color*, not weight.
68
+ - Glow, not shadow: elevation is expressed with colored `box-shadow` glows
69
+ (`rb-nb-pulse-glow` on hover) rather than dark drop shadows. `--rb-shadow-*`
70
+ exist for baseline parity but the components lean on glow.
71
+ - Transitions 0.3s; hover motion is a 4px `translateX` slide on links.
72
+ - Respect `prefers-reduced-motion`.
73
+
74
+ ## Components
75
+
76
+ Class prefix `rb-`. Variants use BEM-ish modifiers (`rb-btn--accent`).
77
+
78
+ - **Card** `.rb-card` — frosted glass panel.
79
+ - **NavLink** `.rb-link` — the switchboard link: `>` chevron turns lime on hover.
80
+ - **Button** `.rb-btn` — `--primary`, `--accent`, `--danger` variants.
81
+ - **Form** `.rb-input`, `.rb-textarea`, `.rb-select`, `.rb-label`, `.rb-field`,
82
+ `.rb-checkbox`, `.rb-radio`, `.rb-switch`, `.rb-choice` — checked states glow lime.
83
+ - **Badge** `.rb-badge` + semantic modifiers.
84
+ - **Alert** `.rb-alert` — left accent bar carries the semantic color.
85
+ - **Dialog** `.rb-dialog` — native `<dialog>`, lilac border + glow, blurred backdrop.
86
+ - **Tabs** `.rb-tabs`/`.rb-tab`/`.rb-tabpanel` — active tab underlined in lilac with text glow.
87
+ - **Table** `.rb-table` — lilac header rule, glass row hover.
88
+ - **Progress** `.rb-progress`, **Spinner** `.rb-spinner` — glowing lilac indicators.
89
+
90
+ This port carries nazuraki's original component set; the rackbops-specific
91
+ `eyebrow`, `tabstrip`, `wordmark`, and `card--raised` surfaces are not part of it.
92
+
93
+ ## Code syntax
94
+
95
+ Tokens `--rb-code-*` (theme extra). Lilac keywords, neon-lime strings, gold
96
+ numbers, info-cyan functions, light-cyan types, softened-pink variables,
97
+ dimmed-faint comments, faint meta.
98
+
99
+ ## Scoping
100
+
101
+ Every rule is guarded by `data-rb-style="neon-butterfly"` (self or ancestor),
102
+ wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a page
103
+ or on a container for an embedded island.
@@ -0,0 +1,13 @@
1
+ /* neon-butterfly — full theme entry point */
2
+ @import "./tokens.css";
3
+ @import "./base.css";
4
+ @import "./components/card.css";
5
+ @import "./components/link.css";
6
+ @import "./components/button.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";
@@ -0,0 +1,89 @@
1
+ /* neon-butterfly — design tokens
2
+ * Ported from nazuraki/ui-std-lib's @nazuraki/styles "neon-butterfly" theme
3
+ * (MIT, Copyright (c) 2026 nazuraki — see the repo NOTICE), re-namespaced to the
4
+ * rackbops (--rb-*) contract. Consume via:
5
+ * @import "@rackbops/styles/neon-butterfly/tokens";
6
+ * or pull the whole theme with ./index.css.
7
+ *
8
+ * Nothing applies until an element carries data-rb-style="neon-butterfly" — set
9
+ * it on <html> for a page, or on any container for an embedded island. The
10
+ * :where() keeps specificity at zero, so any consumer rule overrides.
11
+ *
12
+ * Names marked (extra) are additions beyond the baseline set that only this
13
+ * theme's own component CSS relies on. neon-butterfly is a dual-accent design:
14
+ * lilac is the brand voice (baseline --rb-accent); neon green marks active
15
+ * paths and critical signals (the --rb-accent-2 extra). All-mono type; depth is
16
+ * glow, not shadow, so --rb-shadow-* are declared for parity but the components
17
+ * lean on the glow extras.
18
+ */
19
+ :where([data-rb-style="neon-butterfly"]) {
20
+ color-scheme: dark;
21
+
22
+ /* color — deep navy foundation */
23
+ --rb-bg: #0b1326;
24
+ --rb-bg-blend: #1a1f2e; /* (extra) blend behind the butterfly-circuit bg */
25
+ --rb-surface: #171f33;
26
+ --rb-surface-2: #1f2740; /* raised panel, a step above surface */
27
+ --rb-surface-sunken: #0e1526; /* inset fields */
28
+ --rb-surface-glass: rgba(23, 31, 51, 0.55); /* (extra) glass panes over blur */
29
+ --rb-text: #dae2fd;
30
+ --rb-text-soft: #aeb4cf; /* secondary body copy */
31
+ --rb-text-faint: #958da1; /* labels, idle tabs, meta */
32
+ --rb-border: rgba(255, 255, 255, 0.1);
33
+ --rb-border-strong: rgba(255, 255, 255, 0.25); /* lit top edge of glass panes */
34
+
35
+ /* accent — lilac is the brand voice */
36
+ --rb-accent: #d2bbff;
37
+ --rb-accent-fg: #0b1326; /* dark ink on the solid lilac fill */
38
+ --rb-accent-wash: rgba(210, 187, 255, 0.16);
39
+ --rb-accent-grad: linear-gradient(120deg, #d2bbff, #39ff14); /* lilac → neon */
40
+ --rb-accent-glow: rgba(210, 187, 255, 0.6); /* (extra) lilac glow */
41
+ --rb-accent-border: rgba(210, 187, 255, 0.8); /* (extra) lit lilac edge */
42
+
43
+ /* accent-2 (extra) — neon green: active states, focus, critical paths */
44
+ --rb-accent-2: #39ff14;
45
+ --rb-accent-2-glow: rgba(57, 255, 20, 0.5);
46
+
47
+ /* semantic */
48
+ --rb-info: #4dc9ff;
49
+ --rb-success: #39ff14;
50
+ --rb-warning: #ffd23f;
51
+ --rb-danger: #ff2d78;
52
+
53
+ /* code syntax (extra) — lilac keywords, neon strings */
54
+ --rb-code-keyword: #d2bbff;
55
+ --rb-code-string: #39ff14;
56
+ --rb-code-number: #ffd23f;
57
+ --rb-code-comment: #8a8199;
58
+ --rb-code-function: #4dc9ff;
59
+ --rb-code-variable: #ff6ba0;
60
+ --rb-code-type: #7fdcff;
61
+ --rb-code-meta: #958da1;
62
+
63
+ /* typography — all-mono: display and body share the JetBrains Mono stack */
64
+ --rb-font-display: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
65
+ --rb-font-body: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
66
+ --rb-font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
67
+ --rb-font-weight: 450;
68
+ --rb-font-weight-medium: 700; /* only 450 + 700 webfont weights load */
69
+ --rb-font-weight-bold: 700;
70
+ --rb-heading-tracking: 0.1em; /* mono headings ride the wide tracking */
71
+ --rb-label-tracking: 0.1em; /* uppercase labels, buttons, tabs */
72
+ --rb-text-sm: 14px;
73
+
74
+ /* shape & effects — one radius everywhere; glow over drop shadow */
75
+ --rb-radius: 0.5rem;
76
+ --rb-radius-lg: 0.5rem; /* one radius everywhere is the look */
77
+ --rb-radius-pill: 999px; /* chips, badges, switches */
78
+ --rb-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4); /* baseline parity; theme uses glow */
79
+ --rb-shadow-lg: 0 10px 34px rgba(0, 0, 0, 0.55);
80
+ --rb-blur: 12px; /* glass backdrop-filter */
81
+ --rb-transition: 0.3s;
82
+
83
+ /* spacing */
84
+ --rb-space-1: 0.25rem;
85
+ --rb-space-2: 0.5rem;
86
+ --rb-space-3: 1rem;
87
+ --rb-space-4: 1.5rem;
88
+ --rb-space-5: 2rem;
89
+ }
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@rackbops/styles",
3
+ "version": "0.1.0",
4
+ "description": "Rackbops design-system styles: tokens, base styles, and component classes per theme.",
5
+ "license": "UNLICENSED",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/roshne/rackbops-ui-ux-std-lib.git",
9
+ "directory": "styles"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "scripts": {
15
+ "test": "node --test"
16
+ },
17
+ "files": [
18
+ "arcane-obsidian",
19
+ "arcane-parchment",
20
+ "rackbops-studio",
21
+ "rackbops-noir",
22
+ "luminous-precision",
23
+ "neon-butterfly",
24
+ "summer-cloud",
25
+ "all.css",
26
+ "manifest.json"
27
+ ],
28
+ "exports": {
29
+ "./all": "./all.css",
30
+ "./manifest": "./manifest.json",
31
+ "./arcane-obsidian": "./arcane-obsidian/index.css",
32
+ "./arcane-obsidian/tokens": "./arcane-obsidian/tokens.css",
33
+ "./arcane-obsidian/base": "./arcane-obsidian/base.css",
34
+ "./arcane-obsidian/components/*": "./arcane-obsidian/components/*.css",
35
+ "./arcane-parchment": "./arcane-parchment/index.css",
36
+ "./arcane-parchment/tokens": "./arcane-parchment/tokens.css",
37
+ "./arcane-parchment/base": "./arcane-parchment/base.css",
38
+ "./arcane-parchment/components/*": "./arcane-parchment/components/*.css",
39
+ "./rackbops-studio": "./rackbops-studio/index.css",
40
+ "./rackbops-studio/tokens": "./rackbops-studio/tokens.css",
41
+ "./rackbops-studio/base": "./rackbops-studio/base.css",
42
+ "./rackbops-studio/components/*": "./rackbops-studio/components/*.css",
43
+ "./rackbops-noir": "./rackbops-noir/index.css",
44
+ "./rackbops-noir/tokens": "./rackbops-noir/tokens.css",
45
+ "./rackbops-noir/base": "./rackbops-noir/base.css",
46
+ "./rackbops-noir/components/*": "./rackbops-noir/components/*.css",
47
+ "./luminous-precision": "./luminous-precision/index.css",
48
+ "./luminous-precision/tokens": "./luminous-precision/tokens.css",
49
+ "./luminous-precision/base": "./luminous-precision/base.css",
50
+ "./luminous-precision/components/*": "./luminous-precision/components/*.css",
51
+ "./neon-butterfly": "./neon-butterfly/index.css",
52
+ "./neon-butterfly/tokens": "./neon-butterfly/tokens.css",
53
+ "./neon-butterfly/base": "./neon-butterfly/base.css",
54
+ "./neon-butterfly/components/*": "./neon-butterfly/components/*.css",
55
+ "./summer-cloud": "./summer-cloud/index.css",
56
+ "./summer-cloud/tokens": "./summer-cloud/tokens.css",
57
+ "./summer-cloud/base": "./summer-cloud/base.css",
58
+ "./summer-cloud/components/*": "./summer-cloud/components/*.css"
59
+ }
60
+ }
@@ -0,0 +1,53 @@
1
+ /* rackbops-noir — 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-noir"]) {
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-noir"], [data-rb-style="rackbops-noir"] *),
16
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *)::before,
17
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *)::after {
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ :where(html[data-rb-style="rackbops-noir"]) 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-noir"], [data-rb-style="rackbops-noir"] *):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-noir"], [data-rb-style="rackbops-noir"] *):where(a) {
41
+ color: inherit;
42
+ }
43
+
44
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *):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-noir"], [data-rb-style="rackbops-noir"] *)::selection {
51
+ background: var(--rb-accent);
52
+ color: #fff;
53
+ }
@@ -0,0 +1,30 @@
1
+ /* rackbops-noir — alert
2
+ * A surface card with a soft resting shadow and a 4px left bar in the
3
+ * semantic colour. */
4
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).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-noir"], [data-rb-style="rackbops-noir"] *).rb-alert__title {
17
+ font-weight: var(--rb-font-weight-medium);
18
+ }
19
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-alert--info {
20
+ border-left-color: var(--rb-info);
21
+ }
22
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-alert--success {
23
+ border-left-color: var(--rb-success);
24
+ }
25
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-alert--warning {
26
+ border-left-color: var(--rb-warning);
27
+ }
28
+ :where([data-rb-style="rackbops-noir"], [data-rb-style="rackbops-noir"] *).rb-alert--danger {
29
+ border-left-color: var(--rb-danger);
30
+ }