@nonoun/native-ui 0.1.0 → 0.2.2

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.
@@ -1,16 +1,21 @@
1
1
  import { i as e, o as t, t as n } from "./uid.js";
2
- var r = /* @__PURE__ */ new Map();
3
- function i(e) {
2
+ var r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set();
3
+ function a(e) {
4
4
  if (r.has(e.name)) {
5
5
  console.warn(`[native-ui] Trait "${e.name}" is already registered.`);
6
6
  return;
7
7
  }
8
8
  r.set(e.name, e);
9
+ for (let t of i) t(e.name);
9
10
  }
10
- function a(e) {
11
+ /** Subscribe to trait registration events. Returns unsubscribe function. */
12
+ function o(e) {
13
+ return i.add(e), () => i.delete(e);
14
+ }
15
+ function s(e) {
11
16
  return r.get(e);
12
17
  }
13
- function o() {
18
+ function c() {
14
19
  return new Set(r.keys());
15
20
  }
16
21
  /**
@@ -18,8 +23,8 @@ function o() {
18
23
  * { trait: "draggable", key: "axis" }. Returns null if the attribute
19
24
  * doesn't match any registered trait name prefix.
20
25
  */
21
- function s(e) {
22
- let t = o();
26
+ function l(e) {
27
+ let t = c();
23
28
  for (let n of t) if (e.startsWith(n + "-")) return {
24
29
  trait: n,
25
30
  key: e.slice(n.length + 1)
@@ -33,28 +38,30 @@ function s(e) {
33
38
  * Example: element has `draggable-axis="x"` and `draggable-mode="slot"`
34
39
  * → collectTraitOptions(el, 'draggable') returns { axis: 'x', mode: 'slot' }
35
40
  */
36
- function c(e, t) {
41
+ function u(e, t) {
37
42
  let n = t + "-", r = {};
38
43
  for (let t of e.attributes) t.name.startsWith(n) && (r[t.name.slice(n.length)] = t.value);
39
44
  return r;
40
45
  }
41
46
  /** Base custom element class with reactive effect lifecycle, child deferral, and trait protocol. */
42
- var l = class extends HTMLElement {
47
+ var d = class extends HTMLElement {
43
48
  #e = [];
44
49
  #t = /* @__PURE__ */ new Map();
45
50
  #n = null;
46
- #r = !1;
51
+ #r = /* @__PURE__ */ new Set();
52
+ #i = null;
53
+ #a = !1;
47
54
  addEffect(t) {
48
55
  this.#e.push(e(t));
49
56
  }
50
57
  connectedCallback() {
51
- if (this.#r) return;
52
- this.#r = !0, this.setup();
58
+ if (this.#a) return;
59
+ this.#a = !0, this.setup();
53
60
  let e = this.getAttribute("traits");
54
- e !== null && this.#i(e);
61
+ e !== null && this.#o(e);
55
62
  }
56
63
  disconnectedCallback() {
57
- this.#r = !1, this.#o(), this.#n?.disconnect(), this.#n = null, this.teardown();
64
+ this.#a = !1, this.#c(), this.#n?.disconnect(), this.#n = null, this.#i?.(), this.#i = null, this.#r.clear(), this.teardown();
58
65
  for (let e of this.#e) e();
59
66
  this.#e = [];
60
67
  }
@@ -73,47 +80,51 @@ var l = class extends HTMLElement {
73
80
  getTraitController(e) {
74
81
  return this.#t.get(e) ?? null;
75
82
  }
76
- #i(e) {
77
- this.#a(e), this.#n = new MutationObserver((e) => {
78
- for (let t of e) if (t.attributeName === "traits") this.#a(this.getAttribute("traits") ?? "");
83
+ #o(e) {
84
+ this.#s(e), this.#n = new MutationObserver((e) => {
85
+ for (let t of e) if (t.attributeName === "traits") this.#s(this.getAttribute("traits") ?? "");
79
86
  else if (t.attributeName) {
80
- let e = s(t.attributeName);
87
+ let e = l(t.attributeName);
81
88
  if (e) {
82
- let t = a(e.trait), n = this.#t.get(e.trait);
83
- t && n && t.update && t.update(n, c(this, e.trait));
89
+ let t = s(e.trait), n = this.#t.get(e.trait);
90
+ t && n && t.update && t.update(n, u(this, e.trait));
84
91
  }
85
92
  }
86
93
  }), this.#n.observe(this, { attributes: !0 });
87
94
  }
88
- #a(e) {
95
+ #s(e) {
89
96
  let t = new Set(e.split(/\s+/).filter(Boolean));
90
97
  for (let [e, n] of this.#t) if (!t.has(e)) {
91
- let t = a(e);
98
+ let t = s(e);
92
99
  t && t.destroy(n), this.#t.delete(e);
93
100
  }
101
+ this.#r.clear();
94
102
  for (let e of t) {
95
103
  if (this.#t.has(e)) continue;
96
- let t = a(e);
104
+ let t = s(e);
97
105
  if (!t) {
98
- console.warn(`[native-ui] Unknown trait "${e}". Is it registered?`);
106
+ this.#r.add(e);
99
107
  continue;
100
108
  }
101
- for (let [n] of this.#t) if (a(n)?.conflicts?.includes(e) || t.conflicts?.includes(n)) {
109
+ for (let [n] of this.#t) if (s(n)?.conflicts?.includes(e) || t.conflicts?.includes(n)) {
102
110
  let t = `[native-ui] Trait conflict: "${e}" and "${n}" are incompatible.`;
103
111
  console.warn(t);
104
112
  }
105
- let n = c(this, e), r = t.create(this, n);
113
+ let n = u(this, e), r = t.create(this, n);
106
114
  this.#t.set(e, r);
107
115
  }
116
+ this.#r.size > 0 && !this.#i ? this.#i = o((e) => {
117
+ this.#r.has(e) && (this.#r.delete(e), this.#s(this.getAttribute("traits") ?? ""), this.#r.size === 0 && (this.#i?.(), this.#i = null));
118
+ }) : this.#r.size === 0 && this.#i && (this.#i(), this.#i = null);
108
119
  }
109
- #o() {
120
+ #c() {
110
121
  for (let [e, t] of this.#t) {
111
- let n = a(e);
122
+ let n = s(e);
112
123
  n && n.destroy(t);
113
124
  }
114
125
  this.#t.clear();
115
126
  }
116
- }, u = class {
127
+ }, f = class {
117
128
  #e = /* @__PURE__ */ new Set();
118
129
  #t = null;
119
130
  #n = !1;
@@ -153,7 +164,7 @@ var l = class extends HTMLElement {
153
164
  #o() {
154
165
  this.#n &&= (document.removeEventListener("pointerdown", this.#r, !0), document.removeEventListener("pointerup", this.#i, !0), document.removeEventListener("pointercancel", this.#i, !0), !1);
155
166
  }
156
- }, d = class {
167
+ }, p = class {
157
168
  #e = [];
158
169
  #t = !1;
159
170
  #n = (e) => {
@@ -185,7 +196,7 @@ var l = class extends HTMLElement {
185
196
  #a() {
186
197
  this.#e.length > 0 || (document.removeEventListener("pointerdown", this.#n, !0), document.removeEventListener("keydown", this.#r), this.#t = !1);
187
198
  }
188
- }, f = class {
199
+ }, m = class {
189
200
  #e = null;
190
201
  #t = 0;
191
202
  #n = [];
@@ -225,16 +236,16 @@ var l = class extends HTMLElement {
225
236
  dismissAll() {
226
237
  for (let e of [...this.#n]) this.dismiss(e.id);
227
238
  }
228
- }, p = null;
229
- function m() {
230
- return p ||= {
231
- dismissStack: new d(),
232
- toastManager: new f(),
233
- gestureRouter: new u()
234
- }, p;
239
+ }, h = null;
240
+ function g() {
241
+ return h ||= {
242
+ dismissStack: new p(),
243
+ toastManager: new m(),
244
+ gestureRouter: new f()
245
+ }, h;
235
246
  }
236
- /** Enables pointer-driven drag-and-drop with drop mode or slot-based reordering. */
237
- var h = class {
247
+ /** Enables pointer-driven drag-and-drop with drop, slot, or preview reordering. */
248
+ var _ = class {
238
249
  host;
239
250
  selector;
240
251
  dropZoneSelector;
@@ -251,55 +262,58 @@ var h = class {
251
262
  #s = -1;
252
263
  #c = -1;
253
264
  #l = !1;
265
+ #u = null;
266
+ #d = null;
267
+ #f = -1;
254
268
  constructor(e, t) {
255
269
  this.host = e, this.selector = t.selector, this.dropZoneSelector = t.dropZoneSelector ?? "", this.axis = t.axis ?? "both", this.mode = t.mode ?? "drop", this.disabled = t.disabled ?? !1, this.attach();
256
270
  }
257
271
  attach() {
258
- this.#l || (this.#l = !0, this.host.addEventListener("pointerdown", this.#m), this.host.addEventListener("pointerenter", this.#f, !0), this.host.addEventListener("pointerleave", this.#p, !0));
272
+ this.#l || (this.#l = !0, this.host.addEventListener("pointerdown", this.#_), this.host.addEventListener("pointerenter", this.#h, !0), this.host.addEventListener("pointerleave", this.#g, !0));
259
273
  }
260
274
  detach() {
261
- this.#l && (this.#l = !1, this.host.removeEventListener("pointerdown", this.#m), this.host.removeEventListener("pointerenter", this.#f, !0), this.host.removeEventListener("pointerleave", this.#p, !0), this.#C());
275
+ this.#l && (this.#l = !1, this.host.removeEventListener("pointerdown", this.#_), this.host.removeEventListener("pointerenter", this.#h, !0), this.host.removeEventListener("pointerleave", this.#g, !0), this.#O());
262
276
  }
263
277
  destroy() {
264
278
  this.detach();
265
279
  }
266
- #u() {
280
+ #p() {
267
281
  return this.selector ? [...this.host.querySelectorAll(this.selector)] : [];
268
282
  }
269
- #d() {
270
- return this.dropZoneSelector ? [...this.host.querySelectorAll(this.dropZoneSelector)] : this.#u();
283
+ #m() {
284
+ return this.dropZoneSelector ? [...this.host.querySelectorAll(this.dropZoneSelector)] : this.#p();
271
285
  }
272
- #f = (e) => {
286
+ #h = (e) => {
273
287
  if (this.disabled || !this.selector || this.#t) return;
274
288
  let t = e.target.closest?.(this.selector);
275
289
  !t || !this.host.contains(t) || (t.style.outline = "2px solid var(--ui-focus-ring, highlight)", t.style.outlineOffset = "2px");
276
290
  };
277
- #p = (e) => {
291
+ #g = (e) => {
278
292
  if (!this.selector) return;
279
293
  let t = e.target.closest?.(this.selector);
280
294
  !t || !this.host.contains(t) || (t.style.removeProperty("outline"), t.style.removeProperty("outline-offset"));
281
295
  };
282
- #m = (e) => {
296
+ #_ = (e) => {
283
297
  if (e.button !== 0 || this.disabled || !this.selector) return;
284
298
  let t = e.target.closest?.(this.selector);
285
299
  if (!t || !this.host.contains(t)) return;
286
- let n = this.#u().indexOf(t);
300
+ let n = this.#p().indexOf(t);
287
301
  if (n === -1) return;
288
302
  e.preventDefault(), this.#e = t, this.#s = n, this.#r = e.clientX, this.#i = e.clientY;
289
303
  let r = t.getBoundingClientRect();
290
- this.#a = r.left + r.width / 2 - e.clientX, this.#o = r.top + r.height / 2 - e.clientY, document.addEventListener("pointermove", this.#h), document.addEventListener("pointerup", this.#y), document.addEventListener("pointercancel", this.#b), document.addEventListener("keydown", this.#x);
304
+ this.#a = r.left + r.width / 2 - e.clientX, this.#o = r.top + r.height / 2 - e.clientY, document.addEventListener("pointermove", this.#v), document.addEventListener("pointerup", this.#w), document.addEventListener("pointercancel", this.#T), document.addEventListener("keydown", this.#E);
291
305
  };
292
- #h = (e) => {
306
+ #v = (e) => {
293
307
  if (!this.#e) return;
294
308
  if (!this.#t) {
295
309
  this.#e.style.removeProperty("outline"), this.#e.style.removeProperty("outline-offset");
296
310
  try {
297
- this.#S(e);
311
+ this.#D(e);
298
312
  } catch {
299
- this.#C();
313
+ this.#O();
300
314
  return;
301
315
  }
302
- this.#e.setAttribute("dragging", ""), this.host.dispatchEvent(new CustomEvent("ui-drag-start", {
316
+ this.#e.setAttribute("dragging", ""), this.mode === "preview" && (this.#u = this.#e.parentElement, this.#d = this.#e.nextElementSibling, this.#f = -1), this.host.dispatchEvent(new CustomEvent("ui-drag-start", {
303
317
  bubbles: !0,
304
318
  composed: !0,
305
319
  detail: {
@@ -318,7 +332,7 @@ var h = class {
318
332
  y: e.clientY
319
333
  }
320
334
  }));
321
- let r = this.#d();
335
+ let r = this.#m().filter((e) => e !== this.#t);
322
336
  if (this.mode === "slot") {
323
337
  let t = e.clientX + this.#a, n = e.clientY + this.#o, i = r.filter((e) => e !== this.#e), a = 0;
324
338
  for (let e = 0; e < i.length; e++) {
@@ -326,7 +340,10 @@ var h = class {
326
340
  if (this.axis === "horizontal" ? t > o : (this.axis === "vertical" || t > o) && n > s) a = e + 1;
327
341
  else break;
328
342
  }
329
- this.#_(r, a);
343
+ this.#b(r, a);
344
+ } else if (this.mode === "preview") {
345
+ let t = e.clientX + this.#a, n = e.clientY + this.#o;
346
+ this.#S(r, t, n);
330
347
  } else {
331
348
  let t = null, n = -1;
332
349
  for (let i = 0; i < r.length; i++) {
@@ -336,10 +353,10 @@ var h = class {
336
353
  break;
337
354
  }
338
355
  }
339
- this.#g(r, t, n);
356
+ this.#y(r, t, n);
340
357
  }
341
358
  };
342
- #g(e, t, n) {
359
+ #y(e, t, n) {
343
360
  for (let n of e) n !== t && (n.removeAttribute("drag-over"), n.style.removeProperty("outline"), n.style.removeProperty("outline-offset"));
344
361
  t && (t.setAttribute("drag-over", ""), t.style.outline = "2px solid var(--ui-focus-ring, highlight)", t.style.outlineOffset = "2px", this.host.dispatchEvent(new CustomEvent("ui-drag-over", {
345
362
  bubbles: !0,
@@ -351,9 +368,9 @@ var h = class {
351
368
  }
352
369
  })));
353
370
  }
354
- #_(e, t) {
371
+ #b(e, t) {
355
372
  if (t === -1 || t === this.#c) return;
356
- this.#c = t, this.#v(e), this.#n || (this.#n = document.createElement("div"), this.#n.className = "drag-placeholder", this.#n.setAttribute("aria-hidden", "true"));
373
+ this.#c = t, this.#x(e), this.#n || (this.#n = document.createElement("div"), this.#n.className = "drag-placeholder", this.#n.setAttribute("aria-hidden", "true"));
357
374
  let n = e.filter((e) => e !== this.#e), r = Math.min(t, n.length);
358
375
  r < n.length ? n[r].before(this.#n) : n.length > 0 ? n[n.length - 1].after(this.#n) : this.host.appendChild(this.#n), r < n.length && n[r].setAttribute("drag-slot-before", ""), r > 0 && r - 1 < n.length && n[r - 1].setAttribute("drag-slot-after", "");
359
376
  let i = r < n.length ? n[r] : null;
@@ -367,13 +384,41 @@ var h = class {
367
384
  }
368
385
  }));
369
386
  }
370
- #v(e) {
387
+ #x(e) {
371
388
  for (let t of e) t.removeAttribute("drag-slot-before"), t.removeAttribute("drag-slot-after");
372
389
  }
373
- #y = (e) => {
390
+ #S(e, t, n) {
391
+ let r = e.filter((e) => e !== this.#e);
392
+ if (r.length === 0) return;
393
+ let i = e[0].getBoundingClientRect(), a = 1;
394
+ for (let t = 1; t < e.length && Math.abs(e[t].getBoundingClientRect().top - i.top) < i.height * .5; t++) a = t + 1;
395
+ let o = a > 1 ? e[1].getBoundingClientRect().left - i.left : i.width, s = a < e.length ? e[a].getBoundingClientRect().top - i.top : i.height, c = Math.round((t - (i.left + i.width / 2)) / o), l = Math.round((n - (i.top + i.height / 2)) / s), u = Math.ceil(r.length / a) - 1, d = Math.max(0, Math.min(c, a - 1)), f = Math.max(0, Math.min(l, u)) * a + d;
396
+ if (f = Math.max(0, Math.min(f, r.length)), f === this.#f) return;
397
+ this.#f = f;
398
+ let p = f < r.length ? r[f] : null, m = () => {
399
+ p ? p.before(this.#e) : r[r.length - 1].after(this.#e);
400
+ };
401
+ typeof document.startViewTransition == "function" ? document.startViewTransition(m) : m(), this.host.dispatchEvent(new CustomEvent("ui-drag-over", {
402
+ bubbles: !0,
403
+ composed: !0,
404
+ detail: {
405
+ item: this.#e,
406
+ index: f,
407
+ insertBefore: p
408
+ }
409
+ }));
410
+ }
411
+ #C() {
412
+ if (this.mode !== "preview" || !this.#e || !this.#u) return;
413
+ let e = this.#e, t = this.#d, n = this.#u, r = () => {
414
+ t && t.isConnected ? t.before(e) : n.appendChild(e);
415
+ };
416
+ typeof document.startViewTransition == "function" ? document.startViewTransition(r) : r();
417
+ }
418
+ #w = (e) => {
374
419
  if (this.#e) {
375
420
  if (this.#t) if (this.mode === "slot") {
376
- let e = this.#u().filter((e) => e !== this.#e), t = this.#c >= 0 && this.#c < e.length ? e[this.#c] : null;
421
+ let e = this.#p().filter((e) => e !== this.#e), t = this.#c >= 0 && this.#c < e.length ? e[this.#c] : null;
377
422
  this.host.dispatchEvent(new CustomEvent("ui-drop", {
378
423
  bubbles: !0,
379
424
  composed: !0,
@@ -384,8 +429,19 @@ var h = class {
384
429
  insertBefore: t
385
430
  }
386
431
  }));
432
+ } else if (this.mode === "preview") {
433
+ let e = this.#p(), t = this.#e ? e.indexOf(this.#e) : -1;
434
+ this.#u = null, this.#d = null, this.host.dispatchEvent(new CustomEvent("ui-drop", {
435
+ bubbles: !0,
436
+ composed: !0,
437
+ detail: {
438
+ item: this.#e,
439
+ fromIndex: this.#s,
440
+ toIndex: t
441
+ }
442
+ }));
387
443
  } else {
388
- let e = this.#d(), t = e.find((e) => e.hasAttribute("drag-over")) ?? null, n = t ? e.indexOf(t) : -1;
444
+ let e = this.#m(), t = e.find((e) => e.hasAttribute("drag-over")) ?? null, n = t ? e.indexOf(t) : -1;
389
445
  this.host.dispatchEvent(new CustomEvent("ui-drop", {
390
446
  bubbles: !0,
391
447
  composed: !0,
@@ -397,29 +453,29 @@ var h = class {
397
453
  }
398
454
  }));
399
455
  }
400
- this.#C();
456
+ this.#O();
401
457
  }
402
458
  };
403
- #b = () => {
404
- this.#e && (this.#t && this.host.dispatchEvent(new CustomEvent("ui-drag-cancel", {
459
+ #T = () => {
460
+ this.#e && (this.#C(), this.#t && this.host.dispatchEvent(new CustomEvent("ui-drag-cancel", {
405
461
  bubbles: !0,
406
462
  composed: !0,
407
463
  detail: { item: this.#e }
408
- })), this.#C());
464
+ })), this.#O());
409
465
  };
