@ryanhelsing/ry-ui 1.0.13 → 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.
Files changed (34) hide show
  1. package/.claude/skills/ry-ui-builder/SKILL.md +4 -6
  2. package/README.md +21 -25
  3. package/dist/components/ry-dropdown.d.ts +1 -1
  4. package/dist/components/ry-heading.d.ts +15 -0
  5. package/dist/components/ry-heading.d.ts.map +1 -0
  6. package/dist/components/ry-logo-bar.d.ts +25 -0
  7. package/dist/components/ry-logo-bar.d.ts.map +1 -0
  8. package/dist/components/ry-modal.d.ts +1 -1
  9. package/dist/components/ry-pricing.d.ts +4 -4
  10. package/dist/components/ry-pricing.d.ts.map +1 -1
  11. package/dist/components/ry-search-list.d.ts +30 -0
  12. package/dist/components/ry-search-list.d.ts.map +1 -0
  13. package/dist/components/ry-stat.d.ts +1 -4
  14. package/dist/components/ry-stat.d.ts.map +1 -1
  15. package/dist/components/ry-testimonial.d.ts +2 -5
  16. package/dist/components/ry-testimonial.d.ts.map +1 -1
  17. package/dist/components/ry-theme-panel.d.ts +1 -1
  18. package/dist/components/ry-theme-panel.d.ts.map +1 -1
  19. package/dist/core/ry-transform.d.ts.map +1 -1
  20. package/dist/css/ry-structure.css +555 -30
  21. package/dist/css/ry-theme.css +252 -41
  22. package/dist/css/ry-tokens.css +165 -100
  23. package/dist/css/ry-ui.css +977 -176
  24. package/dist/pages/components.html +19 -82
  25. package/dist/pages/landing.html +13 -40
  26. package/dist/ry-ui.d.ts +3 -1
  27. package/dist/ry-ui.d.ts.map +1 -1
  28. package/dist/ry-ui.js +945 -656
  29. package/dist/ry-ui.js.map +1 -1
  30. package/dist/themes/ocean.css +22 -22
  31. package/docs/components/dropdown.md +2 -2
  32. package/docs/components/modal.md +2 -2
  33. package/package.json +3 -1
  34. package/docs/components/button-group.md +0 -36
@@ -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
  ═══════════════════════════════════════════════════════════════ */
@@ -118,11 +158,14 @@ ry-nav a {
118
158
  color: var(--ry-color-text-muted);
119
159
  font-size: var(--ry-text-sm);
120
160
  font-weight: var(--ry-font-medium);
121
- transition: color var(--ry-duration-fast) var(--ry-ease);
161
+ border-radius: var(--ry-radius-md);
162
+ transition: color var(--ry-duration-fast) var(--ry-ease),
163
+ background-color var(--ry-duration-fast) var(--ry-ease);
122
164
  }
123
165
 
124
166
  ry-nav a:hover {
125
167
  color: var(--ry-color-text);
168
+ background-color: var(--ry-color-hover-overlay);
126
169
  }
127
170
 
