@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
@@ -0,0 +1,146 @@
1
+ /* summer-cloud — form controls: input, textarea, select, checkbox, radio, switch
2
+ * Fields are sunken (no resting border) and bloom a sky-blue ring on focus. */
3
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-input,
4
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-select,
5
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-textarea {
6
+ display: block;
7
+ width: 100%;
8
+ padding: 0.75rem var(--ld-space-3);
9
+ background: var(--ld-surface-sunken);
10
+ border: 1px solid transparent;
11
+ border-radius: var(--ld-radius);
12
+ color: var(--ld-on-surface);
13
+ font-family: var(--ld-font-body);
14
+ font-weight: var(--ld-font-weight);
15
+ font-size: 16px;
16
+ transition: border-color var(--ld-transition), box-shadow var(--ld-transition);
17
+ }
18
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-select {
19
+ appearance: none;
20
+ padding-right: 2.25rem;
21
+ 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='%23484457' stroke-width='1.5'/%3E%3C/svg%3E");
22
+ background-repeat: no-repeat;
23
+ background-position: right 0.75rem center;
24
+ }
25
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-input::placeholder,
26
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-textarea::placeholder {
27
+ color: var(--ld-outline);
28
+ }
29
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-input:focus,
30
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-select:focus,
31
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-textarea:focus {
32
+ outline: none;
33
+ border-color: var(--ld-accent);
34
+ box-shadow: 0 0 0 4px var(--ld-accent-glow);
35
+ }
36
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-input[aria-invalid="true"],
37
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-textarea[aria-invalid="true"] {
38
+ border-color: var(--ld-danger);
39
+ }
40
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-input[aria-invalid="true"]:focus,
41
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-textarea[aria-invalid="true"]:focus {
42
+ box-shadow: 0 0 0 4px rgba(255, 77, 77, 0.2);
43
+ }
44
+
45
+ /* Labels are the mono voice: small, tracked, utility-grade. */
46
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-label {
47
+ display: block;
48
+ margin-bottom: var(--ld-space-1);
49
+ padding-left: var(--ld-space-1);
50
+ color: var(--ld-faint);
51
+ font-family: var(--ld-font-mono);
52
+ font-size: 12px;
53
+ font-weight: 500;
54
+ letter-spacing: var(--ld-tracking-wide);
55
+ }
56
+
57
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-field {
58
+ margin-bottom: var(--ld-space-3);
59
+ }
60
+
61
+ /* checkbox & radio */
62
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-checkbox,
63
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-radio {
64
+ appearance: none;
65
+ width: 1.25rem;
66
+ height: 1.25rem;
67
+ margin: 0;
68
+ vertical-align: text-bottom;
69
+ background: var(--ld-surface-sunken);
70
+ border: 1px solid var(--ld-outline);
71
+ border-radius: var(--ld-radius-sm);
72
+ cursor: pointer;
73
+ transition: background var(--ld-transition), border-color var(--ld-transition),
74
+ box-shadow var(--ld-transition);
75
+ }
76
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-radio {
77
+ border-radius: 50%;
78
+ }
79
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-checkbox:checked,
80
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-radio:checked {
81
+ background: var(--ld-primary);
82
+ border-color: var(--ld-primary);
83
+ }
84
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-checkbox:checked {
85
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='10' viewBox='0 0 12 10'%3E%3Cpath d='M1 5l3.5 3.5L11 1.5' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
86
+ background-repeat: no-repeat;
87
+ background-position: center;
88
+ }
89
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-radio:checked {
90
+ box-shadow: inset 0 0 0 4px var(--ld-surface);
91
+ }
92
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-checkbox:focus-visible,
93
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-radio:focus-visible,
94
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-switch:focus-visible {
95
+ outline: none;
96
+ border-color: var(--ld-accent);
97
+ box-shadow: 0 0 0 4px var(--ld-accent-glow);
98
+ }
99
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-choice {
100
+ display: inline-flex;
101
+ align-items: center;
102
+ gap: var(--ld-space-2);
103
+ color: var(--ld-on-surface);
104
+ font-size: var(--ld-text-sm);
105
+ cursor: pointer;
106
+ }
107
+
108
+ /* switch — the cloud-toggle: oversized, squishy, green when live */
109
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-switch {
110
+ appearance: none;
111
+ width: 3rem;
112
+ height: 1.75rem;
113
+ margin: 0;
114
+ vertical-align: text-bottom;
115
+ background: var(--ld-surface-sunken);
116
+ border: 1px solid var(--ld-outline);
117
+ border-radius: var(--ld-radius-pill);
118
+ cursor: pointer;
119
+ position: relative;
120
+ transition: background var(--ld-transition), border-color var(--ld-transition);
121
+ }
122
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-switch::after {
123
+ content: "";
124
+ position: absolute;
125
+ top: 2px;
126
+ left: 2px;
127
+ width: calc(1.75rem - 6px);
128
+ height: calc(1.75rem - 6px);
129
+ border-radius: 50%;
130
+ background: #fff;
131
+ box-shadow: 0 2px 6px rgba(93, 43, 255, 0.2);
132
+ transition: transform var(--ld-transition) var(--ld-ease-bounce);
133
+ }
134
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-switch:checked {
135
+ background: var(--ld-success);
136
+ border-color: var(--ld-success);
137
+ }
138
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-switch:checked::after {
139
+ transform: translateX(1.25rem);
140
+ }
141
+
142
+ @media (prefers-reduced-motion: reduce) {
143
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-switch::after {
144
+ transition: none;
145
+ }
146
+ }
@@ -0,0 +1,60 @@
1
+ /* summer-cloud — nav link: pill that fills with sky tint, arrow slides out */
2
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link {
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
+ border: 1px solid transparent;
8
+ border-radius: var(--ld-radius-pill);
9
+ color: var(--ld-faint);
10
+ text-decoration: none;
11
+ font-family: var(--ld-font-display);
12
+ font-weight: var(--ld-font-weight-medium);
13
+ font-size: var(--ld-text-sm);
14
+ transition:
15
+ background var(--ld-transition),
16
+ color var(--ld-transition);
17
+ }
18
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link::after {
19
+ content: "→";
20
+ color: var(--ld-accent);
21
+ transition: transform var(--ld-transition);
22
+ }
23
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:hover,
24
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:focus-visible {
25
+ background: var(--ld-sky-tint);
26
+ color: var(--ld-primary);
27
+ outline: none;
28
+ }
29
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:hover::after,
30
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:focus-visible::after {
31
+ transform: translateX(4px);
32
+ }
33
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:active {
34
+ transform: scale(0.95);
35
+ }
36
+
37
+ /* Current page: violet with the underline rule from the top nav. */
38
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link--active,
39
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link[aria-current="page"] {
40
+ background: none;
41
+ border-radius: 0;
42
+ border-bottom: 2px solid var(--ld-primary);
43
+ color: var(--ld-primary);
44
+ }
45
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link--active::after,
46
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link[aria-current="page"]::after {
47
+ content: none;
48
+ }
49
+
50
+ @media (prefers-reduced-motion: reduce) {
51
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link,
52
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link::after {
53
+ transition: none;
54
+ }
55
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:hover::after,
56
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:focus-visible::after,
57
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-link:active {
58
+ transform: none;
59
+ }
60
+ }
@@ -0,0 +1,8 @@
1
+ /* summer-cloud — muted / empty-state text
2
+ * Faint secondary text — captions, meta, "No jobs yet." style empty states.
3
+ * Italic gives it a friendly, soft touch consistent with the theme's airy,
4
+ * optimistic voice. */
5
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-muted {
6
+ color: var(--ld-faint);
7
+ font-style: italic;
8
+ }
@@ -0,0 +1,16 @@
1
+ /* summer-cloud — command / log block
2
+ * Styled <pre> for shell commands or short log output: sunken well, small
3
+ * mono, scrolls horizontally instead of wrapping. Uses --ld-outline, not
4
+ * --ld-border — border here is a glass-only token (translucent white) and
5
+ * would be invisible on this opaque surface; outline is this theme's own
6
+ * "hairline on opaque surfaces" token. */
7
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-pre {
8
+ margin: 0;
9
+ padding: var(--ld-space-3) var(--ld-space-4);
10
+ background: var(--ld-surface-sunken);
11
+ border: 1px solid var(--ld-outline);
12
+ border-radius: var(--ld-radius);
13
+ font-family: var(--ld-font-mono);
14
+ font-size: var(--ld-text-sm);
15
+ overflow-x: auto;
16
+ }
@@ -0,0 +1,43 @@
1
+ /* summer-cloud — progress bar & spinner: glowing violet indicators */
2
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-progress {
3
+ display: block;
4
+ width: 100%;
5
+ height: 0.5rem;
6
+ background: var(--ld-bg-blend);
7
+ border-radius: var(--ld-radius-pill);
8
+ overflow: hidden;
9
+ }
10
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-progress__bar {
11
+ height: 100%;
12
+ background: var(--ld-primary);
13
+ border-radius: var(--ld-radius-pill);
14
+ box-shadow: 0 0 10px rgba(69, 0, 217, 0.5);
15
+ transition: width var(--ld-transition);
16
+ }
17
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-progress__bar--accent {
18
+ background: var(--ld-accent);
19
+ box-shadow: 0 0 10px rgba(12, 179, 255, 0.5);
20
+ }
21
+
22
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-spinner {
23
+ display: inline-block;
24
+ width: 1.5rem;
25
+ height: 1.5rem;
26
+ border: 2px solid var(--ld-outline);
27
+ border-top-color: var(--ld-primary);
28
+ border-radius: 50%;
29
+ animation: ld-sc-spin 0.8s linear infinite;
30
+ }
31
+ @keyframes ld-sc-spin {
32
+ to {
33
+ transform: rotate(360deg);
34
+ }
35
+ }
36
+ @media (prefers-reduced-motion: reduce) {
37
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-spinner {
38
+ animation-duration: 2s;
39
+ }
40
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-progress__bar {
41
+ transition: none;
42
+ }
43
+ }
@@ -0,0 +1,34 @@
1
+ /* summer-cloud — table: mono header labels, sky-tint row hover */
2
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).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="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-table th {
9
+ padding: var(--ld-space-3);
10
+ border-bottom: 1px solid var(--ld-outline);
11
+ color: var(--ld-faint);
12
+ text-align: left;
13
+ text-transform: uppercase;
14
+ font-family: var(--ld-font-mono);
15
+ font-size: 12px;
16
+ font-weight: 500;
17
+ letter-spacing: var(--ld-tracking-wide);
18
+ }
19
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-table td {
20
+ padding: var(--ld-space-3);
21
+ border-bottom: 1px solid rgba(201, 195, 218, 0.4);
22
+ }
23
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-table tbody tr {
24
+ transition: background var(--ld-transition);
25
+ }
26
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-table tbody tr:hover {
27
+ background: var(--ld-sky-tint);
28
+ }
29
+ /* Numeric cells take the mono voice — prices and data read as utility-grade. */
30
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-table td.ld-num,
31
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-table th.ld-num {
32
+ font-family: var(--ld-font-mono);
33
+ text-align: right;
34
+ }
@@ -0,0 +1,38 @@
1
+ /* summer-cloud — tabs: violet underline on the active tab, sky tint on hover */
2
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-tabs {
3
+ display: flex;
4
+ gap: var(--ld-space-2);
5
+ border-bottom: 1px solid var(--ld-outline);
6
+ }
7
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).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
+ border-radius: var(--ld-radius-sm) var(--ld-radius-sm) 0 0;
14
+ color: var(--ld-faint);
15
+ font-family: var(--ld-font-display);
16
+ font-weight: var(--ld-font-weight-medium);
17
+ font-size: var(--ld-text-sm);
18
+ cursor: pointer;
19
+ transition: color var(--ld-transition), background var(--ld-transition),
20
+ border-color var(--ld-transition);
21
+ }
22
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-tab:hover {
23
+ background: var(--ld-sky-tint);
24
+ color: var(--ld-primary);
25
+ }
26
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-tab:focus-visible {
27
+ outline: none;
28
+ box-shadow: 0 0 0 4px var(--ld-accent-glow);
29
+ }
30
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-tab--active,
31
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-tab[aria-selected="true"] {
32
+ color: var(--ld-primary);
33
+ border-bottom-color: var(--ld-primary);
34
+ font-weight: var(--ld-font-weight-bold);
35
+ }
36
+ :where([data-ld-style="summer-cloud"], [data-ld-style="summer-cloud"] *).ld-tabpanel {
37
+ padding: var(--ld-space-3) 0;
38
+ }
@@ -0,0 +1,137 @@
1
+ # summer-cloud
2
+
3
+ Light, airy, high-velocity retail aesthetic — "Airy Energetic." Frosted white
4
+ glass floating on a sky gradient, with a vivid violet doing all the work of
5
+ emphasis. Where neon-butterfly is a command console, summer-cloud is a summer
6
+ storefront: weightless, optimistic, effortless. Nothing sits flat on the page;
7
+ everything hovers.
8
+
9
+ Derived from the Stitch project *Summer Cloud UI System*
10
+ (`15973631330153907862`): Style Guide, Components Showcase, Retail Dashboard.
11
+
12
+ ## Color
13
+
14
+ | Role | Value | Usage |
15
+ | --- | --- | --- |
16
+ | Background | `#f6fafe` → `#c9e6ff` | Sky gradient at 135°, `fixed`. Apply via `.ld-bg` |
17
+ | Surface | `#ffffff` | Dialogs and fully opaque panels |
18
+ | Surface sunken | `#f0f4f8` | Inset form fields |
19
+ | Surface glass | `rgba(255,255,255,0.6)` + 12px blur | Cards, alerts (Level 1) |
20
+ | Surface glass high | `rgba(255,255,255,0.8)` + 20px blur | Floating/hover cards, modals (Level 2) |
21
+ | On-surface | `#171c1f` | Body text |
22
+ | Faint | `#484457` | Secondary text, labels, idle nav |
23
+ | Primary | `#4500d9` (violet) | Headings, CTAs, active states, prices, progress |
24
+ | Primary bright | `#5d2bff` | Shadow/glow tint and primary hover fill |
25
+ | Accent | `#0cb3ff` (sky blue) | Focus rings, secondary path, info — the interactive signal |
26
+ | Accent deep | `#006492` | Accent as *text* (the bright sky blue fails contrast) |
27
+ | Info | `#0cb3ff` | Informational callouts and badges |
28
+ | Success | `#30e330` | Switch "on" state — deliberately vibrant, the one high-energy pop |
29
+ | Warning | `#f2c025` | Caution states, "New" badges |
30
+ | Danger | `#ff4d4d` (retail red) | Errors, "Sale" badges, alert rules — carries dark text, never white |
31
+ | Danger deep | `#cc1f1f` | Danger where white text sits on it (destructive buttons) |
32
+ | Border | `rgba(255,255,255,0.4)` | Glass edges — the highlight that makes glass read as glass |
33
+ | Outline | `#c9c3da` | Hairlines on opaque surfaces (chips, table rules, checkboxes) |
34
+ | Sky tint | `rgba(255,255,255,0.7)` | Hover wash on ghost/nav elements |
35
+
36
+ Rules: the violet is the only loud color and carries emphasis alone — resting UI
37
+ is faint grey on white glass. Sky blue means "you can interact with this"
38
+ (focus, secondary actions, info). Never use pure black; never use a grey shadow.
39
+ The gradient is not decoration — on a flat white page the glass has nothing to
40
+ be glass against, and the theme collapses.
41
+
42
+ ## Typography
43
+
44
+ Three voices, per the project's design system:
45
+
46
+ - **Display & headings:** Plus Jakarta Sans (600/700/800), letter-spacing
47
+ `-0.02em` at display sizes — friendly rounded terminals, tucked in tight.
48
+ - **Body:** Inter 400, 16px/24px. Sentence case, always.
49
+ - **Data & labels:** JetBrains Mono 500, 12px, tracking `0.05em`. Field labels,
50
+ badges, table headers, prices, metadata. This is the "utility-grade"
51
+ counterweight to the soft headings. Uppercase for badges and table headers
52
+ (furniture); sentence case for field labels, which people read as words.
53
+
54
+ Interactive text (buttons, links, tabs) is Plus Jakarta Sans 600 at 14px,
55
+ sentence case. Uppercase never appears outside the mono voice.
56
+
57
+ The three webfonts are not bundled; include the Google Fonts links or self-host.
58
+ Every stack falls back to a system family.
59
+
60
+ ## Shape & effects
61
+
62
+ - Radius `1rem` (16px) for cards, panels, and fields; **pills**
63
+ (`--ld-radius-pill`) for every button, badge, and chip; `0.25rem` minimum
64
+ anywhere else. Never 0.
65
+ - Depth is **blur + tinted shadow**, never grey drop shadows. Shadows are tinted
66
+ with `#5d2bff`: `0 20px 40px rgba(93,43,255,0.08)` at rest,
67
+ `0 4px 14px rgba(93,43,255,0.39)` for raised CTAs.
68
+ - Two elevation tiers only — Level 1 glass (0.6 white / 12px blur) for content,
69
+ Level 2 (0.8 white / 20px blur + lift) for interactive and floating things.
70
+ - **Bouncy, not linear.** Buttons scale to 1.03 on hover and 0.95 on press with
71
+ `cubic-bezier(0.34,1.56,0.64,1)`; floating cards translate `-4px`.
72
+ - Focus is a 4px sky-blue ring (`0 0 0 4px rgba(12,179,255,0.2)`), never an
73
+ outline suppression without a replacement.
74
+ - Spacing is strictly multiples of 8px. When in doubt, add 8.
75
+ - Respect `prefers-reduced-motion` — every transform is dropped.
76
+
77
+ ## Components
78
+
79
+ Class prefix `ld-` (shared across themes so `@lepid-labs/ui-react` stays
80
+ theme-agnostic). Variants use BEM-ish modifiers (`ld-btn--primary`).
81
+
82
+ - **Card** `.ld-card` — glass panel; `--floating` adds the Level 2 hover lift.
83
+ - **NavLink** `.ld-link` — pill, sky-tint wash, `→` slides 4px on hover;
84
+ `--active` / `[aria-current=page]` becomes the violet underline rule.
85
+ - **Button** `.ld-btn` — glass by default; `--primary` (solid violet CTA, one
86
+ per view), `--accent` (sky-edged glass), `--ghost`, `--danger`. `--sm` is a
87
+ compact size scaled to `.ld-badge`, for inline/table-row actions; the pill
88
+ shape is kept.
89
+ - **Form** `.ld-input`, `.ld-textarea`, `.ld-select`, `.ld-label`, `.ld-field`,
90
+ `.ld-checkbox`, `.ld-radio`, `.ld-switch`, `.ld-choice` — sunken fields, no
91
+ resting border, sky-blue ring on focus. The switch is the oversized
92
+ "cloud-toggle": squishy, and green when live.
93
+ - **Badge** `.ld-badge` + semantic modifiers — solid pills, mono uppercase.
94
+ **Chip** `.ld-chip` — outlined filter chip; `--selected` fills violet.
95
+ - **Alert** `.ld-alert` — glass card with a 4px semantic left rule.
96
+ - **Dialog** `.ld-dialog` — native `<dialog>`, opaque white, blurred backdrop.
97
+ - **Tabs** `.ld-tabs`/`.ld-tab`/`.ld-tabpanel` — violet underline when active.
98
+ - **Table** `.ld-table` — mono uppercase headers, sky-tint row hover; add
99
+ `.ld-num` to numeric cells for the mono/right-aligned treatment.
100
+ - **Progress** `.ld-progress`, **Spinner** `.ld-spinner` — glowing violet.
101
+ - **Muted text** `.ld-muted` — faint secondary/empty-state text;
102
+ `color: var(--ld-faint)`, italic — a friendly, soft touch consistent with
103
+ the theme's airy, optimistic voice.
104
+ - **Pre / log block** `.ld-pre` — command/log `<pre>`; sunken background,
105
+ `--ld-outline` hairline (not `--ld-border`, which is the glass-only token
106
+ and would be invisible on this opaque surface), radius, small mono,
107
+ horizontal scroll.
108
+
109
+ ## Deviations from the Stitch source
110
+
111
+ - The generated screens flattened all three type voices to Plus Jakarta Sans.
112
+ This theme follows the project's written design system instead (Inter body,
113
+ JetBrains Mono labels), which is the richer and intended spec.
114
+ - The project's stored theme carried an earlier palette (near-black primary
115
+ `#01020e`, lavender secondary `#7248ae`). The rendered screens — all three,
116
+ in agreement — use violet `#4500d9` and sky blue `#0cb3ff`. This theme
117
+ matches the screens, since that is what Summer Cloud actually looks like.
118
+ - Tabs, table, dialog, and spinner do not appear in the source screens; they are
119
+ extrapolated from the rules above to complete the `ld-*` inventory.
120
+ - The source screens set white text on retail red (`#ff4d4d`), which is 3.27:1 —
121
+ below AA at badge and button sizes. This theme keeps the vivid red and puts
122
+ dark text on it (4.97:1), and uses `--ld-danger-deep` for the solid
123
+ destructive button (5.55:1 on white). Every other foreground/background pair
124
+ in the palette clears AA.
125
+
126
+ ## Code syntax
127
+
128
+ Tokens `--ld-code-*`, part of the baseline contract. Palette hues deepened for
129
+ contrast on white: violet keywords, deep-green strings, deep-amber numbers,
130
+ accent-deep functions, deep-teal types, danger-deep variables, muted-faint
131
+ comments, faint meta.
132
+
133
+ ## Scoping
134
+
135
+ Every rule is guarded by `data-ld-style="summer-cloud"` (self or ancestor),
136
+ wrapped in zero-specificity `:where()`. Set the attribute on `<html>` for a
137
+ page or on a container for an embedded island.
@@ -0,0 +1,15 @@
1
+ /* summer-cloud — 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";
14
+ @import "./components/muted.css";
15
+ @import "./components/pre.css";
@@ -0,0 +1,93 @@
1
+ /* summer-cloud — design tokens
2
+ * Source of truth for the summer-cloud theme. Consume via:
3
+ * @import "@lepid-labs/styles/summer-cloud/tokens";
4
+ * or pull the whole theme with ./index.css.
5
+ *
6
+ * Nothing applies until an element carries data-ld-style="summer-cloud"
7
+ * — set it on <html> for a page, or on any container for an embedded island.
8
+ * The :where() keeps specificity at zero, so any consumer rule overrides.
9
+ *
10
+ * Every theme declares the same baseline token set (styles/test enforces
11
+ * parity); names marked (extra) are additions beyond it that only this
12
+ * theme's own component CSS may rely on.
13
+ */
14
+ :where([data-ld-style="summer-cloud"]) {
15
+ color-scheme: light;
16
+
17
+ /* color */
18
+ --ld-bg: #f6fafe;
19
+ --ld-bg-blend: #eaeef2;
20
+ --ld-surface: #ffffff;
21
+ --ld-surface-sunken: #f0f4f8; /* inset fields */
22
+ --ld-surface-glass: rgba(255, 255, 255, 0.6);
23
+ --ld-surface-glass-high: rgba(255, 255, 255, 0.8); /* (extra) floating tier */
24
+ --ld-on-surface: #171c1f;
25
+ --ld-faint: #484457;
26
+ --ld-primary: #4500d9;
27
+ --ld-primary-bright: #5d2bff; /* (extra) shadow/glow tint */
28
+ --ld-primary-glow: rgba(93, 43, 255, 0.4);
29
+ --ld-primary-border: rgba(69, 0, 217, 0.2);
30
+ --ld-on-primary: #ffffff; /* text on solid violet fills */
31
+ --ld-accent: #0cb3ff;
32
+ --ld-accent-glow: rgba(12, 179, 255, 0.2);
33
+ --ld-accent-deep: #006492; /* (extra) readable accent text */
34
+ --ld-border: rgba(255, 255, 255, 0.4);
35
+ --ld-border-lit: rgba(255, 255, 255, 0.7); /* lit top edge of glass panes */
36
+ --ld-outline: #c9c3da; /* (extra) hairline on opaque surfaces */
37
+
38
+ /* semantic color */
39
+ --ld-info: #0cb3ff;
40
+ --ld-success: #30e330;
41
+ --ld-warning: #f2c025;
42
+ --ld-danger: #ff4d4d;
43
+ --ld-danger-deep: #cc1f1f; /* (extra) danger where white text sits on it */
44
+
45
+ /* sky gradient (extra) */
46
+ --ld-sky-start: #f0f4f8;
47
+ --ld-sky-end: #c9e6ff;
48
+ --ld-sky-tint: rgba(255, 255, 255, 0.7);
49
+
50
+ /* code syntax — deepened palette hues for contrast on white */
51
+ --ld-code-keyword: #4500d9;
52
+ --ld-code-string: #157a2a;
53
+ --ld-code-number: #9a6b00;
54
+ --ld-code-comment: #6e6880;
55
+ --ld-code-function: #006492;
56
+ --ld-code-variable: #cc1f1f;
57
+ --ld-code-type: #00877a;
58
+ --ld-code-meta: #484457;
59
+
60
+ /* typography */
61
+ --ld-font-display: "Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;
62
+ --ld-font-body: "Inter", ui-sans-serif, system-ui, sans-serif;
63
+ --ld-font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
64
+ --ld-font-weight: 400;
65
+ --ld-font-weight-medium: 600;
66
+ --ld-font-weight-bold: 700;
67
+ --ld-text-sm: 14px;
68
+ --ld-tracking-wide: 0.05em;
69
+ --ld-tracking-tight: -0.02em; /* (extra) display sizes */
70
+
71
+ /* shape & effects */
72
+ --ld-radius: 1rem;
73
+ --ld-radius-sm: 0.25rem; /* (extra) */
74
+ --ld-radius-lg: 1.5rem; /* cards and large containers */
75
+ --ld-radius-pill: 9999px; /* (extra) */
76
+ --ld-blur: 12px;
77
+ --ld-blur-high: 20px; /* (extra) */
78
+ --ld-transition: 0.3s;
79
+ --ld-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); /* (extra) */
80
+
81
+ /* elevation (extra) — tinted with the primary, never grey */
82
+ --ld-shadow: 0 20px 40px rgba(93, 43, 255, 0.08);
83
+ --ld-shadow-soft: 0 10px 30px rgba(0, 100, 146, 0.05);
84
+ --ld-shadow-raised: 0 4px 14px rgba(93, 43, 255, 0.39);
85
+ --ld-shadow-raised-hover: 0 6px 20px rgba(93, 43, 255, 0.5);
86
+
87
+ /* spacing */
88
+ --ld-space-1: 0.25rem;
89
+ --ld-space-2: 0.5rem;
90
+ --ld-space-3: 1rem;
91
+ --ld-space-4: 1.5rem;
92
+ --ld-space-5: 2rem;
93
+ }