410
- #x = (e) => {
411
- e.key === "Escape" && this.#e && (e.preventDefault(), this.host.dispatchEvent(new CustomEvent("ui-drag-cancel", {
466
+ #E = (e) => {
467
+ e.key === "Escape" && this.#e && (e.preventDefault(), this.#C(), this.host.dispatchEvent(new CustomEvent("ui-drag-cancel", {
412
468
  bubbles: !0,
413
469
  composed: !0,
414
470
  detail: { item: this.#e }
415
- })), this.#C());
471
+ })), this.#O());
416
472
  };
417
- #S(e) {
473
+ #D(e) {
418
474
  if (!this.#e) return;
419
475
  let t = this.#e.getBoundingClientRect(), n = this.#e.cloneNode(!0);
420
- n.setAttribute("popover", "manual"), n.setAttribute("aria-hidden", "true"), this.host.appendChild(n), n.showPopover(), n.style.position = "fixed", n.style.inset = "unset", n.style.left = `${t.left}px`, n.style.top = `${t.top}px`, n.style.width = `${t.width}px`, n.style.height = `${t.height}px`, n.style.margin = "0", n.style.pointerEvents = "none", n.style.opacity = "0.8", n.style.transformOrigin = "center center", n.style.border = "none", n.style.outline = "none", this.#t = n, this.#r = e.clientX, this.#i = e.clientY;
476
+ n.setAttribute("popover", "manual"), n.setAttribute("aria-hidden", "true"), document.body.appendChild(n), n.showPopover(), n.style.position = "fixed", n.style.inset = "unset", n.style.left = `${t.left}px`, n.style.top = `${t.top}px`, n.style.width = `${t.width}px`, n.style.height = `${t.height}px`, n.style.margin = "0", n.style.pointerEvents = "none", n.style.opacity = "0.8", n.style.transformOrigin = "center center", n.style.border = "none", n.style.outline = "none", this.#t = n, this.#r = e.clientX, this.#i = e.clientY;
421
477
  }