128
171
  ry-nav a[aria-current="page"] {
@@ -173,7 +216,7 @@ ry-split [data-ry-target="handle"]:focus-visible::after {
173
216
  BUTTONS
174
217
  ═══════════════════════════════════════════════════════════════ */
175
218
 
176
- :is(.ry-btn, ry-button) {
219
+ :is(:where(.ry-btn), ry-button) {
177
220
  font-family: var(--ry-font-sans);
178
221
  font-size: var(--ry-text-sm);
179
222
  font-weight: var(--ry-font-medium);
@@ -190,93 +233,88 @@ ry-split [data-ry-target="handle"]:focus-visible::after {
190
233
  transition-timing-function: var(--ry-ease);
191
234
  }
192
235
 
193
- :is(.ry-btn, ry-button):hover {
236
+ :is(:where(.ry-btn), ry-button):hover {
194
237
  background-color: var(--ry-color-primary-hover);
195
238
  }
196
239
 
197
- :is(.ry-btn, ry-button):active {
240
+ :is(:where(.ry-btn), ry-button):active {
198
241
  background-color: var(--ry-color-primary-active);
199
242
  }
200
243
 
201
- :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]) {
202
245
  opacity: 0.5;
203
246
  }
204
247
 
205
248
  /* Button variants */
206
- :is(.ry-btn--secondary, ry-button[variant="secondary"]) {
249
+ :is(:where(.ry-btn--secondary), ry-button[variant="secondary"]) {
207
250
  background-color: var(--ry-color-secondary);
208
251
  }
209
- :is(.ry-btn--secondary, ry-button[variant="secondary"]):hover {
252
+ :is(:where(.ry-btn--secondary), ry-button[variant="secondary"]):hover {
210
253
  background-color: var(--ry-color-secondary-hover);
211
254
  }
212
255
 
213
- :is(.ry-btn--outline, ry-button[variant="outline"]) {
256
+ :is(:where(.ry-btn--outline), ry-button[variant="outline"]) {
214
257
  background-color: transparent;
215
258
  color: var(--ry-color-primary);
216
259
  border-color: var(--ry-color-primary);
217
260
  }
218
- :is(.ry-btn--outline, ry-button[variant="outline"]):hover {
261
+ :is(:where(.ry-btn--outline), ry-button[variant="outline"]):hover {
219
262
  background-color: var(--ry-color-primary);
220
263
  color: var(--ry-color-text-inverse);
221
264
  }
222
265
 
223
- :is(.ry-btn--ghost, ry-button[variant="ghost"]) {
266
+ :is(:where(.ry-btn--ghost), ry-button[variant="ghost"]) {
224
267
  background-color: transparent;
225
268
  color: var(--ry-color-text);
226
269
  }
227
- :is(.ry-btn--ghost, ry-button[variant="ghost"]):hover {
270
+ :is(:where(.ry-btn--ghost), ry-button[variant="ghost"]):hover {
228
271
  background-color: var(--ry-color-bg-muted);
229
272
  }
230
273
 
231
- :is(.ry-btn--danger, ry-button[variant="danger"]) {
274
+ :is(:where(.ry-btn--danger), ry-button[variant="danger"]) {
232
275
  background-color: var(--ry-color-danger);
233
276
  }
234
- :is(.ry-btn--danger, ry-button[variant="danger"]):hover {
277
+ :is(:where(.ry-btn--danger), ry-button[variant="danger"]):hover {
235
278
  background-color: var(--ry-color-danger-hover);
236
279
  }
237
280
 
238
- :is(.ry-btn--accent, ry-button[variant="accent"]) {
281
+ :is(:where(.ry-btn--accent), ry-button[variant="accent"]) {
239
282
  background-color: var(--ry-color-accent);
240
283
  }
241
- :is(.ry-btn--accent, ry-button[variant="accent"]):hover {
284
+ :is(:where(.ry-btn--accent), ry-button[variant="accent"]):hover {
242
285
  background-color: var(--ry-color-accent-hover);
243
286
  }
244
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
+
245
300
  /* Pressed/active toggle state */
246
- :is(.ry-btn[aria-pressed="true"], ry-button[pressed]) {
301
+ :is(:where(.ry-btn[aria-pressed="true"]), ry-button[pressed]) {
247
302
  background-color: var(--ry-color-primary);
248
303
  color: var(--ry-color-text-inverse);
249
304
  border-color: var(--ry-color-primary);
250
305
  }
251
- :is(.ry-btn[aria-pressed="true"], ry-button[pressed]):hover {
306
+ :is(:where(.ry-btn[aria-pressed="true"]), ry-button[pressed]):hover {
252
307
  background-color: var(--ry-color-primary-hover);
253
308
  border-color: var(--ry-color-primary-hover);
254
309
  }
255
310
 
256
- /* ═══════════════════════════════════════════════════════════════
257
- BUTTON GROUP
258
- ═══════════════════════════════════════════════════════════════ */
259
-
260
- ry-button-group {
261
- background-color: var(--ry-color-bg-muted);
262
- }
263
-
264
- ry-button-group > :is(ry-button, ry-toggle-button) {
265
- border-color: transparent;
266
- background-color: transparent;
267
- color: var(--ry-color-text-muted);
268
- }
269
-
270
- ry-button-group > :is(ry-button, ry-toggle-button):hover:not([pressed]) {
271
- color: var(--ry-color-text);
272
- }
273
311
 
274
312
  /* Button sizes (typography only - padding is structural) */
275
- :is(.ry-btn--sm, ry-button[size="sm"]) {
313
+ :is(:where(.ry-btn--sm), ry-button[size="sm"]) {
276
314
  font-size: var(--ry-text-xs);
277
315
  }
278
316
 
279
- :is(.ry-btn--lg, ry-button[size="lg"]) {
317
+ :is(:where(.ry-btn--lg), ry-button[size="lg"]) {
280
318
  font-size: var(--ry-text-base);
281
319
  }
282
320
 
@@ -725,6 +763,10 @@ ry-card p {
725
763
  color: var(--ry-color-text-muted);
726
764
  }
727
765
 
766
+ ry-card > img:first-child {
767
+ border-radius: var(--ry-radius-md);
768
+ }
769
+
728
770
  /* ═══════════════════════════════════════════════════════════════
729
771
  BADGES
730
772
  ═══════════════════════════════════════════════════════════════ */
@@ -802,7 +844,7 @@ ry-badge[style*="--ry-badge-color"] {
802
844
  color: var(--ry-color-danger-text);
803
845
  }
804
846
 
805
- :is(.ry-alert__title, ry-alert [slot="title"]) {
847
+ .ry-alert__title {
806
848
  font-weight: var(--ry-font-semibold);
807
849
  }
808
850
 
@@ -2146,13 +2188,13 @@ ry-pricing-card h3 {
2146
2188
  color: var(--ry-color-text);
2147
2189
  }
2148
2190
 
2149
- ry-pricing-card [slot="price"] {
2191
+ .ry-pricing-card__price {
2150
2192
  font-size: var(--ry-text-4xl);
2151
2193
  font-weight: var(--ry-font-bold);
2152
2194
  color: var(--ry-color-text);
2153
2195
  }
2154
2196
 
2155
- ry-pricing-card [slot="price"] span {
2197
+ .ry-pricing-card__price span {
2156
2198
  font-size: var(--ry-text-base);
2157
2199
  font-weight: var(--ry-font-normal);
2158
2200
  color: var(--ry-color-text-muted);
@@ -2322,18 +2364,34 @@ ry-combobox[data-ry-state="open"] .ry-combobox__input-wrapper {
2322
2364
  LOGO BAR
2323
2365
  ═══════════════════════════════════════════════════════════════ */
2324
2366
 
2325
- .ry-logo-bar p {
2367
+ ry-logo-bar > p {
2326
2368
  color: var(--ry-color-text-muted);
2327
2369
  font-size: var(--ry-text-sm);
2370
+ font-family: var(--ry-font-sans);
2328
2371
  text-transform: uppercase;
2329
2372
  letter-spacing: 0.1em;
2330
2373
  }
2331
2374
 
2332
- .ry-logo-bar span {
2375
+ ry-logo-bar span {
2333
2376
  font-size: var(--ry-text-2xl);
2334
2377
  font-weight: var(--ry-font-bold);
2378
+ font-family: var(--ry-font-sans);
2335
2379
  color: var(--ry-color-text);
2336
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;
2337
2395
  }
2338
2396
 
2339
2397
  /* ═══════════════════════════════════════════════════════════════
@@ -2377,6 +2435,28 @@ ry-combobox[data-ry-state="open"] .ry-combobox__input-wrapper {
2377
2435
  ═══════════════════════════════════════════════════════════════ */
2378
2436
 
2379
2437
  [data-ry-theme="none"] {
2438
+ /* Strictly black and white */
2439
+ --ry-color-primary: light-dark(#000000, #ffffff);
2440
+ --ry-color-primary-hover: light-dark(#333333, #cccccc);
2441
+ --ry-color-primary-active: light-dark(#555555, #aaaaaa);
2442
+ --ry-color-secondary: light-dark(#000000, #ffffff);
2443
+ --ry-color-secondary-hover: light-dark(#333333, #cccccc);
2444
+ --ry-color-secondary-active: light-dark(#555555, #aaaaaa);
2445
+ --ry-color-accent: light-dark(#000000, #ffffff);
2446
+ --ry-color-accent-hover: light-dark(#333333, #cccccc);
2447
+ --ry-color-accent-active: light-dark(#555555, #aaaaaa);
2448
+ --ry-color-text: light-dark(#000000, #ffffff);
2449
+ --ry-color-text-muted: light-dark(#666666, #999999);
2450
+ --ry-color-text-inverse: light-dark(#ffffff, #000000);
2451
+ --ry-color-bg: light-dark(#ffffff, #000000);
2452
+ --ry-color-bg-subtle: light-dark(#f5f5f5, #0a0a0a);
2453
+ --ry-color-bg-muted: light-dark(#eeeeee, #111111);
2454
+ --ry-color-border: light-dark(#dddddd, #333333);
2455
+ --ry-color-border-strong: light-dark(#999999, #666666);
2456
+ --ry-color-overlay: light-dark(rgba(255,255,255,0.95), rgba(0,0,0,0.95));
2457
+ --ry-color-hover-overlay: light-dark(rgba(0,0,0,0.04), rgba(255,255,255,0.06));
2458
+ --ry-focus-ring: light-dark(0 0 0 3px rgba(0,0,0,0.3), 0 0 0 3px rgba(255,255,255,0.3));
2459
+ /* No radii, no shadows */
2380
2460
  --ry-radius-sm: 0;
2381
2461
  --ry-radius-md: 0;
2382
2462
  --ry-radius-lg: 0;
@@ -2422,4 +2502,135 @@ ry-combobox[data-ry-state="open"] .ry-combobox__input-wrapper {
2422
2502
  color: var(--ry-color-text-inverse);
2423
2503
  }
2424
2504
 
2505
+ /* ═══════════════════════════════════════════════════════════════
2506
+ HEADING
2507
+ ═══════════════════════════════════════════════════════════════ */
2508
+
2509
+ .ry-heading__title {
2510
+ font-size: var(--ry-text-2xl);
2511
+ font-weight: var(--ry-font-bold);
2512
+ line-height: var(--ry-leading-tight);
2513
+ color: var(--ry-color-text);
2514
+ }
2515
+
2516
+ .ry-heading__sub {
2517
+ font-size: var(--ry-text-base);
2518
+ line-height: var(--ry-leading-normal);
2519
+ color: var(--ry-color-text-muted);
2520
+ }
2521
+
2522
+ /* Size: sm */
2523
+ ry-heading[size="sm"] .ry-heading__title {
2524
+ font-size: var(--ry-text-lg);
2525
+ }
2526
+
2527
+ ry-heading[size="sm"] .ry-heading__sub {
2528
+ font-size: var(--ry-text-sm);
2529
+ }
2530
+
2531
+ /* Size: lg */
2532
+ ry-heading[size="lg"] .ry-heading__title {
2533
+ font-size: var(--ry-text-4xl);
2534
+ }
2535
+
2536
+ ry-heading[size="lg"] .ry-heading__sub {
2537
+ font-size: var(--ry-text-lg);
2538
+ }
2539
+
2540
+ /* Divider variant */
2541
+ ry-heading[divider] {
2542
+ border-bottom: var(--ry-border-width) solid var(--ry-color-border);
2543
+ }
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
+
2425
2636
  } /* @layer ry-theme */