@ryanhelsing/ry-ui 1.0.8 → 1.0.10

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 (41) hide show
  1. package/.claude/skills/ry-ui-builder/SKILL.md +186 -0
  2. package/AGENT.md +3 -1
  3. package/README.md +16 -2
  4. package/dist/_redirects +1 -0
  5. package/dist/app.d.ts +2 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/components/ry-testimonial.d.ts +19 -0
  8. package/dist/components/ry-testimonial.d.ts.map +1 -0
  9. package/dist/components/ry-theme-panel.d.ts +25 -0
  10. package/dist/components/ry-theme-panel.d.ts.map +1 -0
  11. package/dist/core/ry-icons.d.ts.map +1 -1
  12. package/dist/core/ry-transform.d.ts.map +1 -1
  13. package/dist/css/ry-structure.css +123 -3
  14. package/dist/css/ry-theme.css +141 -2
  15. package/dist/css/ry-tokens.css +4 -26
  16. package/dist/css/ry-ui.css +268 -31
  17. package/dist/pages/components.html +1827 -0
  18. package/dist/pages/landing.html +229 -0
  19. package/dist/ry-ui.d.ts +2 -0
  20. package/dist/ry-ui.d.ts.map +1 -1
  21. package/dist/ry-ui.js +382 -245
  22. package/dist/ry-ui.js.map +1 -1
  23. package/docs/components/forms.md +10 -3
  24. package/examples/starter-local.html +252 -0
  25. package/examples/starter-minimal.html +252 -0
  26. package/examples/themes/skeuomorphic/css-dark-neon-led-volume-dial/LICENSE.txt +21 -0
  27. package/examples/themes/skeuomorphic/css-dark-neon-led-volume-dial/README.md +7 -0
  28. package/examples/themes/skeuomorphic/css-dark-neon-led-volume-dial/dist/index.html +23 -0
  29. package/examples/themes/skeuomorphic/css-dark-neon-led-volume-dial/dist/style.css +126 -0
  30. package/examples/themes/skeuomorphic/css-dark-neon-led-volume-dial/src/index.html +5 -0
  31. package/examples/themes/skeuomorphic/css-dark-neon-led-volume-dial/src/style.scss +161 -0
  32. package/examples/themes/skeuomorphic/led-controls/LICENSE.txt +21 -0
  33. package/examples/themes/skeuomorphic/led-controls/README.md +7 -0
  34. package/examples/themes/skeuomorphic/led-controls/dist/index.html +17 -0
  35. package/examples/themes/skeuomorphic/led-controls/dist/script.js +27 -0
  36. package/examples/themes/skeuomorphic/led-controls/dist/style.css +135 -0
  37. package/examples/themes/skeuomorphic/led-controls/src/index.html +1 -0
  38. package/examples/themes/skeuomorphic/led-controls/src/script.ts +59 -0
  39. package/examples/themes/skeuomorphic/led-controls/src/style.scss +253 -0
  40. package/llms.txt +346 -0
  41. package/package.json +12 -4
package/dist/ry-ui.js CHANGED
@@ -89,7 +89,7 @@ class u extends HTMLElement {
89
89
  this.on(t, "keydown", a), i?.focus();
90
90
  }
91
91
  }
