@lepid-labs/styles 1.0.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 (52) hide show
  1. package/all.css +10 -0
  2. package/luminous-precision/base.css +58 -0
  3. package/luminous-precision/components/alert.css +26 -0
  4. package/luminous-precision/components/badge.css +19 -0
  5. package/luminous-precision/components/button.css +94 -0
  6. package/luminous-precision/components/card.css +12 -0
  7. package/luminous-precision/components/dialog.css +31 -0
  8. package/luminous-precision/components/form.css +126 -0
  9. package/luminous-precision/components/link.css +46 -0
  10. package/luminous-precision/components/muted.css +7 -0
  11. package/luminous-precision/components/pre.css +14 -0
  12. package/luminous-precision/components/progress.css +41 -0
  13. package/luminous-precision/components/table.css +28 -0
  14. package/luminous-precision/components/tabs.css +33 -0
  15. package/luminous-precision/design.md +95 -0
  16. package/luminous-precision/index.css +15 -0
  17. package/luminous-precision/tokens.css +72 -0
  18. package/manifest.json +23 -0
  19. package/neon-butterfly/assets/butterfly-circuit.png +0 -0
  20. package/neon-butterfly/base.css +49 -0
  21. package/neon-butterfly/components/alert.css +26 -0
  22. package/neon-butterfly/components/badge.css +17 -0
  23. package/neon-butterfly/components/button.css +60 -0
  24. package/neon-butterfly/components/card.css +11 -0
  25. package/neon-butterfly/components/dialog.css +29 -0
  26. package/neon-butterfly/components/form.css +124 -0
  27. package/neon-butterfly/components/link.css +55 -0
  28. package/neon-butterfly/components/muted.css +7 -0
  29. package/neon-butterfly/components/pre.css +13 -0
  30. package/neon-butterfly/components/progress.css +41 -0
  31. package/neon-butterfly/components/table.css +27 -0
  32. package/neon-butterfly/components/tabs.css +33 -0
  33. package/neon-butterfly/design.md +80 -0
  34. package/neon-butterfly/index.css +15 -0
  35. package/neon-butterfly/tokens.css +72 -0
  36. package/package.json +40 -0
  37. package/summer-cloud/base.css +58 -0
  38. package/summer-cloud/components/alert.css +29 -0
  39. package/summer-cloud/components/badge.css +49 -0
  40. package/summer-cloud/components/button.css +115 -0
  41. package/summer-cloud/components/card.css +35 -0
  42. package/summer-cloud/components/dialog.css +30 -0
  43. package/summer-cloud/components/form.css +146 -0
  44. package/summer-cloud/components/link.css +60 -0
  45. package/summer-cloud/components/muted.css +8 -0
  46. package/summer-cloud/components/pre.css +16 -0
  47. package/summer-cloud/components/progress.css +43 -0
  48. package/summer-cloud/components/table.css +34 -0
  49. package/summer-cloud/components/tabs.css +38 -0
  50. package/summer-cloud/design.md +137 -0
  51. package/summer-cloud/index.css +15 -0
  52. package/summer-cloud/tokens.css +93 -0
