@ryanhelsing/ry-ui 1.0.14 → 1.0.15

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.
@@ -16,6 +16,46 @@ html {
16
16
  background-color: var(--ry-color-bg);
17
17
  }
18
18
 
19
+ /* ═══════════════════════════════════════════════════════════════
20
+ SECTION — INVERTED
21
+ ═══════════════════════════════════════════════════════════════ */
22
+
23
+ ry-section[inverted] {
24
+ background-color: var(--ry-color-text);
25
+ color: var(--ry-color-bg);
26
+ border-radius: var(--ry-radius-lg);
27
+ }
28
+
29
+ ry-section[inverted] :is(h1, h2, h3, h4, p, span, a) {
30
+ color: inherit;
31
+ }
32
+
33
+ ry-section[inverted] p {
34
+ opacity: 0.7;
35
+ }
36
+
37
+ /* ═══════════════════════════════════════════════════════════════
38
+ FOOTER — INVERTED
39
+ ═══════════════════════════════════════════════════════════════ */
40
+
41
+ ry-footer[inverted] {
42
+ background-color: var(--ry-color-text);
43
+ color: var(--ry-color-bg);
44
+ }
45
+
46
+ ry-footer[inverted] :is(a, strong, p, span, nav) {
47
+ color: inherit;
48
+ }
49
+
50
+ ry-footer[inverted] a {
51
+ opacity: 0.7;
52
+ transition: opacity var(--ry-duration-fast);
53
+ }
54
+
55
+ ry-footer[inverted] a:hover {
56
+ opacity: 1;
57
+ }
58
+
19
59
  /* ═══════════════════════════════════════════════════════════════
20
60
  FOCUS STYLES
21
61
  ═══════════════════════════════════════════════════════════════ */