422
- #C() {
478
+ #O() {
423
479
  if (this.#t) {
424
480
  if (this.#t.isConnected) try {
425
481
  this.#t.hidePopover();
@@ -427,12 +483,12 @@ var h = class {
427
483
  this.#t.remove(), this.#t = null;
428
484
  }
429
485
  this.#e && this.#e.removeAttribute("dragging");
430
- let e = this.#d();
431
- if (this.mode === "slot") this.#v(e);
486
+ let e = this.#m();
487
+ if (this.mode === "slot") this.#x(e);
432
488
  else for (let t of e) t.removeAttribute("drag-over"), t.style.removeProperty("outline"), t.style.removeProperty("outline-offset");
433
- this.#n &&= (this.#n.remove(), null), this.#e = null, this.#s = -1, this.#c = -1, document.removeEventListener("pointermove", this.#h), document.removeEventListener("pointerup", this.#y), document.removeEventListener("pointercancel", this.#b), document.removeEventListener("keydown", this.#x);
489
+ this.#n &&= (this.#n.remove(), null), this.#e = null, this.#s = -1, this.#c = -1, this.#u = null, this.#d = null, this.#f = -1, document.removeEventListener("pointermove", this.#v), document.removeEventListener("pointerup", this.#w), document.removeEventListener("pointercancel", this.#T), document.removeEventListener("keydown", this.#E);
434
490
  }
435
- }, g = class {
491
+ }, v = class {
436
492
  host;
437
493
  handleSelector;
438
494
  axis;
@@ -515,7 +571,7 @@ var h = class {
515
571
  #d() {
516
572
  this.#i = !1, this.host.removeAttribute("resizing"), document.removeEventListener("pointermove", this.#s), document.removeEventListener("pointerup", this.#c), document.removeEventListener("pointercancel", this.#l), document.removeEventListener("keydown", this.#u);
517
573
  }
518
- }, _ = class {
574
+ }, y = class {
519
575
  host;
520
576
  disabled;
521
577
  #e = !1;
@@ -562,7 +618,7 @@ var h = class {
562
618
  detail: { pointerType: "keyboard" }
563
619
  })));