package/all.css ADDED
@@ -0,0 +1,10 @@
1
+ /* @lepid-labs/styles — every theme in one import.
2
+ *
3
+ * Safe to load together: every rule in every theme is guarded by its
4
+ * data-ld-style attribute value, so nothing applies until an element opts in.
5
+ * Use this in apps that switch themes at runtime; single-theme apps should
6
+ * import just their theme's index.css.
7
+ */
8
+ @import "./neon-butterfly/index.css";
9
+ @import "./summer-cloud/index.css";
10
+ @import "./luminous-precision/index.css";
@@ -0,0 +1,58 @@
1
+ /* luminous-precision — base styles
2
+ * Scoped defaults. Requires tokens.css. Apps that need webfonts should
3
+ * include the Google Fonts <link>s for Sora (500, 600, 700) and
4
+ * JetBrains Mono (400, 600, 700) or self-host; the token stacks fall back
5
+ * to system families.
6
+ *
7
+ * The element carrying data-ld-style is the theme's canvas: it gets the
8
+ * background, text color, and body font — whether that is <html> for a page
9
+ * or a mount container for an embedded island. Page-only rules (body margin,
10
+ * viewport height) apply only when the attribute sits on <html>.
11
+ */
12
+ :where([data-ld-style="luminous-precision"]) {
13
+ background-color: var(--ld-bg);
14
+ color: var(--ld-on-surface);
15
+ font-family: var(--ld-font-body);
16
+ font-weight: var(--ld-font-weight);
17
+ }
18
+
19
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *),
20
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *)::before,
21
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *)::after {
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ :where(html[data-ld-style="luminous-precision"]) body {
26
+ margin: 0;
27
+ min-height: 100vh;
28
+ background-color: var(--ld-bg);
29
+ color: var(--ld-on-surface);
30
+ font-family: var(--ld-font-body);
31
+ font-weight: var(--ld-font-weight);
32
+ }
33
+
34
+ /* Opt-in page background: soft out-of-focus orchid/teal underlays over the
35
+ * obsidian base — the "luminous underlay" treatment. Apply to <body>, or to
36
+ * the attributed container itself. */
37
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-bg {
38
+ background:
39
+ radial-gradient(50rem 30rem at 12% -5%, rgba(198, 165, 255, 0.08), transparent 70%),
40
+ radial-gradient(55rem 35rem at 90% 105%, rgba(0, 245, 255, 0.05), transparent 70%),
41
+ var(--ld-bg);
42
+ background-attachment: fixed;
43
+ }
44
+
45
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *):where(h1, h2, h3, h4, h5, h6) {
46
+ font-family: var(--ld-font-display);
47
+ font-weight: var(--ld-font-weight-medium);
48
+ letter-spacing: -0.01em;
49
+ }
50
+
51
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *):where(a) {
52
+ color: var(--ld-primary);
53
+ }
54
+
55
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *)::selection {
56
+ background: var(--ld-primary);
57
+ color: var(--ld-bg);
58
+ }
@@ -0,0 +1,26 @@
1
+ /* luminous-precision — alert / callout */
2
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert {
3
+ padding: var(--ld-space-3) var(--ld-space-4);
4
+ background: var(--ld-surface-glass);
5
+ border: 1px solid var(--ld-border);
6
+ border-left-width: 3px;
7
+ border-radius: var(--ld-radius);
8
+ backdrop-filter: blur(var(--ld-blur));
9
+ color: var(--ld-on-surface);
10
+ font-size: var(--ld-text-sm);
11
+ }
12
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--info { border-left-color: var(--ld-info); }
13
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--success { border-left-color: var(--ld-success); }
14
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--warning { border-left-color: var(--ld-warning); }
15
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--danger { border-left-color: var(--ld-danger); }
16
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert__title {
17
+ display: block;
18
+ margin-bottom: var(--ld-space-1);
19
+ text-transform: uppercase;
20
+ font-weight: var(--ld-font-weight-medium);
21
+ letter-spacing: var(--ld-tracking-wide);
22
+ }
23
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--info .ld-alert__title { color: var(--ld-info); }
24
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--success .ld-alert__title { color: var(--ld-success); }
25
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--warning .ld-alert__title { color: var(--ld-warning); }
26
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-alert--danger .ld-alert__title { color: var(--ld-danger); }
@@ -0,0 +1,19 @@
1
+ /* luminous-precision — badge: pill chip, 15% tint of its hue behind
2
+ * full-saturation text */
3
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge {
4
+ display: inline-block;
5
+ padding: 0.15rem var(--ld-space-2);
6
+ background: rgba(255, 255, 255, 0.08);
7
+ border: none;
8
+ border-radius: 9999px;
9
+ color: var(--ld-faint);
10
+ text-transform: uppercase;
11
+ font-size: 11px;
12
+ font-weight: var(--ld-font-weight-medium);
13
+ letter-spacing: var(--ld-tracking-wide);
14
+ }
15
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--primary { background: rgba(198, 165, 255, 0.15); color: var(--ld-primary); }
16
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--info { background: rgba(131, 183, 255, 0.15); color: var(--ld-info); }
17
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--success { background: rgba(71, 227, 78, 0.15); color: var(--ld-success); }
18
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--warning { background: rgba(255, 184, 108, 0.15); color: var(--ld-warning); }
19
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--danger { background: rgba(255, 77, 109, 0.15); color: var(--ld-danger); }
@@ -0,0 +1,94 @@
1
+ /* luminous-precision — button */
2
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: var(--ld-space-2);
6
+ padding: var(--ld-space-2) var(--ld-space-3);
7
+ background: transparent;
8
+ border: 1px solid var(--ld-border-lit);
9
+ border-radius: var(--ld-radius);
10
+ color: var(--ld-on-surface);
11
+ text-transform: uppercase;
12
+ font-family: var(--ld-font-mono);
13
+ font-weight: var(--ld-font-weight-medium);
14
+ font-size: var(--ld-text-sm);
15
+ letter-spacing: var(--ld-tracking-wide);
16
+ cursor: pointer;
17
+ transition:
18
+ border-color var(--ld-transition),
19
+ color var(--ld-transition),
20
+ box-shadow var(--ld-transition);
21
+ }
22
+ /* --sm: compact size for inline/table-row actions, scaled to .ld-badge
23
+ * (composes with any variant — sets size only). */
24
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--sm {
25
+ padding: 0.15rem var(--ld-space-2);
26
+ font-size: 12px;
27
+ }
28
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn:hover,
29
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn:focus-visible {
30
+ border-color: var(--ld-primary-border);
31
+ color: var(--ld-primary);
32
+ animation: ld-lp-pulse-glow 2s infinite;
33
+ outline: none;
34
+ }
35
+
36
+ /* primary: solid orchid fill, dark text, glow pulse on hover */
37
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--primary {
38
+ background: var(--ld-primary);
39
+ border-color: var(--ld-primary);
40
+ color: var(--ld-on-primary);
41
+ }
42
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--primary:hover,
43
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--primary:focus-visible {
44
+ border-color: var(--ld-primary);
45
+ color: var(--ld-on-primary);
46
+ }
47
+
48
+ /* accent: teal ghost — critical navigation paths */
49
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--accent {
50
+ border-color: var(--ld-accent);
51
+ color: var(--ld-accent);
52
+ }
53
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--accent:hover,
54
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--accent:focus-visible {
55
+ border-color: var(--ld-accent);
56
+ color: var(--ld-accent);
57
+ animation-name: ld-lp-pulse-glow-accent;
58
+ }
59
+
60
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--danger {
61
+ border-color: var(--ld-danger);
62
+ color: var(--ld-danger);
63
+ }
64
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--danger:hover,
65
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--danger:focus-visible {
66
+ border-color: var(--ld-danger);
67
+ color: var(--ld-danger);
68
+ }
69
+
70
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn:disabled {
71
+ opacity: 0.5;
72
+ cursor: not-allowed;
73
+ animation: none;
74
+ }
75
+
76
+ @keyframes ld-lp-pulse-glow-accent {
77
+ 0%,
78
+ 100% {
79
+ box-shadow: 0 0 5px rgba(0, 245, 255, 0.15);
80
+ }
81
+ 50% {
82
+ box-shadow: 0 0 20px var(--ld-accent-glow);
83
+ }
84
+ }
85
+
86
+ @media (prefers-reduced-motion: reduce) {
87
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn {
88
+ transition: none;
89
+ }
90
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn:hover,
91
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn:focus-visible {
92
+ animation: none;
93
+ }
94
+ }
@@ -0,0 +1,12 @@
1
+ /* luminous-precision — card: glass pane with a lit top edge */
2
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-card {
3
+ padding: var(--ld-space-4);
4
+ background: var(--ld-surface-glass);
5
+ border: 1px solid var(--ld-border);
6
+ border-top-color: var(--ld-border-lit);
7
+ border-radius: var(--ld-radius-lg);
8
+ backdrop-filter: blur(var(--ld-blur));
9
+ color: var(--ld-on-surface);
10
+ }
11
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-card > :first-child { margin-top: 0; }
12
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-card > :last-child { margin-bottom: 0; }
@@ -0,0 +1,31 @@
1
+ /* luminous-precision — dialog (native <dialog>) */
2
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-dialog {
3
+ padding: var(--ld-space-4);
4
+ max-width: 32rem;
5
+ width: calc(100vw - 2rem);
6
+ background: var(--ld-surface);
7
+ border: 1px solid var(--ld-border);
8
+ border-top-color: var(--ld-border-lit);
9
+ border-radius: var(--ld-radius-lg);
10
+ color: var(--ld-on-surface);
11
+ font-family: var(--ld-font-mono);
12
+ box-shadow: 0 0 40px var(--ld-primary-glow);
13
+ }
14
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-dialog::backdrop {
15
+ background: rgba(10, 12, 16, 0.6);
16
+ backdrop-filter: blur(var(--ld-blur));
17
+ }
18
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-dialog__title {
19
+ margin: 0 0 var(--ld-space-3);
20
+ color: var(--ld-primary);
21
+ font-family: var(--ld-font-display);
22
+ font-size: 1.25rem;
23
+ font-weight: var(--ld-font-weight-medium);
24
+ letter-spacing: -0.01em;
25
+ }
26
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-dialog__actions {
27
+ display: flex;
28
+ justify-content: flex-end;
29
+ gap: var(--ld-space-2);
30
+ margin-top: var(--ld-space-4);
31
+ }
@@ -0,0 +1,126 @@
1
+ /* luminous-precision — form controls: input, textarea, select, checkbox,
2
+ * radio, switch. Focus drops the resting border for an electric-teal line
3
+ * with a soft outer glow. */
4
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-input,
5
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-select,
6
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-textarea {
7
+ display: block;
8
+ width: 100%;
9
+ padding: var(--ld-space-2) var(--ld-space-3);
10
+ background: rgba(26, 29, 41, 0.6);
11
+ border: 1px solid var(--ld-border);
12
+ border-radius: var(--ld-radius);
13
+ color: var(--ld-on-surface);
14
+ font-family: var(--ld-font-mono);
15
+ font-weight: var(--ld-font-weight);
16
+ font-size: var(--ld-text-sm);
17
+ transition: border-color var(--ld-transition), box-shadow var(--ld-transition);
18
+ }
19
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-select {
20
+ appearance: none;
21
+ padding-right: 2.25rem;
22
+ 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='%23958e9b' stroke-width='1.5'/%3E%3C/svg%3E");
23
+ background-repeat: no-repeat;
24
+ background-position: right 0.75rem center;
25
+ }
26
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-input::placeholder,
27
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-textarea::placeholder {
28
+ color: var(--ld-faint);
29
+ }
30
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-input:focus,
31
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-select:focus,
32
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-textarea:focus {
33
+ outline: none;
34
+ border-color: var(--ld-accent);
35
+ box-shadow: 0 0 8px var(--ld-accent-glow);
36
+ }
37
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-input[aria-invalid="true"],
38
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-textarea[aria-invalid="true"] {
39
+ border-color: var(--ld-danger);
40
+ }
41
+
42
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-label {
43
+ display: block;
44
+ margin-bottom: var(--ld-space-1);
45
+ color: var(--ld-faint);
46
+ text-transform: uppercase;
47
+ font-size: 12px;
48
+ font-weight: var(--ld-font-weight-medium);
49
+ letter-spacing: var(--ld-tracking-wide);
50
+ }
51
+
52
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-field {
53
+ margin-bottom: var(--ld-space-3);
54
+ }
55
+
56
+ /* checkbox & radio */
57
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-checkbox,
58
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-radio {
59
+ appearance: none;
60
+ width: 1.1rem;
61
+ height: 1.1rem;
62
+ margin: 0;
63
+ vertical-align: text-bottom;
64
+ background: var(--ld-surface);
65
+ border: 1px solid var(--ld-border-lit);
66
+ border-radius: 0.25rem;
67
+ cursor: pointer;
68
+ transition: border-color var(--ld-transition), box-shadow var(--ld-transition);
69
+ }
70
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-radio {
71
+ border-radius: 50%;
72
+ }
73
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-checkbox:checked,
74
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-radio:checked {
75
+ border-color: var(--ld-accent);
76
+ box-shadow: inset 0 0 0 3px var(--ld-surface), inset 0 0 0 1rem var(--ld-accent),
77
+ 0 0 6px var(--ld-accent-glow);
78
+ }
79
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-checkbox:focus-visible,
80
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-radio:focus-visible,
81
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-switch:focus-visible {
82
+ outline: none;
83
+ border-color: var(--ld-primary-border);
84
+ }
85
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-choice {
86
+ display: inline-flex;
87
+ align-items: center;
88
+ gap: var(--ld-space-2);
89
+ color: var(--ld-on-surface);
90
+ font-size: var(--ld-text-sm);
91
+ cursor: pointer;
92
+ }
93
+
94
+ /* switch */
95
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-switch {
96
+ appearance: none;
97
+ width: 2.4rem;
98
+ height: 1.3rem;
99
+ margin: 0;
100
+ vertical-align: text-bottom;
101
+ background: var(--ld-surface);
102
+ border: 1px solid var(--ld-border-lit);
103
+ border-radius: 1rem;
104
+ cursor: pointer;
105
+ position: relative;
106
+ transition: border-color var(--ld-transition);
107
+ }
108
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-switch::after {
109
+ content: "";
110
+ position: absolute;
111
+ top: 2px;
112
+ left: 2px;
113
+ width: calc(1.3rem - 6px);
114
+ height: calc(1.3rem - 6px);
115
+ border-radius: 50%;
116
+ background: var(--ld-faint);
117
+ transition: transform var(--ld-transition), background var(--ld-transition);
118
+ }
119
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-switch:checked {
120
+ border-color: var(--ld-accent);
121
+ }
122
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-switch:checked::after {
123
+ transform: translateX(1.1rem);
124
+ background: var(--ld-accent);
125
+ box-shadow: 0 0 6px var(--ld-accent-glow);
126
+ }
@@ -0,0 +1,46 @@
1
+ /* luminous-precision — nav link: glass list row; hover shifts the indigo and
2
+ * lights a 2px electric-teal bar on the left edge */
3
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-link {
4
+ display: flex;
5
+ align-items: baseline;
6
+ gap: var(--ld-space-3);
7
+ padding: 1rem var(--ld-space-4);
8
+ background: var(--ld-surface-glass);
9
+ border: 1px solid var(--ld-border);
10
+ border-radius: var(--ld-radius);
11
+ backdrop-filter: blur(var(--ld-blur));
12
+ color: var(--ld-on-surface);
13
+ text-decoration: none;
14
+ text-transform: uppercase;
15
+ font-weight: var(--ld-font-weight-medium);
16
+ font-size: var(--ld-text-sm);
17
+ letter-spacing: var(--ld-tracking-wide);
18
+ box-shadow: inset 0 0 0 0 var(--ld-accent);
19
+ transition:
20
+ background var(--ld-transition),
21
+ color var(--ld-transition),
22
+ box-shadow var(--ld-transition);
23
+ }
24
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-link:hover {
25
+ background: var(--ld-surface);
26
+ color: var(--ld-accent);
27
+ box-shadow:
28
+ inset 2px 0 0 0 var(--ld-accent),
29
+ 0 0 12px var(--ld-accent-glow);
30
+ }
31
+
32
+ @keyframes ld-lp-pulse-glow {
33
+ 0%,
34
+ 100% {
35
+ box-shadow: 0 0 5px rgba(198, 165, 255, 0.15);
36
+ }
37
+ 50% {
38
+ box-shadow: 0 0 20px var(--ld-primary-glow);
39
+ }
40
+ }
41
+
42
+ @media (prefers-reduced-motion: reduce) {
43
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-link {
44
+ transition: none;
45
+ }
46
+ }
@@ -0,0 +1,7 @@
1
+ /* luminous-precision — muted / empty-state text
2
+ * Faint secondary text — captions, meta, "No jobs yet." style empty states.
3
+ * Italic distinguishes it from regular body copy at a glance. */
4
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-muted {
5
+ color: var(--ld-faint);
6
+ font-style: italic;
7
+ }
@@ -0,0 +1,14 @@
1
+ /* luminous-precision — command / log block
2
+ * Styled <pre> for shell commands or short log output: the surface-sunken
3
+ * well (already this theme's documented "log wells" token), hairline
4
+ * border, small mono, scrolls horizontally instead of wrapping. */
5
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-pre {
6
+ margin: 0;
7
+ padding: var(--ld-space-3) var(--ld-space-4);
8
+ background: var(--ld-surface-sunken);
9
+ border: 1px solid var(--ld-border);
10
+ border-radius: var(--ld-radius);
11
+ font-family: var(--ld-font-mono);
12
+ font-size: var(--ld-text-sm);
13
+ overflow-x: auto;
14
+ }
@@ -0,0 +1,41 @@
1
+ /* luminous-precision — progress bar & spinner */
2
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-progress {
3
+ display: block;
4
+ width: 100%;
5
+ height: 0.5rem;
6
+ background: var(--ld-surface-sunken);
7
+ border: 1px solid var(--ld-border);
8
+ border-radius: 1rem;
9
+ overflow: hidden;
10
+ }
11
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-progress__bar {
12
+ height: 100%;
13
+ background: var(--ld-primary);
14
+ box-shadow: 0 0 8px var(--ld-primary-glow);
15
+ border-radius: 1rem;
16
+ transition: width var(--ld-transition);
17
+ }
18
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-progress__bar--accent {
19
+ background: var(--ld-accent);
20
+ box-shadow: 0 0 8px var(--ld-accent-glow);
21
+ }
22
+
23
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-spinner {
24
+ display: inline-block;
25
+ width: 1.5rem;
26
+ height: 1.5rem;
27
+ border: 2px solid var(--ld-border);
28
+ border-top-color: var(--ld-primary);
29
+ border-radius: 50%;
30
+ animation: ld-lp-spin 0.8s linear infinite;
31
+ }
32
+ @keyframes ld-lp-spin {
33
+ to {
34
+ transform: rotate(360deg);
35
+ }
36
+ }
37
+ @media (prefers-reduced-motion: reduce) {
38
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-spinner {
39
+ animation-duration: 2s;
40
+ }
41
+ }
@@ -0,0 +1,28 @@
1
+ /* luminous-precision — table */
2
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-table {
3
+ width: 100%;
4
+ border-collapse: collapse;
5
+ font-size: var(--ld-text-sm);
6
+ color: var(--ld-on-surface);
7
+ }
8
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-table th {
9
+ padding: var(--ld-space-2) var(--ld-space-3);
10
+ border-bottom: 1px solid var(--ld-border-lit);
11
+ color: var(--ld-faint);
12
+ text-align: left;
13
+ text-transform: uppercase;
14
+ font-size: 12px;
15
+ font-weight: var(--ld-font-weight-medium);
16
+ letter-spacing: var(--ld-tracking-wide);
17
+ }
18
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-table td {
19
+ padding: var(--ld-space-2) var(--ld-space-3);
20
+ border-bottom: 1px solid var(--ld-border);
21
+ }
22
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-table tbody tr {
23
+ transition: background var(--ld-transition), box-shadow var(--ld-transition);
24
+ }
25
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-table tbody tr:hover {
26
+ background: var(--ld-surface-glass);
27
+ box-shadow: inset 2px 0 0 0 var(--ld-accent);
28
+ }
@@ -0,0 +1,33 @@
1
+ /* luminous-precision — tabs: active tab carries the electric-teal path */
2
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs {
3
+ display: flex;
4
+ gap: var(--ld-space-2);
5
+ border-bottom: 1px solid var(--ld-border);
6
+ }
7
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tab {
8
+ padding: var(--ld-space-2) var(--ld-space-3);
9
+ margin-bottom: -1px;
10
+ background: none;
11
+ border: none;
12
+ border-bottom: 2px solid transparent;
13
+ color: var(--ld-faint);
14
+ text-transform: uppercase;
15
+ font-family: var(--ld-font-mono);
16
+ font-weight: var(--ld-font-weight-medium);
17
+ font-size: var(--ld-text-sm);
18
+ letter-spacing: var(--ld-tracking-wide);
19
+ cursor: pointer;
20
+ transition: color var(--ld-transition), border-color var(--ld-transition);
21
+ }
22
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tab:hover {
23
+ color: var(--ld-on-surface);
24
+ }
25
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tab--active,
26
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tab[aria-selected="true"] {
27
+ color: var(--ld-accent);
28
+ border-bottom-color: var(--ld-accent);
29
+ text-shadow: 0 0 8px var(--ld-accent-glow);
30
+ }
31
+ :where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabpanel {
32
+ padding: var(--ld-space-3) 0;
33
+ }
@@ -0,0 +1,95 @@
1
+ # luminous-precision
2
+
3
+ Professional, nocturnal evolution of neon-butterfly — "Luminous Precision".
4
+ Deep obsidian foundation, glassmorphic indigo surfaces, and light used as the
5
+ interaction language: instead of heavy borders, elements glow. Vibrant orchid
6
+ is the primary voice; electric teal marks active paths and critical signals.
7
+ Sora headlines over JetBrains Mono body give it a commanding, high-tech,
8
+ developer-console feel without going full terminal. Derived from the
9
+ InfraPulse Stitch mockups (Stitch project 18185577263375001507).
10
+
11
+ ## Color
12
+
13
+ | Role | Value | Usage |
14
+ | --- | --- | --- |
15
+ | Background | `#0a0c10` (deep obsidian) | Page background; `.ld-bg` adds soft orchid/teal radial underlays |
16
+ | Surface | `#1a1d29` (indigo) | Solid panels, dialogs |
17
+ | Surface sunken | `#0c0e14` | Inset fields, log wells, progress troughs |
18
+ | Surface glass | `rgba(26,29,41,0.4)` + 12px blur | Cards, nav links, alerts |
19
+ | On-surface | `#e2e2eb` | Body text |
20
+ | Faint | `#958e9b` | Secondary text, labels, idle tabs |
21
+ | Primary | `#c6a5ff` (vibrant orchid) | Primary buttons (solid fill), emphasis, glow |
22
+ | Accent | `#00f5ff` (electric teal) | Active states, focus rings, success paths, list-edge bars |
23
+ | Info | `#83b7ff` | Informational callouts and chips |
24
+ | Success | `#47e34e` | Live/healthy status |
25
+ | Warning | `#ffb86c` (amber) | Caution states |
26
+ | Danger | `#ff4d6d` (rose) | Destructive actions, errors |
27
+ | Border | `rgba(255,255,255,0.08)` | Resting borders |
28
+ | Border lit | `rgba(255,255,255,0.2)` | Top edge of glass panes — simulates overhead light |
29
+
30
+ Rules: color is functional, never decorative. Resting UI stays obsidian/faint;
31
+ orchid and teal appear on interaction, focus, and state. Depth comes from
32
+ tonal layers and glow, not drop shadows. Never pure white or pure black.
33
+
34
+ ## Typography
35
+
36
+ - **Headlines:** Sora (500 md / 600 lg / 700 xl), tight letter-spacing
37
+ (−0.01 to −0.02em); fallback `ui-sans-serif`.
38
+ - **Body & UI:** JetBrains Mono 400; fallback `ui-monospace`.
39
+ - **Labels & interactive text** (buttons, tabs, table headers): uppercase,
40
+ 600, 12–14px, letter-spacing `0.05em`.
41
+
42
+ ## Shape & effects
43
+
44
+ - Radius `0.5rem` for buttons and inputs; `1rem` for cards, dialogs, and large
45
+ containers. Pills reserved strictly for chips/badges and switches.
46
+ - Glass panes: 1px hairline borders with a lighter top edge
47
+ (`--ld-border-lit`) to simulate overhead lighting; `backdrop-filter` 12px.
48
+ - Focus is electric teal: inputs drop the resting border for a teal line plus
49
+ soft teal outer glow.
50
+ - Elevation = glow (`ld-pulse-glow` orchid, `ld-pulse-glow-accent` teal), not
51
+ dark shadows. Transitions 0.3s. Respect `prefers-reduced-motion`.
52
+ - 8px spacing rhythm; generous negative space so glows can breathe.
53
+
54
+ ## Components
55
+
56
+ Class prefix `ld-` (shared token/class contract with the other themes).
57
+
58
+ - **Card** `.ld-card` — glass pane, 1rem radius, lit top edge.
59
+ - **NavLink** `.ld-link` — glass list row; hover shifts to solid indigo and
60
+ lights a 2px teal bar on the left edge.
61
+ - **Button** `.ld-btn` — ghost by default; `--primary` is the one solid fill
62
+ (orchid, dark text), `--accent` teal ghost, `--danger` rose ghost. `--sm` is a
63
+ compact size scaled to `.ld-badge`, for inline and table-row actions.
64
+ - **Form** `.ld-input`, `.ld-textarea`, `.ld-select`, `.ld-label`,
65
+ `.ld-field`, `.ld-checkbox`, `.ld-radio`, `.ld-switch`, `.ld-choice` —
66
+ checked/focus states glow teal.
67
+ - **Badge** `.ld-badge` — pill chip: 15% tint of its hue behind
68
+ full-saturation text (+ semantic modifiers).
69
+ - **Alert** `.ld-alert` — glass, 3px left bar carries the semantic color.
70
+ - **Dialog** `.ld-dialog` — native `<dialog>`, indigo pane with orchid glow,
71
+ Sora title, blurred obsidian backdrop.
72
+ - **Tabs** `.ld-tabs`/`.ld-tab`/`.ld-tabpanel` — active tab underlined in
73
+ teal with text glow.
74
+ - **Table** `.ld-table` — lit header rule; row hover shifts glass and lights
75
+ the teal left bar.
76
+ - **Progress** `.ld-progress`, **Spinner** `.ld-spinner` — glowing orchid
77
+ indicators (`--accent` bar variant in teal).
78
+ - **Muted text** `.ld-muted` — faint secondary/empty-state text;
79
+ `color: var(--ld-faint)`, italic.
80
+ - **Pre / log block** `.ld-pre` — command/log `<pre>`; the surface-sunken
81
+ well (already documented above as this theme's "log wells" token),
82
+ hairline border, radius, small mono, horizontal scroll.
83
+
84
+ ## Code syntax
85
+
86
+ Tokens `--ld-code-*`, part of the baseline contract. Orchid keywords, teal
87
+ types, info-blue functions, amber numbers, success-green strings, soft-rose
88
+ variables, dimmed-faint comments, faint meta — palette voices reused, never
89
+ new hues for decoration.
90
+
91
+ ## Scoping
92
+
93
+ Every rule is guarded by `data-ld-style="luminous-precision"` (self or
94
+ ancestor), wrapped in zero-specificity `:where()`. Set the attribute on
95
+ `<html>` for a page or on a container for an embedded island.