@@ -176,7 +216,7 @@ ry-split [data-ry-target="handle"]:focus-visible::after {
176
216
  BUTTONS
177
217
  ═══════════════════════════════════════════════════════════════ */
178
218
 
179
- :is(.ry-btn, ry-button) {
219
+ :is(:where(.ry-btn), ry-button) {
180
220
  font-family: var(--ry-font-sans);
181
221
  font-size: var(--ry-text-sm);
182
222
  font-weight: var(--ry-font-medium);
@@ -193,93 +233,88 @@ ry-split [data-ry-target="handle"]:focus-visible::after {
193
233
  transition-timing-function: var(--ry-ease);
194
234
  }
195
235
 
196
- :is(.ry-btn, ry-button):hover {
236
+ :is(:where(.ry-btn), ry-button):hover {
197
237
  background-color: var(--ry-color-primary-hover);
198
238
  }
199
239
 
200
- :is(.ry-btn, ry-button):active {
240
+ :is(:where(.ry-btn), ry-button):active {
201
241
  background-color: var(--ry-color-primary-active);
202
242
  }
203
243
 
204
- :is(.ry-btn:disabled, .ry-btn[aria-disabled="true"], ry-button[disabled]) {
244
+ :is(:where(.ry-btn:disabled, .ry-btn[aria-disabled="true"]), ry-button[disabled]) {
205
245
  opacity: 0.5;
206
246
  }
207
247
 
208
248
  /* Button variants */
209
- :is(.ry-btn--secondary, ry-button[variant="secondary"]) {
249
+ :is(:where(.ry-btn--secondary), ry-button[variant="secondary"]) {
210
250
  background-color: var(--ry-color-secondary);
211
251
  }
212
- :is(.ry-btn--secondary, ry-button[variant="secondary"]):hover {
252
+ :is(:where(.ry-btn--secondary), ry-button[variant="secondary"]):hover {
213
253
  background-color: var(--ry-color-secondary-hover);
214
254
  }
215
255
 
216
- :is(.ry-btn--outline, ry-button[variant="outline"]) {
256
+ :is(:where(.ry-btn--outline), ry-button[variant="outline"]) {
217
257
  background-color: transparent;
218
258
  color: var(--ry-color-primary);
219
259
  border-color: var(--ry-color-primary);
220
260
  }
221
- :is(.ry-btn--outline, ry-button[variant="outline"]):hover {
261
+ :is(:where(.ry-btn--outline), ry-button[variant="outline"]):hover {
222
262
  background-color: var(--ry-color-primary);
223
263
  color: var(--ry-color-text-inverse);
224
264
  }
225
265
 
226
- :is(.ry-btn--ghost, ry-button[variant="ghost"]) {
266
+ :is(:where(.ry-btn--ghost), ry-button[variant="ghost"]) {
227
267
  background-color: transparent;
228
268
  color: var(--ry-color-text);
229
269
  }
230
- :is(.ry-btn--ghost, ry-button[variant="ghost"]):hover {
270
+ :is(:where(.ry-btn--ghost), ry-button[variant="ghost"]):hover {
231
271
  background-color: var(--ry-color-bg-muted);
232
272
  }
233
273
 
234
- :is(.ry-btn--danger, ry-button[variant="danger"]) {
274
+ :is(:where(.ry-btn--danger), ry-button[variant="danger"]) {
235
275
  background-color: var(--ry-color-danger);
236
276
  }
237
- :is(.ry-btn--danger, ry-button[variant="danger"]):hover {
277
+ :is(:where(.ry-btn--danger), ry-button[variant="danger"]):hover {
238
278
  background-color: var(--ry-color-danger-hover);
239
279
  }
240
280
 
241
- :is(.ry-btn--accent, ry-button[variant="accent"]) {
281
+ :is(:where(.ry-btn--accent), ry-button[variant="accent"]) {
242
282
  background-color: var(--ry-color-accent);
243
283
  }
244
- :is(.ry-btn--accent, ry-button[variant="accent"]):hover {
284
+ :is(:where(.ry-btn--accent), ry-button[variant="accent"]):hover {
245
285
  background-color: var(--ry-color-accent-hover);
246
286
  }
247
287
 
288
+ /* Link variant — inline text link */
289
+ :is(:where(.ry-btn--link), ry-button[variant="link"]) {
290
+ background: none;
291
+ color: var(--ry-color-primary);
292
+ font-weight: var(--ry-font-semibold);
293
+ text-decoration: none;
294
+ border: none;
295
+ }
296
+ :is(:where(.ry-btn--link), ry-button[variant="link"]):hover {
297
+ text-decoration: underline;
298
+ }
299
+
248
300
  /* Pressed/active toggle state */
249
- :is(.ry-btn[aria-pressed="true"], ry-button[pressed]) {
301
+ :is(:where(.ry-btn[aria-pressed="true"]), ry-button[pressed]) {
250
302
  background-color: var(--ry-color-primary);
251
303
  color: var(--ry-color-text-inverse);
252
304
  border-color: var(--ry-color-primary);
253
305
  }
254
- :is(.ry-btn[aria-pressed="true"], ry-button[pressed]):hover {
306
+ :is(:where(.ry-btn[aria-pressed="true"]), ry-button[pressed]):hover {
255
307
  background-color: var(--ry-color-primary-hover);
256
308
  border-color: var(--ry-color-primary-hover);
257
309
  }
258
310
 
259
- /* ═══════════════════════════════════════════════════════════════
260
- BUTTON GROUP
261
- ═══════════════════════════════════════════════════════════════ */
262
-
263
- ry-button-group {
264
- background-color: var(--ry-color-bg-muted);
265
- }
266
-
267
- ry-button-group > :is(ry-button, ry-toggle-button) {
268
- border-color: transparent;
269
- background-color: transparent;
270
- color: var(--ry-color-text-muted);
271
- }
272
-
273
- ry-button-group > :is(ry-button, ry-toggle-button):hover:not([pressed]) {
274
- color: var(--ry-color-text);
275
- }
276
311
 
277
312
  /* Button sizes (typography only - padding is structural) */
278
- :is(.ry-btn--sm, ry-button[size="sm"]) {
313
+ :is(:where(.ry-btn--sm), ry-button[size="sm"]) {
279
314
  font-size: var(--ry-text-xs);
280
315
  }
281
316
 
282
- :is(.ry-btn--lg, ry-button[size="lg"]) {
317
+ :is(:where(.ry-btn--lg), ry-button[size="lg"]) {
283
318
  font-size: var(--ry-text-base);
284
319
  }
285
320
 
@@ -728,6 +763,10 @@ ry-card p {
728
763
  color: var(--ry-color-text-muted);
729
764
  }
730
765
 
766
+ ry-card > img:first-child {
767
+ border-radius: var(--ry-radius-md);
768
+ }
769
+
731
770
  /* ═══════════════════════════════════════════════════════════════
732
771
  BADGES
733
772
  ═══════════════════════════════════════════════════════════════ */
@@ -805,7 +844,7 @@ ry-badge[style*="--ry-badge-color"] {
805
844
  color: var(--ry-color-danger-text);
806
845
  }
807
846
 
808
- :is(.ry-alert__title, ry-alert [slot="title"]) {
847
+ .ry-alert__title {
809
848
  font-weight: var(--ry-font-semibold);
810
849
  }
811
850
 
@@ -2149,13 +2188,13 @@ ry-pricing-card h3 {
2149
2188
  color: var(--ry-color-text);
2150
2189
  }
2151
2190
 
2152
- ry-pricing-card [slot="price"] {
2191
+ .ry-pricing-card__price {
2153
2192
  font-size: var(--ry-text-4xl);
2154
2193
  font-weight: var(--ry-font-bold);
2155
2194
  color: var(--ry-color-text);
2156
2195
  }
2157
2196
 
2158
- ry-pricing-card [slot="price"] span {
2197
+ .ry-pricing-card__price span {
2159
2198
  font-size: var(--ry-text-base);
2160
2199
  font-weight: var(--ry-font-normal);
2161
2200
  color: var(--ry-color-text-muted);
@@ -2325,18 +2364,34 @@ ry-combobox[data-ry-state="open"] .ry-combobox__input-wrapper {
2325
2364
  LOGO BAR
2326
2365
  ═══════════════════════════════════════════════════════════════ */
2327
2366
 
2328
- .ry-logo-bar p {
2367
+ ry-logo-bar > p {
2329
2368
  color: var(--ry-color-text-muted);
2330
2369
  font-size: var(--ry-text-sm);
2370
+ font-family: var(--ry-font-sans);
2331
2371
  text-transform: uppercase;
2332
2372
  letter-spacing: 0.1em;
2333
2373
  }
2334
2374
 
2335
- .ry-logo-bar span {
2375
+ ry-logo-bar span {
2336
2376
  font-size: var(--ry-text-2xl);
2337
2377
  font-weight: var(--ry-font-bold);
2378
+ font-family: var(--ry-font-sans);
2338
2379
  color: var(--ry-color-text);
2339
2380
  opacity: 0.5;
2381
+ transition: opacity var(--ry-duration-fast) var(--ry-ease);
2382
+ }
2383
+
2384
+ ry-logo-bar span:hover {
2385
+ opacity: 0.8;
2386
+ }
2387
+
2388
+ ry-logo-bar img {
2389
+ opacity: 0.5;
2390
+ transition: opacity var(--ry-duration-fast) var(--ry-ease);
2391
+ }
2392
+
2393
+ ry-logo-bar img:hover {
2394
+ opacity: 0.8;
2340
2395
  }
2341
2396
 
2342
2397
  /* ═══════════════════════════════════════════════════════════════
@@ -2487,4 +2542,95 @@ ry-heading[divider] {
2487
2542
  border-bottom: var(--ry-border-width) solid var(--ry-color-border);
2488
2543
  }
2489
2544
 
2545
+ /* ═══════════════════════════════════════════════════════════════
2546
+ SEARCH LIST
2547
+ ═══════════════════════════════════════════════════════════════ */
2548
+
2549
+ .ry-search-list__search {
2550
+ background-color: var(--ry-color-bg);
2551
+ border-bottom: var(--ry-border-width) solid var(--ry-color-border);
2552
+ }
2553
+
2554
+ .ry-search-list__input {
2555
+ font-family: var(--ry-font-sans);
2556
+ font-size: var(--ry-text-sm);
2557
+ color: var(--ry-color-text);
2558
+ }
2559
+
2560
+ .ry-search-list__input::placeholder {
2561
+ color: var(--ry-color-text-muted);
2562
+ }
2563
+
2564
+ .ry-search-list__item {
2565
+ font-size: var(--ry-text-sm);
2566
+ color: var(--ry-color-text);
2567
+ border-radius: var(--ry-radius-md);
2568
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
2569
+ }
2570
+
2571
+ .ry-search-list__item[data-highlighted] {
2572
+ background-color: var(--ry-color-bg-muted);
2573
+ }
2574
+
2575
+ .ry-search-list__item[aria-selected="true"] {
2576
+ background-color: var(--ry-color-primary);
2577
+ color: var(--ry-color-text-inverse);
2578
+ }
2579
+
2580
+ .ry-search-list__item[aria-selected="true"][data-highlighted] {
2581
+ background-color: var(--ry-color-primary-hover);
2582
+ }
2583
+
2584
+ .ry-search-list__group-header {
2585
+ font-family: var(--ry-font-sans);
2586
+ font-weight: 600;
2587
+ color: var(--ry-color-text-muted);
2588
+ }
2589
+
2590
+ .ry-search-list__empty {
2591
+ font-size: var(--ry-text-sm);
2592
+ color: var(--ry-color-text-muted);
2593
+ }
2594
+
2595
+ .ry-search-list__item mark {
2596
+ background-color: transparent;
2597
+ color: var(--ry-color-primary);
2598
+ font-weight: 600;
2599
+ }
2600
+
2601
+ .ry-search-list__item[aria-selected="true"] mark {
2602
+ color: inherit;
2603
+ text-decoration: underline;
2604
+ }
2605
+
2606
+ /* ═══════════════════════════════════════════════════════════════
2607
+ UTILITIES
2608
+ ═══════════════════════════════════════════════════════════════ */
2609
+
2610
+ .ry-eyebrow {
2611
+ text-transform: uppercase;
2612
+ letter-spacing: 0.1em;
2613
+ font-weight: var(--ry-font-semibold);
2614
+ font-size: var(--ry-text-sm);
2615
+ color: var(--ry-color-text-muted);
2616
+ }
2617
+
2618
+ .ry-avatar {
2619
+ border-radius: var(--ry-radius-full);
2620
+ object-fit: cover;
2621
+ }
2622
+
2623
+ .ry-bg-subtle {
2624
+ background-color: var(--ry-color-bg-subtle);
2625
+ }
2626
+
2627
+ .ry-bg-inverted {
2628
+ background-color: var(--ry-color-text);
2629
+ color: var(--ry-color-bg);
2630
+ }
2631
+
2632
+ .ry-bg-inverted p {
2633
+ opacity: 0.7;
2634
+ }
2635
+
2490
2636
  } /* @layer ry-theme */
@@ -106,13 +106,13 @@
106
106
  --ry-color-hover-overlay: color-mix(in oklch, var(--ry-color-text) 4%, transparent);
107
107
 
108
108
  /* Semantic backgrounds & text — derived from base semantic colors */
109
- --ry-color-info-bg: color-mix(in oklch, var(--ry-color-info) 12%, var(--ry-color-bg));
109
+ --ry-color-info-bg: color-mix(in srgb, var(--ry-color-info) 12%, var(--ry-color-bg));
110
110
  --ry-color-info-text: color-mix(in oklch, var(--ry-color-info) 70%, var(--ry-color-text));
111
- --ry-color-success-bg: color-mix(in oklch, var(--ry-color-success) 12%, var(--ry-color-bg));
111
+ --ry-color-success-bg: color-mix(in srgb, var(--ry-color-success) 12%, var(--ry-color-bg));
112
112
  --ry-color-success-text: color-mix(in oklch, var(--ry-color-success) 70%, var(--ry-color-text));
113
- --ry-color-warning-bg: color-mix(in oklch, var(--ry-color-warning) 12%, var(--ry-color-bg));
113
+ --ry-color-warning-bg: color-mix(in srgb, var(--ry-color-warning) 12%, var(--ry-color-bg));
114
114
  --ry-color-warning-text: color-mix(in oklch, var(--ry-color-warning) 70%, var(--ry-color-text));
115
- --ry-color-danger-bg: color-mix(in oklch, var(--ry-color-danger) 12%, var(--ry-color-bg));
115
+ --ry-color-danger-bg: color-mix(in srgb, var(--ry-color-danger) 12%, var(--ry-color-bg));
116
116
  --ry-color-danger-text: color-mix(in oklch, var(--ry-color-danger) 70%, var(--ry-color-text));
117
117
 
118
118
  /* ═══════════════════════════════════════════════════════════════