564
620
  };
565
- }, v = class {
621
+ }, b = class {
566
622
  host;
567
623
  selector;
568
624
  orientation;
@@ -616,7 +672,7 @@ var h = class {
616
672
  let r = e[t];
617
673
  r && (r.setAttribute("tabindex", "0"), r.focus());
618
674
  }
619
- }, y = class {
675
+ }, x = class {
620
676
  host;
621
677
  #e = 0;
622
678
  constructor(e) {
@@ -624,21 +680,21 @@ var h = class {
624
680
  }
625
681
  enable() {
626
682
  this.#e = requestAnimationFrame(() => {
627
- this.#e = 0, m().dismissStack.push(this.host);
683
+ this.#e = 0, g().dismissStack.push(this.host);
628
684
  });
629
685
  }
630
686
  disable() {
631
- this.#e &&= (cancelAnimationFrame(this.#e), 0), m().dismissStack.remove(this.host);
687
+ this.#e &&= (cancelAnimationFrame(this.#e), 0), g().dismissStack.remove(this.host);
632
688
  }
633
689
  destroy() {
634
- this.#e &&= (cancelAnimationFrame(this.#e), 0), m().dismissStack.remove(this.host);
690
+ this.#e &&= (cancelAnimationFrame(this.#e), 0), g().dismissStack.remove(this.host);
635
691
  }