92
- const H = [
92
+ const B = [
93
93
  // Layout
94
94
  "page",
95
95
  "header",
@@ -148,13 +148,15 @@ const H = [
148
148
  "pricing",
149
149
  "pricing-card",
150
150
  "carousel",
151
- "combobox"
152
- ], B = new RegExp(
153
- `<(/?)(${H.join("|")})(\\s|>|/)`,
151
+ "combobox",
152
+ "theme-panel",
153
+ "testimonial"
154
+ ], R = new RegExp(
155
+ `<(/?)(${B.join("|")})(\\s|>|/)`,
154
156
  "g"
155
157
  );
156
158
  function M(h) {
157
- return h.replace(B, "<$1ry-$2$3");
159
+ return h.replace(R, "<$1ry-$2$3");
158
160
  }
159
161
  function C() {
160
162
  document.querySelectorAll("ry").forEach((h) => {
@@ -166,7 +168,7 @@ function C() {
166
168
  });
167
169
  }
168
170
  document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", C) : C();
169
- class R extends u {
171
+ class P extends u {
170
172
  setup() {
171
173
  this.#t(), this.$$('[data-ry-target="trigger"]').forEach((t) => {
172
174
  this.on(t, "click", this.#i);
@@ -242,10 +244,10 @@ class R extends u {
242
244
  this.$$('[data-ry-target="item"]').forEach((t) => this.close(t));
243
245
  }
244
246
  }
245
- customElements.define("ry-accordion", R);
247
+ customElements.define("ry-accordion", P);
246
248
  customElements.get("ry-accordion-item") || customElements.define("ry-accordion-item", class extends HTMLElement {
247
249
  });
248
- class P extends u {
250
+ class F extends u {
249
251
  #t = null;
250
252
  #e = 0;
251
253
  setup() {
@@ -294,8 +296,8 @@ class P extends u {
294
296
  this.state === "open" ? this.close() : this.open();
295
297
  }
296
298
  }
297
- customElements.define("ry-modal", P);
298
- class F extends u {
299
+ customElements.define("ry-modal", F);
300
+ class j extends u {
299
301
  setup() {
300
302
  this.#t(), this.$$('[data-ry-target="trigger"]').forEach((t) => {
301
303
  this.on(t, "click", this.#i);
@@ -357,10 +359,10 @@ class F extends u {
357
359
  return this.$$('[data-ry-target="trigger"]').findIndex((e) => e.getAttribute("aria-selected") === "true");
358
360
  }
359
361
  }
360
- customElements.define("ry-tabs", F);
362
+ customElements.define("ry-tabs", j);
361
363
  customElements.get("ry-tab") || customElements.define("ry-tab", class extends HTMLElement {
362
364
  });
363
- class j extends u {
365
+ class O extends u {
364
366
  setup() {
365
367
  this.#t();
366
368
  const t = this.$('[data-ry-target="trigger"]');
@@ -408,12 +410,12 @@ class j extends u {
408
410
  this.state === "open" ? this.close() : this.open();
409
411
  }
410
412
  }
411
- customElements.define("ry-dropdown", j);
413
+ customElements.define("ry-dropdown", O);
412
414
  customElements.get("ry-menu") || customElements.define("ry-menu", class extends HTMLElement {
413
415
  });
414
416
  customElements.get("ry-menu-item") || customElements.define("ry-menu-item", class extends HTMLElement {
415
417
  });
416
- class O extends u {
418
+ class N extends u {
417
419
  setup() {
418
420
  this.hasAttribute("tabindex") || this.setAttribute("tabindex", "0"), this.setAttribute("role", "button"), this.on(this, "click", this.#t), this.on(this, "keydown", this.#e);
419
421
  }
@@ -428,8 +430,8 @@ class O extends u {
428
430
  (t.key === "Enter" || t.key === " ") && (t.preventDefault(), this.click());
429
431
  };
430
432
  }
431
- customElements.define("ry-button", O);
432
- class N extends u {
433
+ customElements.define("ry-button", N);
434
+ class q extends u {
433
435
  static get observedAttributes() {
434
436
  return ["value"];
435
437
  }
@@ -458,7 +460,7 @@ class N extends u {
458
460
  e.getAttribute("value") === t ? (e.setAttribute("pressed", ""), e.setAttribute("aria-pressed", "true")) : (e.removeAttribute("pressed"), e.removeAttribute("aria-pressed"));
459
461
  }
460
462
  }
461
- customElements.define("ry-button-group", N);
463
+ customElements.define("ry-button-group", q);
462
464
  class K extends u {
463
465
  #t = null;
464
466
  #e = !1;
@@ -481,12 +483,12 @@ class K extends u {
481
483
  const t = getComputedStyle(this).getPropertyValue("--ry-split-min-width").trim();
482
484
  return t ? parseFloat(t) : 100;
483
485
  }
484
- #l() {
486
+ #h() {
485
487
  const t = getComputedStyle(this).getPropertyValue("--ry-split-max-width").trim();
486
488
  return t ? parseFloat(t) : this.getBoundingClientRect().width * 0.8;
487
489
  }
488
- #h(t) {
489
- const e = this.#o(), s = this.#l(), i = Math.round(Math.max(e, Math.min(s, t)));
490
+ #l(t) {
491
+ const e = this.#o(), s = this.#h(), i = Math.round(Math.max(e, Math.min(s, t)));
490
492
  this.style.setProperty("--ry-split-width", `${i}px`);
491
493
  }
492
494
  #c = (t) => {
@@ -514,7 +516,7 @@ class K extends u {
514
516
  #d(t) {
515
517
  if (!this.#e) return;
516
518
  const e = this.#i - t;
517
- this.#h(this.#s + e);
519
+ this.#l(this.#s + e);
518
520
  }
519
521
  #m() {
520
522
  this.#e = !1, this.removeAttribute("data-ry-resizing"), document.body.style.cursor = "", document.body.style.userSelect = "", this.#u(), this.emit("resize", { width: this.#a() });
@@ -522,7 +524,7 @@ class K extends u {
522
524
  #f = (t) => {
523
525
  const e = t.shiftKey ? 50 : 10;
524
526
  let s = this.#a();
525
- t.key === "ArrowLeft" ? (t.preventDefault(), this.#h(s + e), this.#u()) : t.key === "ArrowRight" ? (t.preventDefault(), this.#h(s - e), this.#u()) : t.key === "Home" ? (t.preventDefault(), this.#h(this.#o()), this.#u()) : t.key === "End" && (t.preventDefault(), this.#h(this.#l()), this.#u());
527
+ t.key === "ArrowLeft" ? (t.preventDefault(), this.#l(s + e), this.#u()) : t.key === "ArrowRight" ? (t.preventDefault(), this.#l(s - e), this.#u()) : t.key === "Home" ? (t.preventDefault(), this.#l(this.#o()), this.#u()) : t.key === "End" && (t.preventDefault(), this.#l(this.#h()), this.#u());
526
528
  };
527
529
  #w = () => {
528
530
  this.style.removeProperty("--ry-split-width"), this.#v(), this.emit("resize", { width: this.#a() });
@@ -562,7 +564,7 @@ class K extends u {
562
564
  }
563
565
  }
564
566
  customElements.define("ry-split", K);
565
- class q extends u {
567
+ class z extends u {
566
568
  #t = ["light", "dark"];
567
569
  #e = 0;
568
570
  setup() {
@@ -602,8 +604,8 @@ class q extends u {
602
604
  }
603
605
  }
604
606
  }
605
- customElements.define("ry-theme-toggle", q);
606
- class z extends u {
607
+ customElements.define("ry-theme-toggle", z);
608
+ class V extends u {
607
609
  setup() {
608
610
  this.hasAttribute("interactive") && (this.hasAttribute("tabindex") || this.setAttribute("tabindex", "0"), this.setAttribute("role", "link"), this.on(this, "click", this.#t), this.on(this, "keydown", this.#e));
609
611
  }
@@ -616,8 +618,8 @@ class z extends u {
616
618
  (t.key === "Enter" || t.key === " ") && (t.preventDefault(), this.click());
617
619
  };
618
620
  }
619
- customElements.define("ry-card", z);
620
- class V extends u {
621
+ customElements.define("ry-card", V);
622
+ class U extends u {
621
623
  setup() {
622
624
  this.#t();
623
625
  const t = this.$("[close]");
@@ -637,8 +639,8 @@ class V extends u {
637
639
  }, 200), this.emit("close");
638
640
  }
639
641
  }
640
- customElements.define("ry-alert", V);
641
- class U extends u {
642
+ customElements.define("ry-alert", U);
643
+ class W extends u {
642
644
  static get observedAttributes() {
643
645
  return ["label", "error", "hint"];
644
646
  }
@@ -691,9 +693,9 @@ class U extends u {
691
693
  e && (e.textContent = t ?? "");
692
694
  }
693
695
  }
694
- customElements.define("ry-field", U);
695
- let W = 0;
696
- class Y extends u {
696
+ customElements.define("ry-field", W);
697
+ let Y = 0;
698
+ class X extends u {
697
699
  #t = null;
698
700
  static observedAttributes = ["checked", "disabled"];
699
701
  setup() {
@@ -701,7 +703,7 @@ class Y extends u {
701
703
  }
702
704
  #e() {
703
705
  if (this.$('[data-ry-target="track"]')) return;
704
- const t = `ry-switch-${++W}`, e = this.getAttribute("name") ?? "", s = this.hasAttribute("checked"), i = this.hasAttribute("disabled"), r = this.textContent?.trim() ?? "";
706
+ const t = `ry-switch-${++Y}`, e = this.getAttribute("name") ?? "", s = this.hasAttribute("checked"), i = this.hasAttribute("disabled"), r = this.textContent?.trim() ?? "";
705
707
  this.innerHTML = `
706
708
  <label data-ry-target="wrapper" class="ry-switch__wrapper" for="${t}">
707
709
  <input
@@ -746,16 +748,16 @@ class Y extends u {
746
748
  this.#t && (this.#t.value = t);
747
749
  }
748
750
  }
749
- customElements.define("ry-switch", Y);
750
- let X = 0;
751
- class G extends u {
751
+ customElements.define("ry-switch", X);
752
+ let G = 0;
753
+ class J extends u {
752
754
  #t = null;
753
755
  #e = null;
754
756
  #i = null;
755
757
  setup() {
756
- this.#i = `ry-tooltip-${++X}`, this.#s();
758
+ this.#i = `ry-tooltip-${++G}`, this.#s();
757
759
  const t = this.firstElementChild;
758
- t && (t.setAttribute("aria-describedby", this.#i), this.on(t, "mouseenter", this.#r), this.on(t, "mouseleave", this.#o), this.on(t, "focusin", this.#r), this.on(t, "focusout", this.#o)), this.on(document, "keydown", this.#l);
760
+ t && (t.setAttribute("aria-describedby", this.#i), this.on(t, "mouseenter", this.#r), this.on(t, "mouseleave", this.#o), this.on(t, "focusin", this.#r), this.on(t, "focusout", this.#o)), this.on(document, "keydown", this.#h);
759
761
  }
760
762
  #s() {
761
763
  this.#e = document.createElement("div"), this.#e.id = this.#i, this.#e.setAttribute("data-ry-target", "content"), this.#e.className = "ry-tooltip__content", this.#e.setAttribute("role", "tooltip"), this.#e.textContent = this.getAttribute("content") ?? "", this.appendChild(this.#e);
@@ -772,15 +774,15 @@ class G extends u {
772
774
  #o = () => {
773
775
  this.#t && (clearTimeout(this.#t), this.#t = null), this.state = "closed";
774
776
  };
775
- #l = (t) => {
777
+ #h = (t) => {
776
778
  t.key === "Escape" && this.state === "open" && this.#o();
777
779
  };
778
780
  teardown() {
779
781
  this.#t && clearTimeout(this.#t);
780
782
  }
781
783
  }
782
- customElements.define("ry-tooltip", G);
783
- class J extends u {
784
+ customElements.define("ry-tooltip", J);
785
+ class Z extends u {
784
786
  #t = null;
785
787
  #e = 0;
786
788
  setup() {
@@ -825,8 +827,8 @@ class J extends u {
825
827
  this.state === "open" ? this.close() : this.open();
826
828
  }
827
829
  }
828
- customElements.define("ry-drawer", J);
829
- const Z = 4e3;
830
+ customElements.define("ry-drawer", Z);
831
+ const Q = 4e3;
830
832
  class f extends u {
831
833
  #t = null;
832
834
  static observedAttributes = ["variant", "duration"];
@@ -856,7 +858,7 @@ class f extends u {
856
858
  this.#s();
857
859
  const t = this.$("[close]");
858
860
  t && this.on(t, "click", () => this.dismiss());
859
- const e = parseInt(this.getAttribute("duration") ?? String(Z), 10);
861
+ const e = parseInt(this.getAttribute("duration") ?? String(Q), 10);
860
862
  e > 0 && (this.#t = setTimeout(() => this.dismiss(), e)), requestAnimationFrame(() => {
861
863
  this.state = "visible";
862
864
  });
@@ -957,22 +959,24 @@ const k = {
957
959
  // Shape: circle
958
960
  "shape-circle": '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/></svg>',
959
961
  // Shape: ellipse
960
- "shape-ellipse": '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="12" rx="10" ry="6"/></svg>'
962
+ "shape-ellipse": '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="12" rx="10" ry="6"/></svg>',
963
+ // Quote
964
+ quote: '<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4.583 17.321C3.553 16.227 3 15 3 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311C9.591 11.69 11 13.17 11 15c0 1.933-1.567 3.5-3.5 3.5-1.073 0-2.099-.49-2.917-1.179zM14.583 17.321C13.553 16.227 13 15 13 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311C19.591 11.69 21 13.17 21 15c0 1.933-1.567 3.5-3.5 3.5-1.073 0-2.099-.49-2.917-1.179z"/></svg>'
961
965
  };
962
966
  function p(h) {
963
967
  return k[h] ?? "";
964
968
  }
965
- function Bt(h, t) {
969
+ function Ft(h, t) {
966
970
  k[h] = t;
967
971
  }
968
- function Rt(h) {
972
+ function jt(h) {
969
973
  Object.assign(k, h);
970
974
  }
971
- function Pt() {
975
+ function Ot() {
972
976
  return Object.keys(k);
973
977
  }
974
- let Q = 0;
975
- class tt extends u {
978
+ let tt = 0;
979
+ class et extends u {
976
980
  #t = null;
977
981
  #e = -1;
978
982
  #i = "";
@@ -985,7 +989,7 @@ class tt extends u {
985
989
  }
986
990
  static observedAttributes = ["value", "disabled"];
987
991
  setup() {
988
- this.#t = `ry-select-${++Q}`, this.#o(), this.hasAttribute("tabindex") || this.setAttribute("tabindex", "0"), this.on(this, "click", this.#l), this.on(this, "keydown", this.#h), this.on(document, "click", this.#c), this.#a && this.on(this, "ry:remove", this.#n), this.hasAttribute("data-ry-state") || (this.state = "closed");
992
+ this.#t = `ry-select-${++tt}`, this.#o(), this.hasAttribute("tabindex") || this.setAttribute("tabindex", "0"), this.on(this, "click", this.#h), this.on(this, "keydown", this.#l), this.on(document, "click", this.#c), this.#a && this.on(this, "ry:remove", this.#n), this.hasAttribute("data-ry-state") || (this.state = "closed");
989
993
  const t = this.getAttribute("value");
990
994
  if (t)
991
995
  if (this.#a)
@@ -1048,7 +1052,7 @@ class tt extends u {
1048
1052
  `;
1049
1053
  this._options = t;
1050
1054
  }
1051
- #l = (t) => {
1055
+ #h = (t) => {
1052
1056
  if (this.hasAttribute("disabled")) return;
1053
1057
  const e = t.target, s = e.closest('[data-ry-target="option"]');
1054
1058
  if (s instanceof HTMLElement && !s.hasAttribute("data-disabled")) {
@@ -1061,7 +1065,7 @@ class tt extends u {
1061
1065
  }
1062
1066
  e.closest('[data-ry-target="trigger"]') && this.toggle();
1063
1067
  };
1064
- #h = (t) => {
1068
+ #l = (t) => {
1065
1069
  if (this.hasAttribute("disabled")) return;
1066
1070
  const e = this.state === "open";
1067
1071
  switch (t.key) {
@@ -1208,7 +1212,7 @@ class tt extends u {
1208
1212
  if (this.state === "open") return;
1209
1213
  this.state = "open";
1210
1214
  const t = this.$('[data-ry-target="trigger"]');
1211
- if (t && t.setAttribute("aria-expanded", "true"), this.#I(), this.#a)
1215
+ if (t && t.setAttribute("aria-expanded", "true"), this.#D(), this.#a)
1212
1216
  this.#d(0);
1213
1217
  else {
1214
1218
  const e = this.getAttribute("value");
@@ -1220,7 +1224,7 @@ class tt extends u {
1220
1224
  }
1221
1225
  this.emit("open");
1222
1226
  }
1223
- #I() {
1227
+ #D() {
1224
1228
  const t = this.$('[data-ry-target="dropdown"]');
1225
1229
  if (!t) return;
1226
1230
  this.removeAttribute("data-ry-position");
@@ -1259,20 +1263,20 @@ class tt extends u {
1259
1263
  this.#s && clearTimeout(this.#s);
1260
1264
  }
1261
1265
  }
1262
- class et extends HTMLElement {
1266
+ class st extends HTMLElement {
1263
1267
  }
1264
- customElements.define("ry-option", et);
1265
- customElements.define("ry-select", tt);
1266
- let st = 0;
1267
- class it extends u {
1268
+ customElements.define("ry-option", st);
1269
+ customElements.define("ry-select", et);
1270
+ let it = 0;
1271
+ class rt extends u {
1268
1272
  #t = null;
1269
1273
  #e = -1;
1270
1274
  #i = [];
1271
1275
  static observedAttributes = ["value", "disabled"];
1272
1276
  setup() {
1273
- this.#t = `ry-combobox-${++st}`, this.#s();
1277
+ this.#t = `ry-combobox-${++it}`, this.#s();
1274
1278
  const t = this.$('[data-ry-target="input"]');
1275
- t && (this.on(t, "input", this.#r), this.on(t, "focus", this.#n)), this.on(this, "click", this.#o), this.on(this, "keydown", this.#l), this.on(this, "mouseover", this.#h), this.on(document, "click", this.#c), this.hasAttribute("data-ry-state") || (this.state = "closed");
1279
+ t && (this.on(t, "input", this.#r), this.on(t, "focus", this.#n)), this.on(this, "click", this.#o), this.on(this, "keydown", this.#h), this.on(this, "mouseover", this.#l), this.on(document, "click", this.#c), this.hasAttribute("data-ry-state") || (this.state = "closed");
1276
1280
  const e = this.getAttribute("value");
1277
1281
  e && (this.value = e);
1278
1282
  }
@@ -1356,7 +1360,7 @@ class it extends u {
1356
1360
  return;
1357
1361
  }
1358
1362
  };
1359
- #l = (t) => {
1363
+ #h = (t) => {
1360
1364
  if (this.hasAttribute("disabled")) return;
1361
1365
  const e = this.state === "open";
1362
1366
  switch (t.key) {
@@ -1383,7 +1387,7 @@ class it extends u {
1383
1387
  break;
1384
1388
  }
1385
1389
  };
1386
- #h = (t) => {
1390
+ #l = (t) => {
1387
1391
  const s = t.target.closest('[data-ry-target="option"]');
1388
1392
  if (!(s instanceof HTMLElement) || s.hasAttribute("data-disabled") || s.hasAttribute("hidden")) return;
1389
1393
  const r = this.$$(
@@ -1474,8 +1478,8 @@ class it extends u {
1474
1478
  e && this.#p(e);
1475
1479
  }
1476
1480
  }
1477
- customElements.define("ry-combobox", it);
1478
- class rt extends u {
1481
+ customElements.define("ry-combobox", rt);
1482
+ class at extends u {
1479
1483
  #t = "";
1480
1484
  static get observedAttributes() {
1481
1485
  return ["language", "title", "line-numbers"];
@@ -1522,7 +1526,7 @@ class rt extends u {
1522
1526
  case "html":
1523
1527
  return this.#o(t);
1524
1528
  case "json":
1525
- return this.#l(t);
1529
+ return this.#h(t);
1526
1530
  default:
1527
1531
  return this.#c(t);
1528
1532
  }
@@ -1587,7 +1591,7 @@ class rt extends u {
1587
1591
  const y = s[0];
1588
1592
  y && e.push({ type: "text", value: y }), s = s.slice(1);
1589
1593
  }
1590
- return e.map((i) => this.#h(i)).join("");
1594
+ return e.map((i) => this.#l(i)).join("");
1591
1595
  }
1592
1596
  #a(t) {
1593
1597
  const e = [];
@@ -1641,7 +1645,7 @@ class rt extends u {
1641
1645
  const c = s[0];
1642
1646
  c && e.push({ type: "text", value: c }), s = s.slice(1);
1643
1647
  }
1644
- return e.map((r) => this.#h(r)).join("");
1648
+ return e.map((r) => this.#l(r)).join("");
1645
1649
  }
1646
1650
  #o(t) {
1647
1651
  const e = [];
@@ -1687,9 +1691,9 @@ class rt extends u {
1687
1691
  const l = s[0];
1688
1692
  l && e.push({ type: "text", value: l }), s = s.slice(1);
1689
1693
  }
1690
- return e.map((i) => this.#h(i)).join("");
1694
+ return e.map((i) => this.#l(i)).join("");
1691
1695
  }
1692
- #l(t) {
1696
+ #h(t) {
1693
1697
  const e = [];
1694
1698
  let s = t;
1695
1699
  for (; s.length > 0; ) {
@@ -1721,9 +1725,9 @@ class rt extends u {
1721
1725
  const l = s[0];
1722
1726
  l && e.push({ type: "text", value: l }), s = s.slice(1);
1723
1727
  }
1724
- return e.map((i) => this.#h(i)).join("");
1728
+ return e.map((i) => this.#l(i)).join("");
1725
1729
  }
1726
- #h(t) {
1730
+ #l(t) {
1727
1731
  const e = this.#c(t.value);
1728
1732
  switch (t.type) {
1729
1733
  case "keyword":
@@ -1774,8 +1778,8 @@ class rt extends u {
1774
1778
  this.#t = t, this.#e();
1775
1779
  }
1776
1780
  }
1777
- customElements.define("ry-code", rt);
1778
- class at extends u {
1781
+ customElements.define("ry-code", at);
1782
+ class nt extends u {
1779
1783
  setup() {
1780
1784
  const t = this.$("template");
1781
1785
  if (!t) return;
@@ -1819,8 +1823,8 @@ class at extends u {
1819
1823
  `).trim();
1820
1824
  }
1821
1825
  }
1822
- customElements.define("ry-example", at);
1823
- class nt extends u {
1826
+ customElements.define("ry-example", nt);
1827
+ class ot extends u {
1824
1828
  static get observedAttributes() {
1825
1829
  return ["name", "size", "label"];
1826
1830
  }
@@ -1853,24 +1857,24 @@ class nt extends u {
1853
1857
  this.setAttribute("size", String(t));
1854
1858
  }
1855
1859
  }
1856
- customElements.define("ry-icon", nt);
1857
- const ot = ["form", "section", "fieldset", "ry-section"], m = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Set();
1858
- function ht(h) {
1860
+ customElements.define("ry-icon", ot);
1861
+ const ht = ["form", "section", "fieldset", "ry-section"], m = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Set();
1862
+ function lt(h) {
1859
1863
  let t = h.parentElement;
1860
1864
  for (; t; ) {
1861
- if (ot.some((e) => t.matches(e)))
1865
+ if (ht.some((e) => t.matches(e)))
1862
1866
  return t;
1863
1867
  t = t.parentElement;
1864
1868
  }
1865
1869
  return null;
1866
1870
  }
1867
- function lt(h) {
1871
+ function ct(h) {
1868
1872
  if (E.has(h)) return;
1869
1873
  const t = m.get(h);
1870
1874
  if (!t || t.size < 2) return;
1871
1875
  const e = /* @__PURE__ */ new Map();
1872
1876
  for (const s of t) {
1873
- const i = ht(s), r = e.get(i) ?? [];
1877
+ const i = lt(s), r = e.get(i) ?? [];
1874
1878
  r.push(s), e.set(i, r);
1875
1879
  }
1876
1880
  if (e.size > 1) {
@@ -1886,7 +1890,7 @@ function lt(h) {
1886
1890
  ), E.add(h);
1887
1891
  }
1888
1892
  }
1889
- class ct extends u {
1893
+ class dt extends u {
1890
1894
  static observedAttributes = ["pressed", "disabled", "name", "value"];
1891
1895
  #t = !1;
1892
1896
  setup() {
@@ -1897,7 +1901,7 @@ class ct extends u {
1897
1901
  }
1898
1902
  #e() {
1899
1903
  const t = this.name;
1900
- t && (m.has(t) || m.set(t, /* @__PURE__ */ new Set()), m.get(t).add(this), this.#t = !0, queueMicrotask(() => lt(t)));
1904
+ t && (m.has(t) || m.set(t, /* @__PURE__ */ new Set()), m.get(t).add(this), this.#t = !0, queueMicrotask(() => ct(t)));
1901
1905
  }
1902
1906
  #i() {
1903
1907
  if (!this.#t) return;
@@ -1958,8 +1962,8 @@ class ct extends u {
1958
1962
  this.setAttribute("icon", t);
1959
1963
  }
1960
1964
  }
1961
- customElements.define("ry-toggle-button", ct);
1962
- class dt extends u {
1965
+ customElements.define("ry-toggle-button", dt);
1966
+ class ut extends u {
1963
1967
  #t = !1;
1964
1968
  #e = null;
1965
1969
  #i = null;
@@ -1968,7 +1972,7 @@ class dt extends u {
1968
1972
  #a = /* @__PURE__ */ new Map();
1969
1973
  static observedAttributes = ["min", "max", "step", "value", "start", "end", "disabled"];
1970
1974
  setup() {
1971
- this.#o(), this.#h(), this.#b();
1975
+ this.#o(), this.#l(), this.#b();
1972
1976
  }
1973
1977
  #o() {
1974
1978
  const t = this.hasAttribute("range"), e = this.hasAttribute("labeled"), s = this.hasAttribute("tooltip");
@@ -1988,9 +1992,9 @@ class dt extends u {
1988
1992
  <div data-ry-target="thumb-value" class="ry-slider__thumb" tabindex="0" role="slider" aria-label="Value">
1989
1993
  ${s ? '<span data-ry-target="tooltip-value" class="ry-slider__tooltip"></span>' : ""}
1990
1994
  </div>
1991
- `, i += "</div>", e && (i += this.#l()), this.innerHTML = i, this.#i = this.$('[data-ry-target="track"]'), this.#s = this.$('[data-ry-target="fill"]'), t ? (this.#r.set("start", this.$('[data-ry-target="thumb-start"]')), this.#r.set("end", this.$('[data-ry-target="thumb-end"]')), s && (this.#a.set("start", this.$('[data-ry-target="tooltip-start"]')), this.#a.set("end", this.$('[data-ry-target="tooltip-end"]')))) : (this.#r.set("value", this.$('[data-ry-target="thumb-value"]')), s && this.#a.set("value", this.$('[data-ry-target="tooltip-value"]')));
1995
+ `, i += "</div>", e && (i += this.#h()), this.innerHTML = i, this.#i = this.$('[data-ry-target="track"]'), this.#s = this.$('[data-ry-target="fill"]'), t ? (this.#r.set("start", this.$('[data-ry-target="thumb-start"]')), this.#r.set("end", this.$('[data-ry-target="thumb-end"]')), s && (this.#a.set("start", this.$('[data-ry-target="tooltip-start"]')), this.#a.set("end", this.$('[data-ry-target="tooltip-end"]')))) : (this.#r.set("value", this.$('[data-ry-target="thumb-value"]')), s && this.#a.set("value", this.$('[data-ry-target="tooltip-value"]')));
1992
1996
  }
1993
- #l() {
1997
+ #h() {
1994
1998
  const t = this.min, e = this.max, s = this.getAttribute("labels")?.split(","), i = this.getAttribute("label-type") || "number";
1995
1999
  let r = [];
1996
2000
  if (s)
@@ -2011,7 +2015,7 @@ class dt extends u {
2011
2015
  </div>
2012
2016
  `;
2013
2017
  }
2014
- #h() {
2018
+ #l() {
2015
2019
  this.#i && this.on(this.#i, "pointerdown", this.#c);
2016
2020
  for (const [t, e] of this.#r)
2017
2021
  this.on(e, "pointerdown", (s) => this.#n(s, t)), this.on(e, "keydown", (s) => this.#m(s, t));
@@ -2164,8 +2168,8 @@ class dt extends u {
2164
2168
  t ? this.setAttribute("disabled", "") : this.removeAttribute("disabled");
2165
2169
  }
2166
2170
  }
2167
- customElements.define("ry-slider", dt);
2168
- class ut extends u {
2171
+ customElements.define("ry-slider", ut);
2172
+ class pt extends u {
2169
2173
  #t = !1;
2170
2174
  #e = 0;
2171
2175
  #i = 0;
@@ -2174,7 +2178,7 @@ class ut extends u {
2174
2178
  #a = null;
2175
2179
  static observedAttributes = ["min", "max", "step", "value", "disabled", "label", "labels", "description"];
2176
2180
  setup() {
2177
- this.#o(), this.#l(), this.#u();
2181
+ this.#o(), this.#h(), this.#u();
2178
2182
  }
2179
2183
  #o() {
2180
2184
  const t = this.getAttribute("label"), e = this.getAttribute("description"), s = e ? ` title="${e}"` : "";
@@ -2188,10 +2192,10 @@ class ut extends u {
2188
2192
  ${t ? `<span data-ry-target="label" class="ry-knob__label"${s}>${t}</span>` : ""}
2189
2193
  `, this.#s = this.$('[data-ry-target="ring"]'), this.#r = this.$('[data-ry-target="indicator"]'), this.#a = this.$('[data-ry-target="display"]');
2190
2194
  }
2191
- #l() {
2192
- this.#s && (this.on(this.#s, "mousedown", this.#h), this.on(document, "mousemove", this.#c), this.on(document, "mouseup", this.#n), this.on(this.#s, "touchstart", this.#p), this.on(document, "touchmove", this.#d), this.on(document, "touchend", this.#m), this.on(this.#s, "wheel", this.#f), this.on(this, "keydown", this.#w));
2195
+ #h() {
2196
+ this.#s && (this.on(this.#s, "mousedown", this.#l), this.on(document, "mousemove", this.#c), this.on(document, "mouseup", this.#n), this.on(this.#s, "touchstart", this.#p), this.on(document, "touchmove", this.#d), this.on(document, "touchend", this.#m), this.on(this.#s, "wheel", this.#f), this.on(this, "keydown", this.#w));
2193
2197
  }
2194
- #h = (t) => {
2198
+ #l = (t) => {
2195
2199
  this.disabled || (t.preventDefault(), this.#t = !0, this.#e = t.clientY, this.#i = this.value, this.#s?.classList.add("ry-knob__ring--dragging"), this.setAttribute("data-dragging", ""));
2196
2200
  };
2197
2201
  #c = (t) => {
@@ -2312,9 +2316,9 @@ class ut extends u {
2312
2316
  t ? this.setAttribute("disabled", "") : this.removeAttribute("disabled");
2313
2317
  }
2314
2318
  }
2315
- customElements.define("ry-knob", ut);
2319
+ customElements.define("ry-knob", pt);
2316
2320
  const S = 15, T = 3;
2317
- class pt extends u {
2321
+ class gt extends u {
2318
2322
  #t = null;
2319
2323
  #e = null;
2320
2324
  #i = null;
@@ -2322,8 +2326,8 @@ class pt extends u {
2322
2326
  #r = null;
2323
2327
  #a = !1;
2324
2328
  #o = 0;
2325
- #l = 0;
2326
2329
  #h = 0;
2330
+ #l = 0;
2327
2331
  #c = !1;
2328
2332
  #n = null;
2329
2333
  #p = null;
@@ -2364,7 +2368,7 @@ class pt extends u {
2364
2368
  t.preventDefault(), this.#g(-1);
2365
2369
  }), this.on(this.#s, "mouseup", () => this.#u()), this.on(this.#s, "mouseleave", () => this.#u())), this.#r && (this.on(this.#r, "mousedown", (t) => {
2366
2370
  t.preventDefault(), this.#g(1);
2367
- }), this.on(this.#r, "mouseup", () => this.#u()), this.on(this.#r, "mouseleave", () => this.#u())), this.#t && this.on(this.#t, "mousedown", this.#I), this.on(document, "mousemove", this.#Y), this.on(document, "mouseup", this.#C), this.#t && this.on(this.#t, "touchstart", this.#X), this.on(document, "touchmove", this.#G), this.on(document, "touchend", this.#K), this.#t && this.on(this.#t, "keydown", this.#q), this.on(this, "wheel", this.#J), this.#t && this.on(this.#t, "dblclick", () => this.#E()), this.#i && (this.on(this.#i, "blur", () => this.#z()), this.on(this.#i, "keydown", (t) => {
2371
+ }), this.on(this.#r, "mouseup", () => this.#u()), this.on(this.#r, "mouseleave", () => this.#u())), this.#t && this.on(this.#t, "mousedown", this.#D), this.on(document, "mousemove", this.#Y), this.on(document, "mouseup", this.#C), this.#t && this.on(this.#t, "touchstart", this.#X), this.on(document, "touchmove", this.#G), this.on(document, "touchend", this.#q), this.#t && this.on(this.#t, "keydown", this.#K), this.on(this, "wheel", this.#J), this.#t && this.on(this.#t, "dblclick", () => this.#E()), this.#i && (this.on(this.#i, "blur", () => this.#z()), this.on(this.#i, "keydown", (t) => {
2368
2372
  t.key === "Enter" && (t.preventDefault(), this.#z()), t.key === "Escape" && (t.preventDefault(), this.#P()), t.stopPropagation();
2369
2373
  }));
2370
2374
  }
@@ -2391,10 +2395,10 @@ class pt extends u {
2391
2395
  return e === "stacked" || e === "stacked-end" || e === "stacked-start" ? "y" : "x";
2392
2396
  }
2393
2397
  #v(t, e) {
2394
- return this.#b === "y" ? this.#l - e : t - this.#o;
2398
+ return this.#b === "y" ? this.#h - e : t - this.#o;
2395
2399
  }
2396
2400
  #y(t, e) {
2397
- return this.#b === "y" ? Math.abs(e - this.#l) : Math.abs(t - this.#o);
2401
+ return this.#b === "y" ? Math.abs(e - this.#h) : Math.abs(t - this.#o);
2398
2402
  }
2399
2403
  #M(t, e) {
2400
2404
  if (!this.#e) return;
@@ -2402,14 +2406,14 @@ class pt extends u {
2402
2406
  this.#e.style.transform = i === "y" ? `translateY(${-s}px)` : `translateX(${s}px)`;
2403
2407
  }
2404
2408
  #$(t, e, s) {
2405
- const i = this.#v(t, e), r = this.step || 1, a = s ? r * 10 : r, n = s ? S * 2 : S, o = Math.round(i / n), l = this.#h + o * a, c = i - o * n;
2409
+ const i = this.#v(t, e), r = this.step || 1, a = s ? r * 10 : r, n = s ? S * 2 : S, o = Math.round(i / n), l = this.#l + o * a, c = i - o * n;
2406
2410
  this.#M(c, n);
2407
2411
  const d = this.hasAttribute("wrap") ? this.#V(l) : this.#T(l), g = this.#F(d);
2408
2412
  g !== this.value && (this.value = g, this.#A(), this.#x());
2409
2413
  }
2410
2414
  // --- Mouse drag ---
2411
- #I = (t) => {
2412
- this.disabled || this.#c || this.#b === "none" || (t.preventDefault(), this.#a = !0, this.#o = t.clientX, this.#l = t.clientY, this.#h = this.value, this.setAttribute("data-dragging", ""));
2415
+ #D = (t) => {
2416
+ this.disabled || this.#c || this.#b === "none" || (t.preventDefault(), this.#a = !0, this.#o = t.clientX, this.#h = t.clientY, this.#l = this.value, this.setAttribute("data-dragging", ""));
2413
2417
  };
2414
2418
  #Y = (t) => {
2415
2419
  this.#a && this.#$(t.clientX, t.clientY, t.shiftKey);
@@ -2421,7 +2425,7 @@ class pt extends u {
2421
2425
  };
2422
2426
  // --- Touch drag ---
2423
2427
  #X = (t) => {
2424
- this.disabled || this.#c || this.#b === "none" || (t.preventDefault(), this.#a = !0, this.#o = t.touches[0]?.clientX ?? 0, this.#l = t.touches[0]?.clientY ?? 0, this.#h = this.value, this.setAttribute("data-dragging", ""));
2428
+ this.disabled || this.#c || this.#b === "none" || (t.preventDefault(), this.#a = !0, this.#o = t.touches[0]?.clientX ?? 0, this.#h = t.touches[0]?.clientY ?? 0, this.#l = this.value, this.setAttribute("data-dragging", ""));
2425
2429
  };
2426
2430
  #G = (t) => {
2427
2431
  if (!this.#a) return;
@@ -2429,11 +2433,11 @@ class pt extends u {
2429
2433
  const e = t.touches[0];
2430
2434
  e && this.#$(e.clientX, e.clientY, !1);
2431
2435
  };
2432
- #K = () => {
2436
+ #q = () => {
2433
2437
  this.#a && (this.#a = !1, this.removeAttribute("data-dragging"), this.#e && (this.#e.style.transform = ""), this.#_());
2434
2438
  };
2435
2439
  // --- Keyboard ---
2436
- #q = (t) => {
2440
+ #K = (t) => {
2437
2441
  if (this.disabled || this.#c) return;
2438
2442
  const e = this.step || 1, s = e * 10;
2439
2443
  let i = 0;
@@ -2574,7 +2578,7 @@ class pt extends u {
2574
2578
  this.#u();
2575
2579
  }
2576
2580
  }
2577
- customElements.define("ry-number-select", pt);
2581
+ customElements.define("ry-number-select", gt);
2578
2582
  function v(h) {
2579
2583
  const t = h.h / 360, e = h.s / 100, s = h.v / 100;
2580
2584
  let i = 0, r = 0, a = 0;
@@ -2635,7 +2639,7 @@ function L(h) {
2635
2639
  l: Math.round(s * 100)
2636
2640
  };
2637
2641
  }
2638
- function gt(h) {
2642
+ function ft(h) {
2639
2643
  const t = h.s / 100, e = h.l / 100, s = e + t * Math.min(e, 1 - e), i = s === 0 ? 0 : 2 * (1 - e / s);
2640
2644
  return {
2641
2645
  h: h.h,
@@ -2643,11 +2647,11 @@ function gt(h) {
2643
2647
  v: Math.round(s * 100)
2644
2648
  };
2645
2649
  }
2646
- function D(h) {
2650
+ function I(h) {
2647
2651
  const t = (e) => e.toString(16).padStart(2, "0");
2648
2652
  return `#${t(h.r)}${t(h.g)}${t(h.b)}`;
2649
2653
  }
2650
- function ft(h) {
2654
+ function bt(h) {
2651
2655
  const t = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h);
2652
2656
  if (!t) {
2653
2657
  const e = /^#?([a-f\d])([a-f\d])([a-f\d])$/i.exec(h);
@@ -2675,7 +2679,7 @@ function A(h) {
2675
2679
  }, n = parseInt(i[4], 16) / 255;
2676
2680
  return { hsv: $(a), alpha: Math.round(n * 100) };
2677
2681
  }
2678
- const r = ft(t);
2682
+ const r = bt(t);
2679
2683
  return r ? { hsv: $(r), alpha: 100 } : null;
2680
2684
  }
2681
2685
  const e = /^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)$/.exec(t);
@@ -2694,11 +2698,11 @@ function A(h) {
2694
2698
  s: parseFloat(s[2]),
2695
2699
  l: parseFloat(s[3])
2696
2700
  }, r = s[4] ? parseFloat(s[4]) * 100 : 100;
2697
- return { hsv: gt(i), alpha: r };
2701
+ return { hsv: ft(i), alpha: r };
2698
2702
  }
2699
2703
  return null;
2700
2704
  }
2701
- class bt extends u {
2705
+ class yt extends u {
2702
2706
  #t = 0;
2703
2707
  #e = 100;
2704
2708
  #i = 100;
@@ -2706,8 +2710,8 @@ class bt extends u {
2706
2710
  #r = !1;
2707
2711
  #a = !1;
2708
2712
  #o = !1;
2709
- #l = null;
2710
2713
  #h = null;
2714
+ #l = null;
2711
2715
  #c = null;
2712
2716
  #n = null;
2713
2717
  #p = null;
@@ -2760,10 +2764,10 @@ class bt extends u {
2760
2764
  <span data-ry-target="trigger-color" class="ry-color-picker__trigger-color"></span>
2761
2765
  </button>
2762
2766
  <div data-ry-target="panel" class="ry-color-picker__panel">${i}</div>
2763
- `, this.#l = this.$('[data-ry-target="trigger"]'), this.#h = this.$('[data-ry-target="panel"]'), this.#c = this.$('[data-ry-target="grid"]'), this.#n = this.$('[data-ry-target="grid-handle"]'), this.#p = this.$('[data-ry-target="hue-slider"]'), this.#d = this.$('[data-ry-target="hue-handle"]'), this.#m = this.$('[data-ry-target="alpha-slider"]'), this.#f = this.$('[data-ry-target="alpha-handle"]'), this.#w = this.$('[data-ry-target="preview"]'), this.#g = this.$('[data-ry-target="input"]');
2767
+ `, this.#h = this.$('[data-ry-target="trigger"]'), this.#l = this.$('[data-ry-target="panel"]'), this.#c = this.$('[data-ry-target="grid"]'), this.#n = this.$('[data-ry-target="grid-handle"]'), this.#p = this.$('[data-ry-target="hue-slider"]'), this.#d = this.$('[data-ry-target="hue-handle"]'), this.#m = this.$('[data-ry-target="alpha-slider"]'), this.#f = this.$('[data-ry-target="alpha-handle"]'), this.#w = this.$('[data-ry-target="preview"]'), this.#g = this.$('[data-ry-target="input"]');
2764
2768
  }
2765
2769
  #b() {
2766
- this.#l && this.on(this.#l, "click", this.#y), this.on(document, "click", this.#M), this.on(document, "keydown", this.#$), this.#c && this.on(this.#c, "pointerdown", this.#Y), this.#n && this.on(this.#n, "keydown", this.#X), this.#p && this.on(this.#p, "pointerdown", this.#G), this.#d && this.on(this.#d, "keydown", this.#q), this.#m && this.on(this.#m, "pointerdown", this.#J), this.#f && this.on(this.#f, "keydown", this.#z), this.on(document, "pointermove", this.#P), this.on(document, "pointerup", this.#R), this.#g && (this.on(this.#g, "change", this.#T), this.on(this.#g, "keydown", this.#V));
2770
+ this.#h && this.on(this.#h, "click", this.#y), this.on(document, "click", this.#M), this.on(document, "keydown", this.#$), this.#c && this.on(this.#c, "pointerdown", this.#Y), this.#n && this.on(this.#n, "keydown", this.#X), this.#p && this.on(this.#p, "pointerdown", this.#G), this.#d && this.on(this.#d, "keydown", this.#K), this.#m && this.on(this.#m, "pointerdown", this.#J), this.#f && this.on(this.#f, "keydown", this.#z), this.on(document, "pointermove", this.#P), this.on(document, "pointerup", this.#R), this.#g && (this.on(this.#g, "change", this.#T), this.on(this.#g, "keydown", this.#V));
2767
2771
  const t = this.$('[data-ry-target="format-toggle"]');
2768
2772
  t && this.on(t, "click", this.#F);
2769
2773
  const e = this.$('[data-ry-target="swatches"]');
@@ -2786,17 +2790,17 @@ class bt extends u {
2786
2790
  this.state === "open" && (this.contains(t.target) || this.close());
2787
2791
  };
2788
2792
  #$ = (t) => {
2789
- t.key === "Escape" && this.state === "open" && (this.close(), this.#l?.focus());
2793
+ t.key === "Escape" && this.state === "open" && (this.close(), this.#h?.focus());
2790
2794
  };
2791
2795
  open() {
2792
- this.hasAttribute("inline") || (this.#I(), this.state = "open");
2796
+ this.hasAttribute("inline") || (this.#D(), this.state = "open");
2793
2797
  }
2794
2798
  close() {
2795
2799
  this.hasAttribute("inline") || (this.state = "closed", this.removeAttribute("data-ry-position"));
2796
2800
  }
2797
- #I() {
2798
- if (!this.#h || !this.#l) return;
2799
- const t = this.#l.getBoundingClientRect(), e = 320, i = window.innerHeight - t.bottom, r = t.top;
2801
+ #D() {
2802
+ if (!this.#l || !this.#h) return;
2803
+ const t = this.#h.getBoundingClientRect(), e = 320, i = window.innerHeight - t.bottom, r = t.top;
2800
2804
  i < e && r > i ? this.setAttribute("data-ry-position", "top") : this.setAttribute("data-ry-position", "bottom");
2801
2805
  }
2802
2806
  // ───────────────────────────────────────────────────────────────────────────
@@ -2834,14 +2838,14 @@ class bt extends u {
2834
2838
  // Hue handlers
2835
2839
  // ───────────────────────────────────────────────────────────────────────────
2836
2840
  #G = (t) => {
2837
- this.disabled || (t.preventDefault(), this.#a = !0, this.#d?.focus(), this.#K(t));
2841
+ this.disabled || (t.preventDefault(), this.#a = !0, this.#d?.focus(), this.#q(t));
2838
2842
  };
2839
- #K(t) {
2843
+ #q(t) {
2840
2844
  if (!this.#p) return;
2841
2845
  const e = this.#p.getBoundingClientRect(), s = Math.max(0, Math.min(1, (t.clientX - e.left) / e.width));
2842
2846
  this.#t = Math.round(s * 360), this.#A(), this.#L();
2843
2847
  }
2844
- #q = (t) => {
2848
+ #K = (t) => {
2845
2849
  if (this.disabled) return;
2846
2850
  const e = t.shiftKey ? 10 : 1;
2847
2851
  let s = !1;
@@ -2888,7 +2892,7 @@ class bt extends u {
2888
2892
  // Pointer move/up
2889
2893
  // ───────────────────────────────────────────────────────────────────────────
2890
2894
  #P = (t) => {
2891
- this.#r ? this.#C(t) : this.#a ? this.#K(t) : this.#o && this.#E(t);
2895
+ this.#r ? this.#C(t) : this.#a ? this.#q(t) : this.#o && this.#E(t);
2892
2896
  };
2893
2897
  #R = () => {
2894
2898
  (this.#r || this.#a || this.#o) && (this.#r = !1, this.#a = !1, this.#o = !1, this.#k());
@@ -2974,7 +2978,7 @@ class bt extends u {
2974
2978
  const t = this.format, e = v({ h: this.#t, s: this.#e, v: this.#i }), s = this.hasAttribute("opacity");
2975
2979
  switch (t) {
2976
2980
  case "hex": {
2977
- const i = D(e);
2981
+ const i = I(e);
2978
2982
  if (s && this.#s < 100) {
2979
2983
  const r = Math.round(this.#s / 100 * 255).toString(16).padStart(2, "0");
2980
2984
  return i + r;
@@ -2988,7 +2992,7 @@ class bt extends u {
2988
2992
  return s ? `hsla(${i.h}, ${i.s}%, ${i.l}%, ${(this.#s / 100).toFixed(2)})` : `hsl(${i.h}, ${i.s}%, ${i.l}%)`;
2989
2993
  }
2990
2994
  default:
2991
- return D(e);
2995
+ return I(e);
2992
2996
  }
2993
2997
  }
2994
2998
  // ───────────────────────────────────────────────────────────────────────────
@@ -3059,8 +3063,8 @@ class bt extends u {
3059
3063
  return this.format = e, s;
3060
3064
  }
3061
3065
  }
3062
- customElements.define("ry-color-picker", bt);
3063
- class yt extends u {
3066
+ customElements.define("ry-color-picker", yt);
3067
+ class mt extends u {
3064
3068
  #t = null;
3065
3069
  #e = null;
3066
3070
  #i = null;
@@ -3099,15 +3103,15 @@ class yt extends u {
3099
3103
  `, this.#t = this.$('[data-ry-target="swatch"]'), this.#e = this.$('[data-ry-target="input"]'), this.#i = this.$('[data-ry-target="panel"]'), this.#s = this.$('[data-ry-target="picker"]');
3100
3104
  }
3101
3105
  #a() {
3102
- this.#t && this.on(this.#t, "click", this.#o), this.#e && (this.on(this.#e, "input", this.#h), this.on(this.#e, "keydown", this.#p), this.on(this.#e, "focus", this.#l)), this.#s && (this.on(this.#s, "ry:input", this.#d), this.on(this.#s, "ry:change", this.#m)), this.on(document, "click", this.#f), this.on(document, "keydown", this.#w);
3106
+ this.#t && this.on(this.#t, "click", this.#o), this.#e && (this.on(this.#e, "input", this.#l), this.on(this.#e, "keydown", this.#p), this.on(this.#e, "focus", this.#h)), this.#s && (this.on(this.#s, "ry:input", this.#d), this.on(this.#s, "ry:change", this.#m)), this.on(document, "click", this.#f), this.on(document, "keydown", this.#w);
3103
3107
  }
3104
3108
  #o = () => {
3105
3109
  this.disabled || (this.state === "open" ? this.close() : this.open());
3106
3110
  };
3107
- #l = () => {
3111
+ #h = () => {
3108
3112
  this.disabled || this.open();
3109
3113
  };
3110
- #h = () => {
3114
+ #l = () => {
3111
3115
  if (!this.#e || !this.#s) return;
3112
3116
  let t = this.#e.value;
3113
3117
  const e = this.#e.selectionStart ?? t.length, r = "#" + t.replace(/[^#a-fA-F0-9]/g, "").replace(/#/g, "").slice(0, 6);
@@ -3137,7 +3141,7 @@ class yt extends u {
3137
3141
  return !!(/^#[a-fA-F0-9]{6}$/.test(t) || /^#[a-fA-F0-9]{3}$/.test(t));
3138
3142
  }
3139
3143
  #p = (t) => {
3140
- t.key === "Enter" && (t.preventDefault(), this.#h(), this.emit("change", { value: this.value }));
3144
+ t.key === "Enter" && (t.preventDefault(), this.#l(), this.emit("change", { value: this.value }));
3141
3145
  };
3142
3146
  #d = () => {
3143
3147
  !this.#s || !this.#e || (document.activeElement !== this.#e && (this.#e.value = this.#s.value), this.#u(), this.#v(), this.emit("input", { value: this.value }));
@@ -3211,7 +3215,7 @@ class yt extends u {
3211
3215
  return this.#s?.hsv ?? { h: 0, s: 0, v: 0 };
3212
3216
  }
3213
3217
  }
3214
- customElements.define("ry-color-input", yt);
3218
+ customElements.define("ry-color-input", mt);
3215
3219
  function x(h) {
3216
3220
  const t = h.trim().toLowerCase();
3217
3221
  if (t.startsWith("#")) {
@@ -3244,19 +3248,19 @@ function x(h) {
3244
3248
  }
3245
3249
  return null;
3246
3250
  }
3247
- function mt(h) {
3251
+ function vt(h) {
3248
3252
  const t = (e) => Math.max(0, Math.min(255, e)).toString(16).padStart(2, "0");
3249
3253
  return `#${t(h.r)}${t(h.g)}${t(h.b)}`;
3250
3254
  }
3251
- function vt(h, t, e) {
3255
+ function At(h, t, e) {
3252
3256
  return {
3253
3257
  r: Math.round(h.r + (t.r - h.r) * e),
3254
3258
  g: Math.round(h.g + (t.g - h.g) * e),
3255
3259
  b: Math.round(h.b + (t.b - h.b) * e)
3256
3260
  };
3257
3261
  }
3258
- const I = "linear-gradient(90deg, #000000 0%, #ffffff 100%)", At = 50;
3259
- class wt extends u {
3262
+ const D = "linear-gradient(90deg, #000000 0%, #ffffff 100%)", wt = 50;
3263
+ class kt extends u {
3260
3264
  #t = "linear";
3261
3265
  #e = 90;
3262
3266
  #i = "circle";
@@ -3264,8 +3268,8 @@ class wt extends u {
3264
3268
  #r = null;
3265
3269
  #a = 0;
3266
3270
  #o = null;
3267
- #l = !1;
3268
- #h = null;
3271
+ #h = !1;
3272
+ #l = null;
3269
3273
  #c = !1;
3270
3274
  // Cached DOM refs
3271
3275
  #n = null;
@@ -3279,8 +3283,8 @@ class wt extends u {
3279
3283
  // Parsing / Serialization
3280
3284
  // ───────────────────────────────────────────────────────────────────────────
3281
3285
  #m() {
3282
- const t = this.getAttribute("value") || I;
3283
- this.#f(t) || this.#f(I);
3286
+ const t = this.getAttribute("value") || D;
3287
+ this.#f(t) || this.#f(D);
3284
3288
  }
3285
3289
  #f(t) {
3286
3290
  const e = t.trim();
@@ -3354,7 +3358,7 @@ class wt extends u {
3354
3358
  #$() {
3355
3359
  this.#s.sort((t, e) => t.position - e.position);
3356
3360
  }
3357
- #I() {
3361
+ #D() {
3358
3362
  return this.#s.find((t) => t.id === this.#r) ?? null;
3359
3363
  }
3360
3364
  // ───────────────────────────────────────────────────────────────────────────
@@ -3402,7 +3406,7 @@ class wt extends u {
3402
3406
  // Event binding
3403
3407
  // ───────────────────────────────────────────────────────────────────────────
3404
3408
  #X() {
3405
- this.#n && (this.on(this.#n, "pointerdown", this.#G), this.on(this.#n, "pointermove", this.#K), this.on(this.#n, "pointerup", this.#q), this.on(this.#n, "lostpointercapture", this.#q));
3409
+ this.#n && (this.on(this.#n, "pointerdown", this.#G), this.on(this.#n, "pointermove", this.#q), this.on(this.#n, "pointerup", this.#K), this.on(this.#n, "lostpointercapture", this.#K));
3406
3410
  const t = this.$('[data-ry-target="type-solid"]'), e = this.$('[data-ry-target="type-linear"]'), s = this.$('[data-ry-target="type-radial"]');
3407
3411
  t && this.on(t, "click", () => this.#E("solid")), e && this.on(e, "click", () => this.#E("linear")), s && this.on(s, "click", () => this.#E("radial"));
3408
3412
  const i = this.$('[data-ry-target="angle-select"]');
@@ -3421,26 +3425,26 @@ class wt extends u {
3421
3425
  if (s) {
3422
3426
  const i = s.getAttribute("data-stop-id");
3423
3427
  if (!i) return;
3424
- t.preventDefault(), this.#o = i, this.#l = !1, this.#h = this.#n.getBoundingClientRect(), this.#M(i), this.#n.setPointerCapture(t.pointerId), s.focus();
3428
+ t.preventDefault(), this.#o = i, this.#h = !1, this.#l = this.#n.getBoundingClientRect(), this.#M(i), this.#n.setPointerCapture(t.pointerId), s.focus();
3425
3429
  } else {
3426
3430
  if (t.preventDefault(), !this.#n) return;
3427
3431
  const i = this.#n.getBoundingClientRect(), r = Math.round(Math.max(0, Math.min(100, (t.clientX - i.left) / i.width * 100))), a = this.#U(r);
3428
- this.#v(a, r), this.#n.querySelector(`[data-stop-id="${this.#r}"]`)?.focus(), this.#o = this.#r, this.#l = !1, this.#h = i, this.#n.setPointerCapture(t.pointerId), this.#D();
3432
+ this.#v(a, r), this.#n.querySelector(`[data-stop-id="${this.#r}"]`)?.focus(), this.#o = this.#r, this.#h = !1, this.#l = i, this.#n.setPointerCapture(t.pointerId), this.#I();
3429
3433
  }
3430
3434
  };
3431
- #K = (t) => {
3432
- if (!this.#o || !this.#h) return;
3435
+ #q = (t) => {
3436
+ if (!this.#o || !this.#l) return;
3433
3437
  const e = this.#s.find((n) => n.id === this.#o);
3434
3438
  if (!e) return;
3435
- const s = Math.max(0, Math.min(1, (t.clientX - this.#h.left) / this.#h.width));
3439
+ const s = Math.max(0, Math.min(1, (t.clientX - this.#l.left) / this.#l.width));
3436
3440
  e.position = Math.round(s * 100);
3437
- const i = this.#h.top + this.#h.height / 2, r = Math.abs(t.clientY - i);
3438
- this.#l = r > At && this.#s.length > 2;
3441
+ const i = this.#l.top + this.#l.height / 2, r = Math.abs(t.clientY - i);
3442
+ this.#h = r > wt && this.#s.length > 2;
3439
3443
  const a = this.#n?.querySelector(`[data-stop-id="${e.id}"]`);
3440
- a && (a.style.left = this.#b(e.position), this.#l ? (a.style.opacity = "0.3", a.style.transform = "translate(-50%, -50%) scale(0.7)") : (a.style.opacity = "", a.style.transform = "")), this.#$(), this.#O(), this.#H(), this.#k(), this.#D();
3444
+ a && (a.style.left = this.#b(e.position), this.#h ? (a.style.opacity = "0.3", a.style.transform = "translate(-50%, -50%) scale(0.7)") : (a.style.opacity = "", a.style.transform = "")), this.#$(), this.#O(), this.#H(), this.#k(), this.#I();
3441
3445
  };
3442
- #q = () => {
3443
- this.#o && (this.#l && this.#y(this.#o), this.#o = null, this.#l = !1, this.#h = null, this.#S(), this.#B());
3446
+ #K = () => {
3447
+ this.#o && (this.#h && this.#y(this.#o), this.#o = null, this.#h = !1, this.#l = null, this.#S(), this.#B());
3444
3448
  };
3445
3449
  #J = (t) => {
3446
3450
  if (this.disabled) return;
@@ -3461,30 +3465,30 @@ class wt extends u {
3461
3465
  break;
3462
3466
  case "Delete":
3463
3467
  case "Backspace":
3464
- this.#y(i) && (this.#D(), this.#B()), t.preventDefault();
3468
+ this.#y(i) && (this.#I(), this.#B()), t.preventDefault();
3465
3469
  return;
3466
3470
  }
3467
- n && (t.preventDefault(), this.#$(), this.#W(), this.#O(), this.#H(), this.#k(), this.#S(), this.#D(), this.#B());
3471
+ n && (t.preventDefault(), this.#$(), this.#W(), this.#O(), this.#H(), this.#k(), this.#S(), this.#I(), this.#B());
3468
3472
  };
3469
3473
  // ───────────────────────────────────────────────────────────────────────────
3470
3474
  // Type / Angle / Shape handlers
3471
3475
  // ───────────────────────────────────────────────────────────────────────────
3472
3476
  #E(t) {
3473
- this.#t !== t && (this.#t = t, this.setAttribute("data-ry-type", t), this.#_(), this.#H(), this.#k(), this.#S(), this.#D(), this.#B());
3477
+ this.#t !== t && (this.#t = t, this.setAttribute("data-ry-type", t), this.#_(), this.#H(), this.#k(), this.#S(), this.#I(), this.#B());
3474
3478
  }
3475
3479
  #z = (t) => {
3476
3480
  const e = t.detail;
3477
- this.#e = e.value, this.#H(), this.#k(), this.#S(), this.#D();
3481
+ this.#e = e.value, this.#H(), this.#k(), this.#S(), this.#I();
3478
3482
  };
3479
3483
  #P(t) {
3480
- this.#i !== t && (this.#i = t, this.#_(), this.#k(), this.#S(), this.#D(), this.#B());
3484
+ this.#i !== t && (this.#i = t, this.#_(), this.#k(), this.#S(), this.#I(), this.#B());
3481
3485
  }
3482
3486
  // ───────────────────────────────────────────────────────────────────────────
3483
3487
  // Color picker handlers
3484
3488
  // ───────────────────────────────────────────────────────────────────────────
3485
3489
  #R = () => {
3486
- const t = this.#I();
3487
- !t || !this.#p || (t.color = this.#p.value, this.#Z(t), this.#O(), this.#H(), this.#k(), this.#D());
3490
+ const t = this.#D();
3491
+ !t || !this.#p || (t.color = this.#p.value, this.#Z(t), this.#O(), this.#H(), this.#k(), this.#I());
3488
3492
  };
3489
3493
  #T = () => {
3490
3494
  this.#S(), this.#B();
@@ -3511,7 +3515,7 @@ class wt extends u {
3511
3515
  #A() {
3512
3516
  if (!this.#d) return;
3513
3517
  const t = this.#d.value.trim();
3514
- t && this.#f(t) ? (this.#C(), this.#x(), this.#S(), this.#D(), this.#B()) : this.#k();
3518
+ t && this.#f(t) ? (this.#C(), this.#x(), this.#S(), this.#I(), this.#B()) : this.#k();
3515
3519
  }
3516
3520
  // ───────────────────────────────────────────────────────────────────────────
3517
3521
  // Color interpolation
@@ -3531,7 +3535,7 @@ class wt extends u {
3531
3535
  const r = i.position - s.position;
3532
3536
  if (r === 0) return s.color;
3533
3537
  const a = (t - s.position) / r, n = x(s.color), o = x(i.color);
3534
- return !n || !o ? s.color : mt(vt(n, o, a));
3538
+ return !n || !o ? s.color : vt(At(n, o, a));
3535
3539
  }
3536
3540
  // ───────────────────────────────────────────────────────────────────────────
3537
3541
  // Update methods
@@ -3576,7 +3580,7 @@ class wt extends u {
3576
3580
  e.getAttribute("data-stop-id") === this.#r ? e.setAttribute("data-selected", "") : e.removeAttribute("data-selected");
3577
3581
  }
3578
3582
  #L() {
3579
- const t = this.#I();
3583
+ const t = this.#D();
3580
3584
  !t || !this.#p || this.#p.setColor(t.color);
3581
3585
  }
3582
3586
  #k() {
@@ -3589,7 +3593,7 @@ class wt extends u {
3589
3593
  // ───────────────────────────────────────────────────────────────────────────
3590
3594
  // Events
3591
3595
  // ───────────────────────────────────────────────────────────────────────────
3592
- #D() {
3596
+ #I() {
3593
3597
  this.emit("input", {
3594
3598
  value: this.#g(),
3595
3599
  type: this.#t,
@@ -3644,7 +3648,7 @@ class wt extends u {
3644
3648
  return this.#s.map((t) => ({ ...t }));
3645
3649
  }
3646
3650
  get selectedStop() {
3647
- const t = this.#I();
3651
+ const t = this.#D();
3648
3652
  return t ? { ...t } : null;
3649
3653
  }
3650
3654
  get disabled() {
@@ -3654,16 +3658,16 @@ class wt extends u {
3654
3658
  t ? this.setAttribute("disabled", "") : this.removeAttribute("disabled");
3655
3659
  }
3656
3660
  addStop(t, e) {
3657
- this.#v(t, e), this.#S(), this.#D(), this.#B();
3661
+ this.#v(t, e), this.#S(), this.#I(), this.#B();
3658
3662
  }
3659
3663
  removeStop(t) {
3660
3664
  const e = this.#y(t);
3661
3665
  return e && (this.#k(), this.#S(), this.#B()), e;
3662
3666
  }
3663
3667
  }
3664
- customElements.define("ry-gradient-picker", wt);
3665
- let kt = 0;
3666
- const $t = 5;
3668
+ customElements.define("ry-gradient-picker", kt);
3669
+ let $t = 0;
3670
+ const xt = 5;
3667
3671
  function _(h) {
3668
3672
  return p(h).replace(/width="24"/g, 'width="16"').replace(/height="24"/g, 'height="16"').replace(/viewBox/, 'class="ry-tree__icon" viewBox');
3669
3673
  }
@@ -3676,9 +3680,9 @@ class w extends u {
3676
3680
  #r = null;
3677
3681
  #a = null;
3678
3682
  #o = null;
3679
- #l = null;
3683
+ #h = null;
3680
3684
  setup() {
3681
- this.#h(), this.on(this, "click", (t) => {
3685
+ this.#l(), this.on(this, "click", (t) => {
3682
3686
  const s = t.target.closest('[data-ry-target="file"]');
3683
3687
  s && (this.$$("[data-ry-selected]").forEach((i) => i.removeAttribute("data-ry-selected")), s.setAttribute("data-ry-selected", ""), this.emit("select", {
3684
3688
  label: s.dataset.ryLabel ?? ""
@@ -3694,7 +3698,7 @@ class w extends u {
3694
3698
  }), this.hasAttribute("sortable") && this.#m();
3695
3699
  }
3696
3700
  // ── Build ──────────────────────────────────────────────────
3697
- #h() {
3701
+ #l() {
3698
3702
  if (this.$(".ry-tree__root")) return;
3699
3703
  const t = Array.from(this.children), e = document.createElement("ul");
3700
3704
  e.className = "ry-tree__root";
@@ -3709,7 +3713,7 @@ class w extends u {
3709
3713
  (o) => o.tagName === "RY-TREE-ITEM"
3710
3714
  );
3711
3715
  if (a.length > 0) {
3712
- const o = `ry-tree-${++kt}`, l = document.createElement("input");
3716
+ const o = `ry-tree-${++$t}`, l = document.createElement("input");
3713
3717
  l.type = "checkbox", l.id = o, l.className = "ry-tree__toggle", i && (l.checked = !0);
3714
3718
  const c = document.createElement("label");
3715
3719
  c.htmlFor = o, c.className = "ry-tree__label", c.setAttribute("data-ry-target", "folder"), c.dataset.ryLabel = s, c.innerHTML = `
@@ -3786,7 +3790,7 @@ class w extends u {
3786
3790
  if (!this.#t && !this.#e) return;
3787
3791
  if (this.#t && !this.#e) {
3788
3792
  const c = t.clientX - this.#i, d = t.clientY - this.#s;
3789
- if (Math.hypot(c, d) < $t) return;
3793
+ if (Math.hypot(c, d) < xt) return;
3790
3794
  this.#t = !1, this.#e = !0, this.#u(t);
3791
3795
  }
3792
3796
  if (!this.#e || !this.#a) return;
@@ -3827,14 +3831,14 @@ class w extends u {
3827
3831
  }
3828
3832
  #b() {
3829
3833
  this.#a?.parentNode && this.#a.parentNode.removeChild(this.#a), this.#a = null, this.#r?.classList.remove("ry-tree__item--collapsed"), this.#r?.removeAttribute("data-ry-dragging");
3830
- const t = this.#o, e = this.#l;
3834
+ const t = this.#o, e = this.#h;
3831
3835
  this.#y(), this.#r && t && e && this.#M(this.#r, t, e);
3832
3836
  }
3833
3837
  #v(t, e) {
3834
- this.#o === t && this.#l === e || (this.#y(), t.setAttribute("data-ry-drop-target", e), this.#o = t, this.#l = e);
3838
+ this.#o === t && this.#h === e || (this.#y(), t.setAttribute("data-ry-drop-target", e), this.#o = t, this.#h = e);
3835
3839
  }
3836
3840
  #y() {
3837
- this.#o?.removeAttribute("data-ry-drop-target"), this.#o = null, this.#l = null;
3841
+ this.#o?.removeAttribute("data-ry-drop-target"), this.#o = null, this.#h = null;
3838
3842
  }
3839
3843
  #M(t, e, s) {
3840
3844
  if (s === "inside" && e.contains(t)) return;
@@ -3862,12 +3866,12 @@ class w extends u {
3862
3866
  return e?.dataset.ryLabel ?? s?.dataset.ryLabel ?? "";
3863
3867
  }
3864
3868
  }
3865
- class xt extends u {
3869
+ class _t extends u {
3866
3870
  // Declarative container consumed by RyTree#build
3867
3871
  }
3868
3872
  customElements.define("ry-tree", w);
3869
- customElements.define("ry-tree-item", xt);
3870
- class _t extends u {
3873
+ customElements.define("ry-tree-item", _t);
3874
+ class Mt extends u {
3871
3875
  setup() {
3872
3876
  this.#t();
3873
3877
  }
@@ -3888,8 +3892,8 @@ class _t extends u {
3888
3892
  return this.$('[data-ry-target="label"]')?.textContent?.trim() ?? "";
3889
3893
  }
3890
3894
  }
3891
- customElements.define("ry-tag", _t);
3892
- class Mt extends u {
3895
+ customElements.define("ry-tag", Mt);
3896
+ class Et extends u {
3893
3897
  #t = [];
3894
3898
  setup() {
3895
3899
  this.#e(), this.#i();
@@ -3924,7 +3928,7 @@ class Mt extends u {
3924
3928
  else if (t.key === "Tab")
3925
3929
  return;
3926
3930
  }
3927
- t.key === "Backspace" && !e.value && this.#t.length > 0 && this.#l();
3931
+ t.key === "Backspace" && !e.value && this.#t.length > 0 && this.#h();
3928
3932
  };
3929
3933
  #r = (t) => {
3930
3934
  t.preventDefault();
@@ -3936,7 +3940,7 @@ class Mt extends u {
3936
3940
  };
3937
3941
  #a = (t) => {
3938
3942
  const e = t.detail.value, s = this.#t.indexOf(e);
3939
- s >= 0 && (this.#t.splice(s, 1), this.#h(), this.emit("change", { values: [...this.#t] }));
3943
+ s >= 0 && (this.#t.splice(s, 1), this.#l(), this.emit("change", { values: [...this.#t] }));
3940
3944
  };
3941
3945
  #o(t) {
3942
3946
  const e = this.getAttribute("max-tags");
@@ -3947,16 +3951,16 @@ class Mt extends u {
3947
3951
  const i = document.createElement("ry-tag");
3948
3952
  i.setAttribute("removable", ""), i.setAttribute("size", "sm"), i.setAttribute("data-value", t), i.textContent = t, s.appendChild(i);
3949
3953
  }
3950
- this.#h(), this.emit("add", { value: t }), this.emit("change", { values: [...this.#t] });
3954
+ this.#l(), this.emit("add", { value: t }), this.emit("change", { values: [...this.#t] });
3951
3955
  }
3952
- #l() {
3956
+ #h() {
3953
3957
  const e = this.$('[data-ry-target="tags"]')?.lastElementChild;
3954
3958
  if (e) {
3955
3959
  const s = e.dataset.value ?? "";
3956
- e.remove(), this.#t.pop(), this.#h(), this.emit("remove", { value: s, label: s }), this.emit("change", { values: [...this.#t] });
3960
+ e.remove(), this.#t.pop(), this.#l(), this.emit("remove", { value: s, label: s }), this.emit("change", { values: [...this.#t] });
3957
3961
  }
3958
3962
  }
3959
- #h() {
3963
+ #l() {
3960
3964
  const t = this.$('[data-ry-target="hidden"]'), e = this.getAttribute("delimiter") ?? ",";
3961
3965
  t && (t.value = this.#t.join(e));
3962
3966
  }
@@ -3968,11 +3972,11 @@ class Mt extends u {
3968
3972
  return [...this.#t];
3969
3973
  }
3970
3974
  }
3971
- customElements.define("ry-tag-input", Mt);
3972
- class Et extends u {
3973
- }
3974
- customElements.define("ry-hero", Et);
3975
+ customElements.define("ry-tag-input", Et);
3975
3976
  class Ct extends u {
3977
+ }
3978
+ customElements.define("ry-hero", Ct);
3979
+ class St extends u {
3976
3980
  setup() {
3977
3981
  this.#t();
3978
3982
  }
@@ -3985,8 +3989,8 @@ class Ct extends u {
3985
3989
  `;
3986
3990
  }
3987
3991
  }
3988
- customElements.define("ry-stat", Ct);
3989
- class St extends u {
3992
+ customElements.define("ry-stat", St);
3993
+ class Tt extends u {
3990
3994
  setup() {
3991
3995
  this.#t();
3992
3996
  }
@@ -4000,17 +4004,17 @@ class St extends u {
4000
4004
  s.setAttribute("data-ry-target", "icon"), s.className = "ry-feature__icon", s.innerHTML = e, this.insertBefore(s, this.firstChild);
4001
4005
  }
4002
4006
  }
4003
- class Tt extends u {
4004
- }
4005
- customElements.define("ry-feature", St);
4006
- customElements.define("ry-feature-grid", Tt);
4007
4007
  class Lt extends u {
4008
4008
  }
4009
+ customElements.define("ry-feature", Tt);
4010
+ customElements.define("ry-feature-grid", Lt);
4011
+ class It extends u {
4012
+ }
4009
4013
  class Dt extends u {
4010
4014
  }
4011
- customElements.define("ry-pricing", Lt);
4015
+ customElements.define("ry-pricing", It);
4012
4016
  customElements.define("ry-pricing-card", Dt);
4013
- class It extends u {
4017
+ class Ht extends u {
4014
4018
  #t = 0;
4015
4019
  #e = 0;
4016
4020
  #i = null;
@@ -4045,15 +4049,15 @@ class It extends u {
4045
4049
  }
4046
4050
  this.appendChild(a);
4047
4051
  }
4048
- this.on(r, "pointerdown", this.#l), this.on(r, "pointermove", this.#h), this.on(r, "pointerup", this.#c), this.on(r, "pointercancel", this.#c), this.hasAttribute("pause-on-hover") && (this.on(this, "mouseenter", () => this.#p()), this.on(this, "mouseleave", () => this.#n())), this.goTo(0);
4052
+ this.on(r, "pointerdown", this.#h), this.on(r, "pointermove", this.#l), this.on(r, "pointerup", this.#c), this.on(r, "pointercancel", this.#c), this.hasAttribute("pause-on-hover") && (this.on(this, "mouseenter", () => this.#p()), this.on(this, "mouseleave", () => this.#n())), this.goTo(0);
4049
4053
  }
4050
4054
  #o = (t) => {
4051
4055
  t.key === "ArrowLeft" ? (t.preventDefault(), this.prev()) : t.key === "ArrowRight" && (t.preventDefault(), this.next());
4052
4056
  };
4053
- #l = (t) => {
4057
+ #h = (t) => {
4054
4058
  this.#s = t.clientX, this.#r = !0, t.currentTarget.setPointerCapture(t.pointerId);
4055
4059
  };
4056
- #h = (t) => {
4060
+ #l = (t) => {
4057
4061
  this.#r && t.preventDefault();
4058
4062
  };
4059
4063
  #c = (t) => {
@@ -4090,54 +4094,187 @@ class It extends u {
4090
4094
  this.#p();
4091
4095
  }
4092
4096
  }
4093
- customElements.define("ry-carousel", It);
4097
+ customElements.define("ry-carousel", Ht);
4098
+ const H = "ry-theme-panel";
4099
+ class Bt extends u {
4100
+ #t = "default";
4101
+ #e = "auto";
4102
+ setup() {
4103
+ const t = this.#l();
4104
+ this.#t = t?.theme ?? this.getAttribute("theme") ?? document.documentElement.dataset.ryTheme ?? "default", this.#e = t?.mode ?? this.getAttribute("mode") ?? document.documentElement.dataset.ryMode ?? "auto", (this.#t === "light" || this.#t === "dark") && (this.#e = this.#t, this.#t = "default"), this.innerHTML = this.#c(), this.#i(), this.#s();
4105
+ }
4106
+ #i() {
4107
+ this.$$('[data-ry-target="theme-btn"]').forEach((t) => {
4108
+ this.on(t, "click", () => {
4109
+ this.#t = t.dataset.value ?? "default", this.#s(), this.#o(), this.#h(), this.emit("theme-panel-change", {
4110
+ theme: this.#t,
4111
+ mode: this.#e
4112
+ });
4113
+ });
4114
+ }), this.$$('[data-ry-target="mode-btn"]').forEach((t) => {
4115
+ this.on(t, "click", () => {
4116
+ this.#e = t.dataset.value ?? "auto", this.#s(), this.#o(), this.#h(), this.emit("theme-panel-change", {
4117
+ theme: this.#t,
4118
+ mode: this.#e
4119
+ });
4120
+ });
4121
+ });
4122
+ }
4123
+ #s() {
4124
+ const t = document.documentElement;
4125
+ this.#t === "default" ? delete t.dataset.ryTheme : t.dataset.ryTheme = this.#t, this.#e === "auto" ? t.style.removeProperty("color-scheme") : t.style.colorScheme = this.#e, this.#r();
4126
+ }
4127
+ #r() {
4128
+ if (document.querySelectorAll("link[data-ry-theme-panel]").forEach((t) => t.remove()), this.#t === "ocean") {
4129
+ if (document.querySelector('link[href*="ocean.css"]')) return;
4130
+ const t = document.createElement("link");
4131
+ t.rel = "stylesheet", t.href = this.#a("ocean.css"), t.setAttribute("data-ry-theme-panel", ""), document.head.appendChild(t);
4132
+ }
4133
+ }
4134
+ #a(t) {
4135
+ const e = this.getAttribute("base-path");
4136
+ if (e) return `${e}/${t}`;
4137
+ const s = document.querySelector('link[href*="ry-"]');
4138
+ if (s) {
4139
+ const i = s.getAttribute("href") ?? "";
4140
+ return `${i.substring(0, i.lastIndexOf("/"))}/../themes/${t}`;
4141
+ }
4142
+ return `/src/themes/${t}`;
4143
+ }
4144
+ #o() {
4145
+ this.$$('[data-ry-target="theme-btn"]').forEach((t) => {
4146
+ const e = t;
4147
+ e.setAttribute("aria-pressed", String(e.dataset.value === this.#t));
4148
+ }), this.$$('[data-ry-target="mode-btn"]').forEach((t) => {
4149
+ const e = t;
4150
+ e.setAttribute("aria-pressed", String(e.dataset.value === this.#e));
4151
+ });
4152
+ }
4153
+ #h() {
4154
+ try {
4155
+ localStorage.setItem(H, JSON.stringify({
4156
+ theme: this.#t,
4157
+ mode: this.#e
4158
+ }));
4159
+ } catch {
4160
+ }
4161
+ }
4162
+ #l() {
4163
+ try {
4164
+ const t = localStorage.getItem(H);
4165
+ return t ? JSON.parse(t) : null;
4166
+ } catch {
4167
+ return null;
4168
+ }
4169
+ }
4170
+ #c() {
4171
+ return `
4172
+ <div data-ry-target="panel" class="ry-theme-panel">
4173
+ <div data-ry-target="theme-row" class="ry-theme-panel__row">
4174
+ <span data-ry-target="label" class="ry-theme-panel__label">Theme</span>
4175
+ <div data-ry-target="theme-options" class="ry-theme-panel__options">
4176
+ ${this.#n("theme-btn", "none", "None")}
4177
+ ${this.#n("theme-btn", "default", "Default")}
4178
+ ${this.#n("theme-btn", "ocean", "Ocean")}
4179
+ </div>
4180
+ </div>
4181
+ <div data-ry-target="mode-row" class="ry-theme-panel__row">
4182
+ <span data-ry-target="label" class="ry-theme-panel__label">Mode</span>
4183
+ <div data-ry-target="mode-options" class="ry-theme-panel__options">
4184
+ ${this.#n("mode-btn", "auto", "Auto")}
4185
+ ${this.#n("mode-btn", "light", "&#9728;")}
4186
+ ${this.#n("mode-btn", "dark", "&#9790;")}
4187
+ </div>
4188
+ </div>
4189
+ </div>`;
4190
+ }
4191
+ #n(t, e, s) {
4192
+ const i = t === "theme-btn" ? this.#t : this.#e;
4193
+ return `<button data-ry-target="${t}" data-value="${e}" class="ry-theme-panel__btn" aria-pressed="${e === i}">${s}</button>`;
4194
+ }
4195
+ // Public API
4196
+ get theme() {
4197
+ return this.#t;
4198
+ }
4199
+ set theme(t) {
4200
+ this.#t = t, this.#s(), this.#o(), this.#h();
4201
+ }
4202
+ get mode() {
4203
+ return this.#e;
4204
+ }
4205
+ set mode(t) {
4206
+ this.#e = t, this.#s(), this.#o(), this.#h();
4207
+ }
4208
+ }
4209
+ customElements.define("ry-theme-panel", Bt);
4210
+ class Rt extends u {
4211
+ setup() {
4212
+ this.#t();
4213
+ }
4214
+ #t() {
4215
+ if (this.$('[data-ry-target="quote"]')) return;
4216
+ const t = this.querySelector('[slot="avatar"]'), e = this.querySelector("blockquote"), s = this.querySelector('[slot="name"]'), i = this.querySelector('[slot="role"]'), r = parseInt(this.getAttribute("stars") ?? "0", 10), a = e?.innerHTML?.trim() ?? "", n = s?.textContent?.trim() ?? "", o = i?.textContent?.trim() ?? "", l = t ? `<div data-ry-target="avatar" class="ry-testimonial__avatar">${t.outerHTML}</div>` : "", c = r > 0 ? `<div data-ry-target="stars" class="ry-testimonial__stars">${Array.from({ length: r }, () => `<span class="ry-testimonial__star">${p("star")}</span>`).join("")}</div>` : "";
4217
+ this.innerHTML = `
4218
+ ${l}
4219
+ ${c}
4220
+ <blockquote data-ry-target="quote" class="ry-testimonial__quote">${a}</blockquote>
4221
+ <div data-ry-target="attribution" class="ry-testimonial__attribution">
4222
+ <span data-ry-target="name" class="ry-testimonial__name">${n}</span>
4223
+ ${o ? `<span data-ry-target="role" class="ry-testimonial__role">${o}</span>` : ""}
4224
+ </div>
4225
+ `;
4226
+ }
4227
+ }
4228
+ customElements.define("ry-testimonial", Rt);
4094
4229
  window.RyToast = f;
4095
4230
  console.log("ry-ui loaded");
4096
4231
  export {
4097
- R as RyAccordion,
4098
- V as RyAlert,
4099
- O as RyButton,
4100
- N as RyButtonGroup,
4101
- z as RyCard,
4102
- It as RyCarousel,
4103
- rt as RyCode,
4104
- yt as RyColorInput,
4105
- bt as RyColorPicker,
4106
- it as RyCombobox,
4107
- J as RyDrawer,
4108
- j as RyDropdown,
4232
+ P as RyAccordion,
4233
+ U as RyAlert,
4234
+ N as RyButton,
4235
+ q as RyButtonGroup,
4236
+ V as RyCard,
4237
+ Ht as RyCarousel,
4238
+ at as RyCode,
4239
+ mt as RyColorInput,
4240
+ yt as RyColorPicker,
4241
+ rt as RyCombobox,
4242
+ Z as RyDrawer,
4243
+ O as RyDropdown,
4109
4244
  u as RyElement,
4110
- at as RyExample,
4111
- St as RyFeature,
4112
- Tt as RyFeatureGrid,
4113
- U as RyField,
4114
- wt as RyGradientPicker,
4115
- Et as RyHero,
4116
- nt as RyIcon,
4117
- ut as RyKnob,
4118
- P as RyModal,
4119
- pt as RyNumberSelect,
4120
- Lt as RyPricing,
4245
+ nt as RyExample,
4246
+ Tt as RyFeature,
4247
+ Lt as RyFeatureGrid,
4248
+ W as RyField,
4249
+ kt as RyGradientPicker,
4250
+ Ct as RyHero,
4251
+ ot as RyIcon,
4252
+ pt as RyKnob,
4253
+ F as RyModal,
4254
+ gt as RyNumberSelect,
4255
+ It as RyPricing,
4121
4256
  Dt as RyPricingCard,
4122
- tt as RySelect,
4123
- dt as RySlider,
4257
+ et as RySelect,
4258
+ ut as RySlider,
4124
4259
  K as RySplit,
4125
- Ct as RyStat,
4126
- Y as RySwitch,
4127
- F as RyTabs,
4128
- _t as RyTag,
4129
- Mt as RyTagInput,
4130
- q as RyThemeToggle,
4260
+ St as RyStat,
4261
+ X as RySwitch,
4262
+ j as RyTabs,
4263
+ Mt as RyTag,
4264
+ Et as RyTagInput,
4265
+ Rt as RyTestimonial,
4266
+ Bt as RyThemePanel,
4267
+ z as RyThemeToggle,
4131
4268
  f as RyToast,
4132
- ct as RyToggleButton,
4133
- G as RyTooltip,
4269
+ dt as RyToggleButton,
4270
+ J as RyTooltip,
4134
4271
  w as RyTree,
4135
- xt as RyTreeItem,
4272
+ _t as RyTreeItem,
4136
4273
  p as getIcon,
4137
- Pt as getIconNames,
4274
+ Ot as getIconNames,
4138
4275
  C as processTransforms,
4139
- Bt as registerIcon,
4140
- Rt as registerIcons,
4276
+ Ft as registerIcon,
4277
+ jt as registerIcons,
4141
4278
  M as transform
4142
4279
  };
4143
4280
  //# sourceMappingURL=ry-ui.js.map