636
- }, b = class {
692
+ }, S = class {
637
693
  host;
638
694
  #e;
639
695
  #t = null;
640
696
  constructor(e) {
641
- this.host = e, this.#e = new y(e);
697
+ this.host = e, this.#e = new x(e);
642
698
  }
643
699
  wirePopover(e, t) {
644
700
  this.#t = t;
@@ -661,7 +717,7 @@ var h = class {
661
717
  destroy() {
662
718
  this.#e.destroy(), this.#t = null;
663
719
  }
664
- }, x = class {
720
+ }, C = class {
665
721
  host;
666
722
  listValue = t(null);
667
723
  itemSelector;
@@ -678,7 +734,7 @@ var h = class {
678
734
  cancelable: !0,
679
735
  detail: t
680
736
  }));
681
- }), this.#e = new v(e, {
737
+ }), this.#e = new b(e, {
682
738
  selector: this.itemSelector,
683
739
  orientation: t.orientation ?? "vertical",
684
740
  wrap: t.wrap ?? !0,
@@ -689,7 +745,7 @@ var h = class {
689
745
  n(() => {
690
746
  let t = this.listValue.value, n = e.querySelectorAll(this.itemSelector), r = this.ariaAttr === "aria-current";
691
747
  for (let e of n) {
692
- let n = e.value;
748
+ let n = e.getAttribute("value") ?? e.value;
693
749
  if (n !== void 0) {
694
750
  let i = n === t;
695
751
  r ? i ? e.setAttribute("aria-current", "page") : e.removeAttribute("aria-current") : e.setAttribute(this.ariaAttr, i ? "true" : "false");
@@ -717,7 +773,7 @@ var h = class {
717
773
  let t = e.detail;
718
774
  this.onChildSelect(t);
719
775
  };
720
- }, S = class {
776
+ }, w = class {
721
777
  host;
722
778
  #e = null;
723
779
  #t;
@@ -751,4 +807,4 @@ var h = class {
751
807
  t !== e && e.appendChild(t), this.host.appendChild(e), this.#e = e, e.addEventListener("cancel", this.#n), e.addEventListener("click", this.#r), this.host.addEventListener("ui-dismiss", this.#i);
752
808
  }
753
809
  };
754
- export { a as _, v as a, h as c, m as d, u as f, o as g, s as h, y as i, d as l, c as m, x as n, _ as o, l as p, b as r, g as s, S as t, f as u, i as v };
810
+ export { s as _, b as a, _ as c, g as d, f, c as g, l as h, x as i, p as l, u as m, C as n, y as o, d as p, S as r, v as s, w as t, m as u, o as v, a as y };
@@ -7008,6 +7008,14 @@
7008
7008
  height: 100%;
7009
7009
  }
7010
7010
 
7011
+ /* WHY: Unregistered icons (no SVG content) should collapse to zero size
7012
+ so surrounding buttons/slots don't render with phantom dimensions */
7013
+ :where(ui-icon:empty) {
7014
+ width: 0;
7015
+ height: 0;
7016
+ overflow: hidden;
7017
+ }
7018
+
7011
7019
  /* ── Icon Size Variants ── */
7012
7020
 
7013
7021
  :where(ui-icon[size="xs"]) { --ui-icon-size: var(--ui-icon-xs); }
@@ -7084,6 +7084,14 @@
7084
7084
  height: 100%;
7085
7085
  }
7086
7086
 
7087
+ /* WHY: Unregistered icons (no SVG content) should collapse to zero size
7088
+ so surrounding buttons/slots don't render with phantom dimensions */
7089
+ :where(ui-icon:empty) {
7090
+ width: 0;
7091
+ height: 0;
7092
+ overflow: hidden;
7093
+ }
7094
+
7087
7095
  /* ── Icon Size Variants ── */
7088
7096
 
7089
7097
  :where(ui-icon[size="xs"]) { --ui-icon-size: var(--ui-icon-xs); }
package/dist/native-ui.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { a as e, i as t, n, o as ee, r as te, t as ne } from "./uid.js";
2
2
  import { A as re, B as ie, C as r, D as i, E as a, F as o, G as s, H as c, I as l, L as u, M as d, N as f, O as p, P as m, R as h, S as g, T as _, U as v, V as y, W as b, _ as x, a as S, b as C, c as w, d as T, f as E, g as D, h as O, i as k, j as A, k as j, l as M, m as N, n as P, o as F, p as I, r as L, s as R, t as z, u as B, v as V, w as H, x as U, y as W, z as G } from "./register-all2.js";
3
- import { _ as K, a as q, c as J, d as Y, f as ae, g as oe, h as se, i as ce, l as le, m as ue, n as de, o as fe, p as X, r as pe, s as Z, t as me, u as he, v as ge } from "./dialog-controller.js";
3
+ import { _ as K, a as q, c as J, d as Y, f as ae, g as oe, h as se, i as ce, l as le, m as ue, n as de, o as fe, p as X, r as pe, s as Z, t as me, u as he, y as ge } from "./dialog-controller.js";
4
4
  import { $ as _e, A as ve, B as ye, C as be, Ct as xe, D as Se, E as Ce, F as we, G as Te, H as Ee, I as De, J as Oe, K as ke, L as Ae, M as je, N as Q, O as Me, P as Ne, Q as Pe, R as Fe, S as Ie, St as Le, T as Re, Tt as ze, U as Be, V as Ve, W as He, X as Ue, Y as We, Z as Ge, _ as Ke, _t as qe, a as Je, at as Ye, b as Xe, bt as Ze, c as Qe, ct as $e, d as et, dt as tt, et as nt, f as rt, ft as it, g as at, gt as ot, h as st, ht as ct, i as lt, it as ut, j as dt, k as ft, l as pt, lt as mt, m as ht, mt as gt, n as _t, nt as vt, o as yt, ot as bt, p as xt, pt as St, q as Ct, r as wt, rt as Tt, s as Et, st as Dt, t as Ot, tt as kt, u as At, ut as jt, v as Mt, vt as Nt, w as Pt, wt as Ft, x as It, xt as Lt, y as Rt, yt as zt, z as Bt } from "./ui-icon-element.js";
5
5
  var $ = class extends Event {
6
6
  context;
@@ -1,5 +1,5 @@
1
1
  import { c as e, l as t, s as n, u as r } from "./uid.js";
2
- import { a as i, c as a, d as o, i as s, n as c, o as l, r as ee, s as te, t as u, v as d } from "./dialog-controller.js";
2
+ import { a as i, c as a, d as o, i as s, n as c, o as l, r as ee, s as te, t as u, y as d } from "./dialog-controller.js";
3
3
  function f(t) {
4
4
  let n = e();
5
5
  r(null);
@@ -2,17 +2,17 @@ export interface DragOptions {
2
2
  selector: string;
3
3
  dropZoneSelector?: string;
4
4
  axis?: 'vertical' | 'horizontal' | 'both';
5
- mode?: 'drop' | 'slot';
5
+ mode?: 'drop' | 'slot' | 'preview';
6
6
  disabled?: boolean;
7
7
  }
8
- /** Enables pointer-driven drag-and-drop with drop mode or slot-based reordering. */
8
+ /** Enables pointer-driven drag-and-drop with drop, slot, or preview reordering. */
9
9
  export declare class DragController {
10
10
  #private;
11
11
  readonly host: HTMLElement;
12
12
  selector: string;
13
13
  dropZoneSelector: string;
14
14
  axis: 'vertical' | 'horizontal' | 'both';
15
- mode: 'drop' | 'slot';
15
+ mode: 'drop' | 'slot' | 'preview';
16
16
  disabled: boolean;
17
17
  constructor(host: HTMLElement, options: DragOptions);
18
18
  attach(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"drag-controller.d.ts","sourceRoot":"","sources":["../../src/traits/drag-controller.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,oFAAoF;AACpF,qBAAa,cAAc;;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;gBAaN,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW;IAUnD,MAAM,IAAI,IAAI;IAQd,MAAM,IAAI,IAAI;IASd,OAAO,IAAI,IAAI;CAoYhB"}
1
+ {"version":3,"file":"drag-controller.d.ts","sourceRoot":"","sources":["../../src/traits/drag-controller.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,mFAAmF;AACnF,qBAAa,cAAc;;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;gBAkBN,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW;IAUnD,MAAM,IAAI,IAAI;IAQd,MAAM,IAAI,IAAI;IASd,OAAO,IAAI,IAAI;CA8fhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-navigate-controller.d.ts","sourceRoot":"","sources":["../../src/traits/list-navigate-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;IACjD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAC1C;AAED,wGAAwG;AACxG,qBAAa,sBAAsB;;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAgB;IAEzD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;gBAKtD,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,mBAAwB;IAoDhE,MAAM,IAAI,IAAI;IAMd,MAAM,IAAI,IAAI;IAMd,OAAO,IAAI,IAAI;IAKf,8EAA8E;IAC9E,IAAI,WAAW,IAAI,qBAAqB,CAEvC;CAOF"}
1
+ {"version":3,"file":"list-navigate-controller.d.ts","sourceRoot":"","sources":["../../src/traits/list-navigate-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;IACjD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAC1C;AAED,wGAAwG;AACxG,qBAAa,sBAAsB;;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAgB;IAEzD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;gBAKtD,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,mBAAwB;IAuDhE,MAAM,IAAI,IAAI;IAMd,MAAM,IAAI,IAAI;IAMd,OAAO,IAAI,IAAI;IAKf,8EAA8E;IAC9E,IAAI,WAAW,IAAI,qBAAqB,CAEvC;CAOF"}
package/dist/traits.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { a as e, i as t, n, o as r, r as i, t as a } from "./uid.js";
2
2
  import { A as o, B as s, C as c, D as l, E as u, F as d, G as f, H as p, I as m, L as h, M as g, N as _, O as v, P as y, R as b, S as x, T as S, U as C, V as w, W as T, _ as E, a as D, b as O, c as k, d as A, f as j, g as M, h as N, i as P, j as F, k as I, l as L, m as R, n as z, o as B, p as V, r as H, s as U, t as W, u as G, v as K, w as q, x as J, y as Y, z as X } from "./register-all2.js";
3
- import { _ as Z, a as Q, c as $, d as ee, g as te, h as ne, i as re, l as ie, m as ae, n as oe, o as se, p as ce, r as le, s as ue, t as de, u as fe, v as pe } from "./dialog-controller.js";
3
+ import { _ as Z, a as Q, c as $, d as ee, g as te, h as ne, i as re, l as ie, m as ae, n as oe, o as se, p as ce, r as le, s as ue, t as de, u as fe, y as pe } from "./dialog-controller.js";
4
4
  export { d as ClipboardController, l as CollapsibleController, _ as CopyController, de as DialogController, re as DismissController, ie as DismissStack, $ as DragController, F as DropZoneController, m as EditController, v as FocusTrapController, y as HoverController, g as IntersectController, oe as ListNavigateController, le as PopoverController, se as PressController, w as RangeSelectController, ue as ResizeController, Q as RovingFocusController, b as SearchController, X as SelectionController, o as SortController, h as SwipeController, u as ToastController, fe as ToastManager, ce as UIElement, I as ValidateController, s as VirtualScrollController, i as batch, P as clippableAdapter, E as collapsibleAdapter, ae as collectTraitOptions, e as computed, c as copyableAdapter, p as debugReactive, n as define, A as dialogableAdapter, N as dismissableAdapter, G as draggableAdapter, J as droppableAdapter, z as editableAdapter, t as effect, K as focusTrappableAdapter, te as getRegisteredTraitNames, Z as getTrait, ee as getTraitRuntime, q as hoverableAdapter, x as intersectableAdapter, C as isComputed, T as isSignal, j as listNavigableAdapter, ne as parseTraitAttribute, V as popoverableAdapter, S as pressableAdapter, L as rangeSelectableAdapter, W as registerAllTraits, pe as registerTrait, k as resizableAdapter, M as rovingFocusableAdapter, D as searchableAdapter, B as selectableAdapter, r as signal, O as sortableAdapter, H as swipeableAdapter, R as toastableAdapter, a as uid, f as untrack, Y as validatableAdapter, U as virtualizableAdapter };