@mhmo91/schmancy 0.9.17 → 0.9.19

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 (111) hide show
  1. package/custom-elements.json +85 -46
  2. package/dist/agent/index.es-Dymj8REP.js +489 -0
  3. package/dist/agent/index.es-Dymj8REP.js.map +1 -0
  4. package/dist/agent/schmancy.agent.js +239 -580
  5. package/dist/agent/schmancy.agent.js.map +1 -1
  6. package/dist/agent/schmancy.manifest.json +198 -18
  7. package/dist/badge.cjs +1 -1
  8. package/dist/badge.js +1 -1
  9. package/dist/breadcrumb.cjs.map +1 -1
  10. package/dist/breadcrumb.js.map +1 -1
  11. package/dist/content-drawer.cjs +1 -1
  12. package/dist/content-drawer.js +1 -1
  13. package/dist/dialog.cjs.map +1 -1
  14. package/dist/dialog.js.map +1 -1
  15. package/dist/dropdown.cjs.map +1 -1
  16. package/dist/dropdown.js.map +1 -1
  17. package/dist/{flow-BGkHnOnd.js.map → flow-BPDtbhLe.js.map} +1 -1
  18. package/dist/{flow-ClAJ6Qby.cjs.map → flow-Dn9AZktE.cjs.map} +1 -1
  19. package/dist/handover/agent-runtime-followups.md +1 -1
  20. package/dist/handover/agent-runtime-v1.md +3 -3
  21. package/dist/index.cjs +1 -1
  22. package/dist/index.es-BgmFX1JM.cjs +1 -0
  23. package/dist/index.es-BgmFX1JM.cjs.map +1 -0
  24. package/dist/index.es-CLyb_o3Y.js +489 -0
  25. package/dist/index.es-CLyb_o3Y.js.map +1 -0
  26. package/dist/index.js +4 -4
  27. package/dist/list-BpjKUOzM.js.map +1 -1
  28. package/dist/list-CMWHu6cV.cjs.map +1 -1
  29. package/dist/menu-BIBUgS1T.js.map +1 -1
  30. package/dist/menu-DS8Iz4fJ.cjs.map +1 -1
  31. package/dist/nav-drawer.cjs +1 -1
  32. package/dist/nav-drawer.js +1 -1
  33. package/dist/navigation-bar.cjs +1 -1
  34. package/dist/navigation-bar.js +1 -1
  35. package/dist/navigation-rail.cjs.map +1 -1
  36. package/dist/navigation-rail.js.map +1 -1
  37. package/dist/sheet-DdlZhnDG.cjs.map +1 -1
  38. package/dist/sheet-LFVo5iN4.js.map +1 -1
  39. package/dist/{splash-screen-COg3Z6n8.js.map → splash-screen-BHgb3c3Q.js.map} +1 -1
  40. package/dist/{splash-screen-C9HqX2nR.cjs.map → splash-screen-DteUfSV3.cjs.map} +1 -1
  41. package/dist/splash-screen.cjs +1 -1
  42. package/dist/splash-screen.js +1 -1
  43. package/dist/{src-C7niWYur.js → src-BGj6ufWS.js} +4 -4
  44. package/dist/src-BGj6ufWS.js.map +1 -0
  45. package/dist/{src-I4M33WK2.cjs → src-BPKGdQdp.cjs} +1 -1
  46. package/dist/src-BPKGdQdp.cjs.map +1 -0
  47. package/dist/{table-B-DsOqzT.cjs → table-DFlJhG5E.cjs} +1 -1
  48. package/dist/{table-B-DsOqzT.cjs.map → table-DFlJhG5E.cjs.map} +1 -1
  49. package/dist/{table-hBEZRxM_.js → table-Dwt66SR6.js} +1 -1
  50. package/dist/{table-hBEZRxM_.js.map → table-Dwt66SR6.js.map} +1 -1
  51. package/dist/table.cjs +1 -1
  52. package/dist/table.js +1 -1
  53. package/dist/teleport.cjs +1 -1
  54. package/dist/teleport.js +1 -1
  55. package/dist/typewriter.cjs +123 -1
  56. package/dist/typewriter.cjs.map +1 -0
  57. package/dist/typewriter.js +214 -2
  58. package/dist/typewriter.js.map +1 -0
  59. package/dist/{utils-xBXLvebz.js.map → utils-Bp2jhyZc.js.map} +1 -1
  60. package/dist/{utils-2qrmPb78.cjs.map → utils-CBPQvxNW.cjs.map} +1 -1
  61. package/dist/utils.cjs +1 -1
  62. package/dist/utils.js +1 -1
  63. package/package.json +1 -1
  64. package/src/breadcrumb/breadcrumb.ts +14 -4
  65. package/src/dialog/dialog.component.ts +9 -9
  66. package/src/dropdown/dropdown-component.ts +13 -1
  67. package/src/dropdown/dropdown-content.ts +11 -3
  68. package/src/list/list-item.ts +10 -0
  69. package/src/list/list.ts +7 -8
  70. package/src/menu/menu-item.ts +13 -0
  71. package/src/menu/menu.ts +10 -22
  72. package/src/nav-drawer/appbar.ts +11 -0
  73. package/src/nav-drawer/content.ts +11 -0
  74. package/src/nav-drawer/drawer.ts +15 -0
  75. package/src/nav-drawer/navbar.ts +14 -0
  76. package/src/navigation-bar/navigation-bar-item.ts +3 -4
  77. package/src/navigation-bar/navigation-bar.ts +3 -9
  78. package/src/navigation-rail/navigation-rail-item.ts +3 -7
  79. package/src/navigation-rail/navigation-rail.ts +12 -8
  80. package/src/sheet/sheet.ts +17 -0
  81. package/src/typewriter/typewriter.ts +26 -4
  82. package/types/src/breadcrumb/breadcrumb.d.ts +14 -4
  83. package/types/src/dialog/dialog.component.d.ts +9 -9
  84. package/types/src/dropdown/dropdown-component.d.ts +13 -1
  85. package/types/src/dropdown/dropdown-content.d.ts +11 -3
  86. package/types/src/list/list-item.d.ts +10 -0
  87. package/types/src/list/list.d.ts +7 -8
  88. package/types/src/menu/menu-item.d.ts +13 -0
  89. package/types/src/menu/menu.d.ts +10 -22
  90. package/types/src/nav-drawer/appbar.d.ts +11 -0
  91. package/types/src/nav-drawer/content.d.ts +11 -0
  92. package/types/src/nav-drawer/drawer.d.ts +15 -0
  93. package/types/src/nav-drawer/navbar.d.ts +14 -0
  94. package/types/src/navigation-bar/navigation-bar-item.d.ts +3 -4
  95. package/types/src/navigation-bar/navigation-bar.d.ts +3 -9
  96. package/types/src/navigation-rail/navigation-rail-item.d.ts +3 -7
  97. package/types/src/navigation-rail/navigation-rail.d.ts +12 -8
  98. package/types/src/sheet/sheet.d.ts +17 -0
  99. package/types/src/typewriter/typewriter.d.ts +4 -1
  100. package/dist/src-C7niWYur.js.map +0 -1
  101. package/dist/src-I4M33WK2.cjs.map +0 -1
  102. package/dist/typewriter-DyN7xa0n.js +0 -701
  103. package/dist/typewriter-DyN7xa0n.js.map +0 -1
  104. package/dist/typewriter-LK0S4NEr.cjs +0 -123
  105. package/dist/typewriter-LK0S4NEr.cjs.map +0 -1
  106. /package/dist/{flow-BGkHnOnd.js → flow-BPDtbhLe.js} +0 -0
  107. /package/dist/{flow-ClAJ6Qby.cjs → flow-Dn9AZktE.cjs} +0 -0
  108. /package/dist/{splash-screen-COg3Z6n8.js → splash-screen-BHgb3c3Q.js} +0 -0
  109. /package/dist/{splash-screen-C9HqX2nR.cjs → splash-screen-DteUfSV3.cjs} +0 -0
  110. /package/dist/{utils-xBXLvebz.js → utils-Bp2jhyZc.js} +0 -0
  111. /package/dist/{utils-2qrmPb78.cjs → utils-CBPQvxNW.cjs} +0 -0
@@ -29293,494 +29293,7 @@ var rp = class extends B(I`
29293
29293
  }
29294
29294
  };
29295
29295
  P([L({ type: Boolean })], rp.prototype, "open", void 0), P([z("#toggler")], rp.prototype, "toggler", void 0), P([z("slot:not([name=\"root\"])")], rp.prototype, "defaultSlot", void 0), P([z("#chevron")], rp.prototype, "chevron", void 0), rp = P([F("schmancy-tree")], rp);
29296
- var ip = (e) => Array.isArray(e), ap = (e) => ip(e) ? e : [e], op = "data-typeit-id", sp = "ti-cursor", cp = {
29297
- started: !1,
29298
- completed: !1,
29299
- frozen: !1,
29300
- destroyed: !1
29301
- }, lp = {
29302
- breakLines: !0,
29303
- cursor: {
29304
- autoPause: !0,
29305
- autoPauseDelay: 500,
29306
- animation: {
29307
- frames: [
29308
- 0,
29309
- 0,
29310
- 1
29311
- ].map((e) => ({ opacity: e })),
29312
- options: {
29313
- iterations: Infinity,
29314
- easing: "steps(2, start)",
29315
- fill: "forwards"
29316
- }
29317
- }
29318
- },
29319
- cursorChar: "|",
29320
- cursorSpeed: 1e3,
29321
- deleteSpeed: null,
29322
- html: !0,
29323
- lifeLike: !0,
29324
- loop: !1,
29325
- loopDelay: 750,
29326
- nextStringDelay: 750,
29327
- speed: 100,
29328
- startDelay: 250,
29329
- startDelete: !1,
29330
- strings: [],
29331
- waitUntilVisible: !1,
29332
- beforeString: () => {},
29333
- afterString: () => {},
29334
- beforeStep: () => {},
29335
- afterStep: () => {},
29336
- afterComplete: () => {}
29337
- }, up = `[${op}]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}`, dp = (e) => document.createElement(e), fp = (e) => document.createTextNode(e), pp = (e, t = "") => {
29338
- let n = dp("style");
29339
- n.id = t, n.appendChild(fp(e)), document.head.appendChild(n);
29340
- }, mp = (e) => (ip(e) || (e = [e / 2, e / 2]), e), hp = (e, t) => Math.abs(Math.random() * (e + t - (e - t)) + (e - t)), gp = (e) => e / 2, _p = (e) => Array.from(e), vp = (e) => ([...e.childNodes].forEach((e) => {
29341
- if (e.nodeValue) return [...e.nodeValue].forEach((t) => {
29342
- e.parentNode.insertBefore(fp(t), e);
29343
- }), void e.remove();
29344
- vp(e);
29345
- }), e), yp = (e) => {
29346
- let t = document.implementation.createHTMLDocument();
29347
- return t.body.innerHTML = e, vp(t.body);
29348
- };
29349
- function bp(e, t = !1, n = !1) {
29350
- let r, i = e.querySelector(`.${sp}`), a = document.createTreeWalker(e, NodeFilter.SHOW_ALL, { acceptNode: (e) => {
29351
- if (i && n) {
29352
- if (e.classList?.contains(sp)) return NodeFilter.FILTER_ACCEPT;
29353
- if (i.contains(e)) return NodeFilter.FILTER_REJECT;
29354
- }
29355
- return e.classList?.contains(sp) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT;
29356
- } }), o = [];
29357
- for (; r = a.nextNode();) r.originalParent ||= r.parentNode, o.push(r);
29358
- return t ? o.reverse() : o;
29359
- }
29360
- function xp(e, t = !0) {
29361
- return t ? bp(yp(e)) : _p(e).map(fp);
29362
- }
29363
- var Sp = ({ index: e, newIndex: t, queueItems: n, cleanUp: r }) => {
29364
- for (let i = e + 1; i < t + 1; i++) r(n[i][0]);
29365
- }, Cp = (e) => Number.isInteger(e), wp = ({ queueItems: e, selector: t, cursorPosition: n, to: r }) => {
29366
- if (Cp(t)) return -1 * t;
29367
- let i = (/* @__PURE__ */ RegExp("END", "i")).test(r), a = t ? [...e].reverse().findIndex(({ char: e }) => {
29368
- let n = e.parentElement, r = n.matches(t);
29369
- return !(!i || !r) || r && n.firstChild.isSameNode(e);
29370
- }) : -1;
29371
- return a < 0 && (a = i ? 0 : e.length - 1), a - n + +!i;
29372
- }, Tp = (e, t) => Array(t).fill(e), Ep = (e) => new Promise((t) => {
29373
- requestAnimationFrame(async () => {
29374
- t(await e());
29375
- });
29376
- }), Dp = (e) => e?.getAnimations().find((t) => t.id === e.dataset.tiAnimationId), Op = ({ cursor: e, frames: t, options: n }) => {
29377
- let r = e.animate(t, n);
29378
- return r.pause(), r.id = e.dataset.tiAnimationId, Ep(() => {
29379
- Ep(() => {
29380
- r.play();
29381
- });
29382
- }), r;
29383
- }, kp = (e) => e.func?.call(null), Ap = async ({ index: e, queueItems: t, wait: n, cursor: r, cursorOptions: i }) => {
29384
- let a = t[e][1], o = [], s = e, c = a, l = () => c && !c.delay, u = a.shouldPauseCursor() && i.autoPause;
29385
- for (; l();) o.push(c), l() && s++, c = t[s] ? t[s][1] : null;
29386
- if (o.length) return await Ep(async () => {
29387
- for (let e of o) await kp(e);
29388
- }), s - 1;
29389
- let d, f = Dp(r);
29390
- return f && (d = {
29391
- ...f.effect.getComputedTiming(),
29392
- delay: u ? i.autoPauseDelay : 0
29393
- }), await n(async () => {
29394
- f && u && f.cancel(), await Ep(() => {
29395
- kp(a);
29396
- });
29397
- }, a.delay), await (({ cursor: e, options: t, cursorOptions: n }) => {
29398
- if (!e || !n) return;
29399
- let r, i = Dp(e);
29400
- i && (t.delay = i.effect.getComputedTiming().delay, r = i.currentTime, i.cancel());
29401
- let a = Op({
29402
- cursor: e,
29403
- frames: n.animation.frames,
29404
- options: t
29405
- });
29406
- return r && (a.currentTime = r), a;
29407
- })({
29408
- cursor: r,
29409
- options: d,
29410
- cursorOptions: i
29411
- }), e;
29412
- }, jp = (e) => "value" in e, Mp = (e) => typeof e == "function" ? e() : e, Np = (e, t = document, n = !1) => t["querySelector" + (n ? "All" : "")](e), Pp = (e, t) => Object.assign({}, e, t), Fp = {
29413
- "font-family": "",
29414
- "font-weight": "",
29415
- "font-size": "",
29416
- "font-style": "",
29417
- "line-height": "",
29418
- color: "",
29419
- transform: "translateX(-.125em)"
29420
- }, Ip = class {
29421
- element;
29422
- timeouts;
29423
- cursorPosition;
29424
- predictedCursorPosition;
29425
- statuses = {
29426
- started: !1,
29427
- completed: !1,
29428
- frozen: !1,
29429
- destroyed: !1,
29430
- firing: !1
29431
- };
29432
- opts;
29433
- id;
29434
- queue;
29435
- cursor;
29436
- flushCallback = null;
29437
- unfreeze = () => {};
29438
- constructor(e, t = {}) {
29439
- var n;
29440
- this.opts = Pp(lp, t), this.element = typeof (n = e) == "string" ? Np(n) : n, this.timeouts = [], this.cursorPosition = 0, this.unfreeze = () => {}, this.predictedCursorPosition = null, this.statuses = Pp({}, cp), this.id = Math.random().toString().substring(2, 9), this.queue = function(e) {
29441
- let t = function(e) {
29442
- return ap(e).forEach((e) => a.set(Symbol(e.char?.innerText), n({ ...e }))), this;
29443
- }, n = (e) => (e.shouldPauseCursor = function() {
29444
- return !!(this.typeable || this.cursorable || this.deletable);
29445
- }, e), r = () => a, i = () => Array.from(a.values()), a = /* @__PURE__ */ new Map();
29446
- return t(e), {
29447
- add: t,
29448
- set: function(e, t) {
29449
- let r = [...a.keys()];
29450
- a.set(r[e], n(t));
29451
- },
29452
- wipe: function() {
29453
- a = /* @__PURE__ */ new Map(), t(e);
29454
- },
29455
- done: (e, t = !1) => t ? a.delete(e) : a.get(e).done = !0,
29456
- reset: function() {
29457
- a.forEach((e) => delete e.done);
29458
- },
29459
- destroy: (e) => a.delete(e),
29460
- getItems: (e = !1) => e ? i() : i().filter((e) => !e.done),
29461
- getQueue: r,
29462
- getTypeable: () => i().filter((e) => e.typeable),
29463
- getPendingQueueItems: () => {
29464
- let e = [];
29465
- for (let [, t] of r()) t.done || e.push(t);
29466
- return e;
29467
- }
29468
- };
29469
- }([{ delay: this.opts.startDelay }]), this.#p(t), this.cursor = this.#h(), this.element.dataset.typeitId = this.id, pp(up), this.opts.strings.length && this.#f();
29470
- }
29471
- go() {
29472
- return this.statuses.started ? this : (this.#o(), this.opts.waitUntilVisible ? (e = this.element, t = this.#t.bind(this), new IntersectionObserver((n, r) => {
29473
- n.forEach((n) => {
29474
- n.isIntersecting && (t(), r.unobserve(e));
29475
- });
29476
- }, { threshold: 1 }).observe(e), this) : (this.#t(), this));
29477
- var e, t;
29478
- }
29479
- destroy(e = !0) {
29480
- this.timeouts = (this.timeouts.forEach(clearTimeout), []), Mp(e) && this.cursor && this.#y(this.cursor), this.statuses.destroyed = !0;
29481
- }
29482
- reset(e) {
29483
- !this.is("destroyed") && this.destroy(), e ? (this.queue.wipe(), e(this)) : this.queue.reset(), this.cursorPosition = 0;
29484
- for (let e in this.statuses) this.statuses[e] = !1;
29485
- return this.element[this.#s() ? "value" : "innerHTML"] = "", this;
29486
- }
29487
- is = function(e) {
29488
- return this.statuses[e];
29489
- };
29490
- type(e, t = {}) {
29491
- e = Mp(e);
29492
- let { instant: n } = t, r = this.#u(t), i = xp(e, this.opts.html).map((e) => {
29493
- return {
29494
- func: () => this.#_(e),
29495
- char: e,
29496
- delay: n || (t = e, /<(.+)>(.*?)<\/(.+)>/.test(t.outerHTML)) ? 0 : this.#b(),
29497
- typeable: e.nodeType === Node.TEXT_NODE
29498
- };
29499
- var t;
29500
- }), a = [
29501
- r[0],
29502
- { func: async () => await this.opts.beforeString(e, this) },
29503
- ...i,
29504
- { func: async () => await this.opts.afterString(e, this) },
29505
- r[1]
29506
- ];
29507
- return this.#c(a, t);
29508
- }
29509
- break(e = {}) {
29510
- return this.#c({
29511
- func: () => this.#_(dp("BR")),
29512
- typeable: !0
29513
- }, e);
29514
- }
29515
- move(e, t = {}) {
29516
- e = Mp(e);
29517
- let n = this.#u(t), { instant: r, to: i } = t, a = wp({
29518
- queueItems: this.queue.getTypeable(),
29519
- selector: e === null ? "" : e,
29520
- to: i,
29521
- cursorPosition: this.#x
29522
- }), o = a < 0 ? -1 : 1;
29523
- return this.predictedCursorPosition = this.#x + a, this.#c([
29524
- n[0],
29525
- ...Tp({
29526
- func: () => this.#n(o),
29527
- delay: r ? 0 : this.#b(),
29528
- cursorable: !0
29529
- }, Math.abs(a)),
29530
- n[1]
29531
- ], t);
29532
- }
29533
- exec(e, t = {}) {
29534
- let n = this.#u(t);
29535
- return this.#c([
29536
- n[0],
29537
- { func: () => e(this) },
29538
- n[1]
29539
- ], t);
29540
- }
29541
- options(e, t = {}) {
29542
- return e = Mp(e), this.#d(e), this.#c({}, t);
29543
- }
29544
- pause(e, t = {}) {
29545
- return this.#c({ delay: Mp(e) }, t);
29546
- }
29547
- delete(e = null, t = {}) {
29548
- e = Mp(e);
29549
- let n = this.#u(t), r = e, { instant: i, to: a } = t, o = this.queue.getTypeable(), s = r === null ? o.length : Cp(r) ? r : wp({
29550
- queueItems: o,
29551
- selector: r,
29552
- cursorPosition: this.#x,
29553
- to: a
29554
- });
29555
- return this.#c([
29556
- n[0],
29557
- ...Tp({
29558
- func: this.#v.bind(this),
29559
- delay: i ? 0 : this.#b(1),
29560
- deletable: !0
29561
- }, s),
29562
- n[1]
29563
- ], t);
29564
- }
29565
- freeze() {
29566
- this.statuses.frozen = !0;
29567
- }
29568
- flush(e = null) {
29569
- return this.flushCallback = e || this.flushCallback, this.statuses.firing || (this.#o(), this.#t(!1).then(() => {
29570
- if (this.queue.getPendingQueueItems().length > 0) return this.flush();
29571
- this.flushCallback(), this.flushCallback = null;
29572
- })), this;
29573
- }
29574
- getQueue() {
29575
- return this.queue;
29576
- }
29577
- getOptions() {
29578
- return this.opts;
29579
- }
29580
- updateOptions(e) {
29581
- return this.#d(e);
29582
- }
29583
- getElement() {
29584
- return this.element;
29585
- }
29586
- empty(e = {}) {
29587
- return this.#c({ func: this.#e.bind(this) }, e);
29588
- }
29589
- async #e() {
29590
- this.#s() ? this.element.value = "" : this.#w.forEach(this.#y.bind(this));
29591
- }
29592
- async #t(e = !0) {
29593
- this.statuses.started = !0, this.statuses.firing = !0;
29594
- let t = (t) => {
29595
- this.queue.done(t, !e);
29596
- };
29597
- try {
29598
- let n = [...this.queue.getQueue()];
29599
- for (let e = 0; e < n.length; e++) {
29600
- let [r, i] = n[e];
29601
- if (!i.done) {
29602
- if (!i.deletable || i.deletable && this.#w.length) {
29603
- let r = await this.#i(e, n);
29604
- Sp({
29605
- index: e,
29606
- newIndex: r,
29607
- queueItems: n,
29608
- cleanUp: t
29609
- }), e = r;
29610
- }
29611
- t(r);
29612
- }
29613
- }
29614
- if (!e) return this.statuses.firing = !1, this;
29615
- if (this.statuses.completed = !0, this.statuses.firing = !1, await this.opts.afterComplete(this), !this.opts.loop) throw "";
29616
- let r = this.opts.loopDelay;
29617
- this.#a(async () => {
29618
- await this.#r(r[0]), this.#t();
29619
- }, r[1]);
29620
- } catch {}
29621
- return this.statuses.firing = !1, this;
29622
- }
29623
- async #n(e) {
29624
- var t, n, r;
29625
- this.cursorPosition = (t = e, n = this.cursorPosition, r = this.#w, Math.min(Math.max(n + t, 0), r.length)), ((e, t, n) => {
29626
- let r = t[n - 1], i = Np(`.${sp}`, e);
29627
- (e = r?.parentNode || e).insertBefore(i, r || null);
29628
- })(this.element, this.#w, this.cursorPosition);
29629
- }
29630
- async #r(e) {
29631
- let t = this.#x;
29632
- t && await this.#n({ value: t });
29633
- let n = this.#w.map((e) => [Symbol(), {
29634
- func: this.#v.bind(this),
29635
- delay: this.#b(1),
29636
- deletable: !0,
29637
- shouldPauseCursor: () => !0
29638
- }]);
29639
- for (let e = 0; e < n.length; e++) await this.#i(e, n);
29640
- this.queue.reset(), this.queue.set(0, { delay: e });
29641
- }
29642
- #i(e, t) {
29643
- return Ap({
29644
- index: e,
29645
- queueItems: t,
29646
- wait: this.#a.bind(this),
29647
- cursor: this.cursor,
29648
- cursorOptions: this.opts.cursor
29649
- });
29650
- }
29651
- async #a(e, t, n = !1) {
29652
- this.statuses.frozen && await new Promise((e) => {
29653
- this.unfreeze = () => {
29654
- this.statuses.frozen = !1, e();
29655
- };
29656
- }), n || await this.opts.beforeStep(this), await ((e, t, n) => new Promise((r) => {
29657
- n.push(setTimeout(async () => {
29658
- await e(), r();
29659
- }, t || 0));
29660
- }))(e, t, this.timeouts), n || await this.opts.afterStep(this);
29661
- }
29662
- async #o() {
29663
- if (!this.#s() && this.cursor && this.element.appendChild(this.cursor), this.#C) {
29664
- ((e, t) => {
29665
- let n = `[${op}='${e}'] .${sp}`, r = getComputedStyle(t);
29666
- pp(`${n} { display: inline-block; width: 0; ${Object.entries(Fp).reduce((e, [t, n]) => `${e} ${t}: var(--ti-cursor-${t}, ${n || r[t]});`, "")} }`, e);
29667
- })(this.id, this.element), this.cursor.dataset.tiAnimationId = this.id;
29668
- let { animation: e } = this.opts.cursor, { frames: t, options: n } = e;
29669
- Op({
29670
- frames: t,
29671
- cursor: this.cursor,
29672
- options: {
29673
- duration: this.opts.cursorSpeed,
29674
- ...n
29675
- }
29676
- });
29677
- }
29678
- }
29679
- #s() {
29680
- return jp(this.element);
29681
- }
29682
- #c(e, t) {
29683
- return this.queue.add(e), this.#l(t), this;
29684
- }
29685
- #l(e = {}) {
29686
- let t = e.delay;
29687
- t && this.queue.add({ delay: t });
29688
- }
29689
- #u(e = {}) {
29690
- return [{ func: () => this.#d(e) }, { func: () => this.#d(this.opts) }];
29691
- }
29692
- async #d(e) {
29693
- this.opts = Pp(this.opts, e);
29694
- }
29695
- #f() {
29696
- let e = this.opts.strings.filter((e) => !!e);
29697
- e.forEach((t, n) => {
29698
- if (this.type(t), n + 1 === e.length) return;
29699
- let r = this.opts.breakLines ? [{
29700
- func: () => this.#_(dp("BR")),
29701
- typeable: !0
29702
- }] : Tp({
29703
- func: this.#v.bind(this),
29704
- delay: this.#b(1)
29705
- }, this.queue.getTypeable().length);
29706
- this.#g(r);
29707
- });
29708
- }
29709
- #p = (e) => {
29710
- this.opts.cursor = ((e) => {
29711
- if (typeof e == "object") {
29712
- let t = {}, { frames: n, options: r } = lp.cursor.animation;
29713
- return t.animation = e.animation || {}, t.animation.frames = e.animation?.frames || n, t.animation.options = Pp(r, e.animation?.options || {}), t.autoPause = e.autoPause ?? lp.cursor.autoPause, t.autoPauseDelay = e.autoPauseDelay || lp.cursor.autoPauseDelay, t;
29714
- }
29715
- return !0 === e ? lp.cursor : e;
29716
- })(e.cursor ?? lp.cursor), this.opts.strings = this.#m(ap(this.opts.strings)), this.opts = Pp(this.opts, {
29717
- html: !this.#S && this.opts.html,
29718
- nextStringDelay: mp(this.opts.nextStringDelay),
29719
- loopDelay: mp(this.opts.loopDelay)
29720
- });
29721
- };
29722
- #m(e) {
29723
- let t = this.element.innerHTML;
29724
- return t ? (this.element.innerHTML = "", this.opts.startDelete ? (this.element.innerHTML = t, vp(this.element), this.#g(Tp({
29725
- func: this.#v.bind(this),
29726
- delay: this.#b(1),
29727
- deletable: !0
29728
- }, this.#w.length)), e) : (n = t, n.replace(/<!--(.+?)-->/g, "").trim().split(/<br(?:\s*?)(?:\/)?>/)).concat(e)) : e;
29729
- var n;
29730
- }
29731
- #h() {
29732
- if (this.#S) return null;
29733
- let e = dp("span");
29734
- return e.className = sp, this.#C ? (e.innerHTML = yp(this.opts.cursorChar).innerHTML, e) : (e.style.visibility = "hidden", e);
29735
- }
29736
- #g(e) {
29737
- let t = this.opts.nextStringDelay;
29738
- this.queue.add([
29739
- { delay: t[0] },
29740
- ...e,
29741
- { delay: t[1] }
29742
- ]);
29743
- }
29744
- #_(e) {
29745
- ((e, t) => {
29746
- if (jp(e)) return void (e.value = `${e.value}${t.textContent}`);
29747
- t.innerHTML = "";
29748
- let n = (r = t.originalParent, /body/i.test(r?.tagName) ? e : t.originalParent || e);
29749
- var r;
29750
- let i = Np("." + sp, n) || null;
29751
- i && i.parentElement !== n && (n = i.parentElement), n.insertBefore(t, i);
29752
- })(this.element, e);
29753
- }
29754
- #v() {
29755
- this.#w.length && (this.#S ? this.element.value = this.element.value.slice(0, -1) : this.#y(this.#w[this.cursorPosition]));
29756
- }
29757
- #y(e) {
29758
- ((e, t) => {
29759
- if (!e) return;
29760
- let n = e.parentNode;
29761
- (n.childNodes.length > 1 || n.isSameNode(t) ? e : n).remove();
29762
- })(e, this.element);
29763
- }
29764
- #b(e = 0) {
29765
- return function(e) {
29766
- let { speed: t, deleteSpeed: n, lifeLike: r } = e;
29767
- return n = n === null ? t / 3 : n, r ? [hp(t, gp(t)), hp(n, gp(n))] : [t, n];
29768
- }(this.opts)[e];
29769
- }
29770
- get #x() {
29771
- return this.predictedCursorPosition ?? this.cursorPosition;
29772
- }
29773
- get #S() {
29774
- return jp(this.element);
29775
- }
29776
- get #C() {
29777
- return !!this.opts.cursor && !this.#S;
29778
- }
29779
- get #w() {
29780
- return e = this.element, jp(e) ? _p(e.value) : bp(e, !0).filter((e) => !(e.childNodes.length > 0));
29781
- var e;
29782
- }
29783
- }, Lp = class extends V(I`
29296
+ var ip = null, ap = class extends V(I`
29784
29297
  :host {
29785
29298
  display: inline-block;
29786
29299
  }
@@ -29902,7 +29415,7 @@ var Sp = ({ index: e, newIndex: t, queueItems: n, cleanUp: r }) => {
29902
29415
  disconnectedCallback() {
29903
29416
  super.disconnectedCallback(), this._destroyTypeIt();
29904
29417
  }
29905
- _startTyping() {
29418
+ async _startTyping() {
29906
29419
  if (this._destroyTypeIt(), this.sessionKey = this.generateSessionKey(), this.once && sessionStorage.getItem(this.sessionKey) === "true") return void this.shadowRoot?.querySelector("slot")?.removeAttribute("hidden");
29907
29420
  if (!this.typewriterContainer) return;
29908
29421
  let e = {
@@ -29921,8 +29434,8 @@ var Sp = ({ index: e, newIndex: t, queueItems: n, cleanUp: r }) => {
29921
29434
  composed: !0
29922
29435
  })), this.loop || this.typewriterContainer.style.setProperty("--ti-cursor-display", "none");
29923
29436
  }
29924
- };
29925
- this.typeItInstance = new Ip(this.typewriterContainer, e), this._getSlottedNodes.forEach((e) => {
29437
+ }, t = await (ip || (ip = import("./index.es-Dymj8REP.js").then((e) => e.default), ip));
29438
+ this.isConnected && (this.typeItInstance = new t(this.typewriterContainer, e), this._getSlottedNodes.forEach((e) => {
29926
29439
  if (e.nodeType === Node.TEXT_NODE) {
29927
29440
  let t = e.textContent || "";
29928
29441
  t.trim() && this.typeItInstance?.type(t);
@@ -29938,7 +29451,7 @@ var Sp = ({ index: e, newIndex: t, queueItems: n, cleanUp: r }) => {
29938
29451
  });
29939
29452
  }(this.shadowRoot?.host).subscribe(() => {
29940
29453
  this.typeItInstance?.go();
29941
- });
29454
+ }));
29942
29455
  }
29943
29456
  generateSessionKey() {
29944
29457
  let e = this._getSlottedElements.map((e) => e.outerHTML).join("");
@@ -29989,18 +29502,18 @@ var Sp = ({ index: e, newIndex: t, queueItems: n, cleanUp: r }) => {
29989
29502
  </div> `;
29990
29503
  }
29991
29504
  };
29992
- P([L({ type: Number })], Lp.prototype, "speed", void 0), P([vr({
29505
+ P([L({ type: Number })], ap.prototype, "speed", void 0), P([vr({
29993
29506
  context: pl,
29994
29507
  subscribe: !0
29995
- }), L({ type: Number })], Lp.prototype, "delay", void 0), P([L({ type: Boolean })], Lp.prototype, "autoStart", void 0), P([L({ type: String })], Lp.prototype, "cursorChar", void 0), P([L({ type: Number })], Lp.prototype, "deleteSpeed", void 0), P([L({ type: Boolean })], Lp.prototype, "once", void 0), P([L({ type: Boolean })], Lp.prototype, "loop", void 0), P([L({ type: Number })], Lp.prototype, "cyclePause", void 0), P([z("#typewriter")], Lp.prototype, "typewriterContainer", void 0), P([function(e) {
29508
+ }), L({ type: Number })], ap.prototype, "delay", void 0), P([L({ type: Boolean })], ap.prototype, "autoStart", void 0), P([L({ type: String })], ap.prototype, "cursorChar", void 0), P([L({ type: Number })], ap.prototype, "deleteSpeed", void 0), P([L({ type: Boolean })], ap.prototype, "once", void 0), P([L({ type: Boolean })], ap.prototype, "loop", void 0), P([L({ type: Number })], ap.prototype, "cyclePause", void 0), P([z("#typewriter")], ap.prototype, "typewriterContainer", void 0), P([function(e) {
29996
29509
  return (t, n) => {
29997
29510
  let { slot: r } = e ?? {}, i = "slot" + (r ? `[name=${r}]` : ":not([name])");
29998
29511
  return Gr(t, n, { get() {
29999
29512
  return (this.renderRoot?.querySelector(i))?.assignedNodes(e) ?? [];
30000
29513
  } });
30001
29514
  };
30002
- }({ flatten: !0 })], Lp.prototype, "_getSlottedNodes", void 0), P([Kr({ flatten: !0 })], Lp.prototype, "_getSlottedElements", void 0), Lp = P([F("schmancy-typewriter")], Lp);
30003
- var Rp = class extends B(I`
29515
+ }({ flatten: !0 })], ap.prototype, "_getSlottedNodes", void 0), P([Kr({ flatten: !0 })], ap.prototype, "_getSlottedElements", void 0), ap = P([F("schmancy-typewriter")], ap);
29516
+ var op = class extends B(I`
30004
29517
  :host {
30005
29518
  display: block;
30006
29519
  font-family: inherit;
@@ -30331,22 +29844,22 @@ var Rp = class extends B(I`
30331
29844
  P([L({
30332
29845
  type: String,
30333
29846
  reflect: !0
30334
- })], Rp.prototype, "type", void 0), P([L({
29847
+ })], op.prototype, "type", void 0), P([L({
30335
29848
  type: String,
30336
29849
  reflect: !0
30337
- })], Rp.prototype, "token", void 0), P([L({
29850
+ })], op.prototype, "token", void 0), P([L({
30338
29851
  type: String,
30339
29852
  reflect: !0
30340
- })], Rp.prototype, "align", void 0), P([L({
29853
+ })], op.prototype, "align", void 0), P([L({
30341
29854
  type: String,
30342
29855
  reflect: !0
30343
- })], Rp.prototype, "weight", void 0), P([L({
29856
+ })], op.prototype, "weight", void 0), P([L({
30344
29857
  type: String,
30345
29858
  reflect: !0
30346
- })], Rp.prototype, "transform", void 0), P([L({ type: Number })], Rp.prototype, "maxLines", void 0), P([L({
29859
+ })], op.prototype, "transform", void 0), P([L({ type: Number })], op.prototype, "maxLines", void 0), P([L({
30347
29860
  type: Boolean,
30348
29861
  reflect: !0
30349
- })], Rp.prototype, "editable", void 0), P([L({ type: String })], Rp.prototype, "value", void 0), P([L({ type: String })], Rp.prototype, "placeholder", void 0), Rp = P([F("schmancy-typography")], Rp), new class {
29862
+ })], op.prototype, "editable", void 0), P([L({ type: String })], op.prototype, "value", void 0), P([L({ type: String })], op.prototype, "placeholder", void 0), op = P([F("schmancy-typography")], op), new class {
30350
29863
  constructor() {
30351
29864
  this.systemLocale = typeof navigator < "u" && navigator.language ? navigator.language : "de-DE";
30352
29865
  }
@@ -30600,7 +30113,7 @@ P([L({
30600
30113
  return e.split("").map((e) => t[e] || e).join("");
30601
30114
  }
30602
30115
  }();
30603
- var zp = class extends V() {
30116
+ var sp = class extends V() {
30604
30117
  constructor(...e) {
30605
30118
  super(...e), this.initials = "", this.src = "", this.icon = "", this.size = "md", this.color = "primary", this.shape = "circle", this.bordered = !1, this.status = "none";
30606
30119
  }
@@ -30679,8 +30192,8 @@ var zp = class extends V() {
30679
30192
  `;
30680
30193
  }
30681
30194
  };
30682
- P([L({ type: String })], zp.prototype, "initials", void 0), P([L({ type: String })], zp.prototype, "src", void 0), P([L({ type: String })], zp.prototype, "icon", void 0), P([L({ type: String })], zp.prototype, "size", void 0), P([L({ type: String })], zp.prototype, "color", void 0), P([L({ type: String })], zp.prototype, "shape", void 0), P([L({ type: Boolean })], zp.prototype, "bordered", void 0), P([L({ type: String })], zp.prototype, "status", void 0), zp = P([F("schmancy-avatar")], zp);
30683
- var Bp = class extends B(I`
30195
+ P([L({ type: String })], sp.prototype, "initials", void 0), P([L({ type: String })], sp.prototype, "src", void 0), P([L({ type: String })], sp.prototype, "icon", void 0), P([L({ type: String })], sp.prototype, "size", void 0), P([L({ type: String })], sp.prototype, "color", void 0), P([L({ type: String })], sp.prototype, "shape", void 0), P([L({ type: Boolean })], sp.prototype, "bordered", void 0), P([L({ type: String })], sp.prototype, "status", void 0), sp = P([F("schmancy-avatar")], sp);
30196
+ var cp = class extends B(I`
30684
30197
  :host {
30685
30198
  display: block;
30686
30199
  }
@@ -30723,8 +30236,8 @@ var Bp = class extends B(I`
30723
30236
  });
30724
30237
  }
30725
30238
  };
30726
- P([L({ type: String })], Bp.prototype, "separator", void 0), Bp = P([F("schmancy-breadcrumb")], Bp);
30727
- var Vp = class extends B(I`
30239
+ P([L({ type: String })], cp.prototype, "separator", void 0), cp = P([F("schmancy-breadcrumb")], cp);
30240
+ var lp = class extends B(I`
30728
30241
  :host {
30729
30242
  display: inline-block;
30730
30243
  }
@@ -30743,11 +30256,11 @@ var Vp = class extends B(I`
30743
30256
  return this.href && !this.current ? M`<a href=${this.href}><slot></slot></a>` : M`<span aria-current=${this.current ? "page" : "false"}><slot></slot></span>`;
30744
30257
  }
30745
30258
  };
30746
- P([L({ type: String })], Vp.prototype, "href", void 0), P([L({
30259
+ P([L({ type: String })], lp.prototype, "href", void 0), P([L({
30747
30260
  type: Boolean,
30748
30261
  reflect: !0
30749
- })], Vp.prototype, "current", void 0), Vp = P([F("schmancy-breadcrumb-item")], Vp);
30750
- var Hp = class extends B(I`
30262
+ })], lp.prototype, "current", void 0), lp = P([F("schmancy-breadcrumb-item")], lp);
30263
+ var up = class extends B(I`
30751
30264
  :host {
30752
30265
  display: inline-block;
30753
30266
  vertical-align: middle;
@@ -30785,8 +30298,8 @@ var Hp = class extends B(I`
30785
30298
  P([L({
30786
30299
  type: String,
30787
30300
  reflect: !0
30788
- })], Hp.prototype, "size", void 0), Hp = P([F("schmancy-kbd")], Hp);
30789
- var Up = class extends B(I`
30301
+ })], up.prototype, "size", void 0), up = P([F("schmancy-kbd")], up);
30302
+ var dp = class extends B(I`
30790
30303
  :host {
30791
30304
  display: block;
30792
30305
  width: var(--_sw, 100%);
@@ -30837,8 +30350,8 @@ var Up = class extends B(I`
30837
30350
  P([L({
30838
30351
  type: String,
30839
30352
  reflect: !0
30840
- })], Up.prototype, "shape", void 0), P([L({ type: String })], Up.prototype, "width", void 0), P([L({ type: String })], Up.prototype, "height", void 0), P([L({ type: String })], Up.prototype, "radius", void 0), Up = P([F("schmancy-skeleton")], Up);
30841
- var Wp = class extends V(I`
30353
+ })], dp.prototype, "shape", void 0), P([L({ type: String })], dp.prototype, "width", void 0), P([L({ type: String })], dp.prototype, "height", void 0), P([L({ type: String })], dp.prototype, "radius", void 0), dp = P([F("schmancy-skeleton")], dp);
30354
+ var fp = class extends V(I`
30842
30355
  :host {
30843
30356
  display: block;
30844
30357
  position: relative;
@@ -30910,11 +30423,11 @@ var Wp = class extends V(I`
30910
30423
  P([L({
30911
30424
  type: Number,
30912
30425
  attribute: "min-duration"
30913
- })], Wp.prototype, "minDuration", void 0), P([L({ type: Boolean })], Wp.prototype, "auto", void 0), P([L({
30426
+ })], fp.prototype, "minDuration", void 0), P([L({ type: Boolean })], fp.prototype, "auto", void 0), P([L({
30914
30427
  type: Boolean,
30915
30428
  attribute: "initially-hidden"
30916
- })], Wp.prototype, "initiallyHidden", void 0), P([R()], Wp.prototype, "_visible", void 0), Wp = P([F("schmancy-splash-screen")], Wp);
30917
- var Gp = class extends B(I`
30429
+ })], fp.prototype, "initiallyHidden", void 0), P([R()], fp.prototype, "_visible", void 0), fp = P([F("schmancy-splash-screen")], fp);
30430
+ var pp = class extends B(I`
30918
30431
  :host {
30919
30432
  display: inline-block;
30920
30433
  }
@@ -31033,14 +30546,14 @@ var Gp = class extends B(I`
31033
30546
  P([L({
31034
30547
  type: Boolean,
31035
30548
  reflect: !0
31036
- })], Gp.prototype, "checked", void 0), P([L({
30549
+ })], pp.prototype, "checked", void 0), P([L({
31037
30550
  type: Boolean,
31038
30551
  reflect: !0
31039
- })], Gp.prototype, "disabled", void 0), P([L({
30552
+ })], pp.prototype, "disabled", void 0), P([L({
31040
30553
  type: Boolean,
31041
30554
  reflect: !0
31042
- })], Gp.prototype, "required", void 0), P([L({ type: String })], Gp.prototype, "name", void 0), P([L({ type: String })], Gp.prototype, "value", void 0), P([L({ type: String })], Gp.prototype, "label", void 0), Gp = P([F("schmancy-switch")], Gp);
31043
- var Kp = class extends B(I`
30555
+ })], pp.prototype, "required", void 0), P([L({ type: String })], pp.prototype, "name", void 0), P([L({ type: String })], pp.prototype, "value", void 0), P([L({ type: String })], pp.prototype, "label", void 0), pp = P([F("schmancy-switch")], pp);
30556
+ var mp = class extends B(I`
31044
30557
  :host {
31045
30558
  position: absolute;
31046
30559
  width: 1px;
@@ -31057,8 +30570,8 @@ var Kp = class extends B(I`
31057
30570
  return M`<slot></slot>`;
31058
30571
  }
31059
30572
  };
31060
- Kp = P([F("schmancy-visually-hidden")], Kp);
31061
- var qp = {
30573
+ mp = P([F("schmancy-visually-hidden")], mp);
30574
+ var hp = {
31062
30575
  schemaVersion: "1.0.0",
31063
30576
  readme: "# Schmancy\n\nA Web Component UI library built on Lit, RxJS, and Tailwind CSS. Surfaces are glass. Depth is light. Interactions are physics.\n\n## Agent runtime\n\nFor sandboxed-iframe agents (Claude Design, Claude Artifacts, any LLM that can\nonly write HTML), schmancy ships a single-URL runtime at `@mhmo91/schmancy/agent`.\nDrop one `<script type=\"module\">` tag and every `<schmancy-*>` element is\nregistered. No bundler, no bare specifiers, no npm install.\n\n```html\n<script type=\"module\">\n import { $dialog, theme } from 'https://esm.sh/@mhmo91/schmancy/agent';\n<\/script>\n<schmancy-theme root scheme=\"dark\">\n <schmancy-surface type=\"solid\" fill=\"all\">\n <schmancy-button>Hi</schmancy-button>\n <schmancy-skill></schmancy-skill>\n </schmancy-surface>\n</schmancy-theme>\n```\n\nThe `<schmancy-skill>` tag installs `window.schmancy` for runtime discovery:\n\n- `window.schmancy.help()` — full manifest (CEM v1 shape).\n- `window.schmancy.help('schmancy-button')` — one tag's attributes, events, slots, CSS parts.\n- `window.schmancy.tokens()` — build-time-extracted list of `--schmancy-*` theme tokens.\n- `window.schmancy.manifestUrl` — Blob URL; `fetch()` it for the same data.\n- `window.schmancy.a11yAudit()` — walks the live DOM and reports ARIA / shadow-root / form-association status per instance.\n- `window.schmancy.platformPrimitive('schmancy-dialog')` — map to the native element a component wraps (present when the component's JSDoc has `@platform`).\n- `window.schmancy.capabilities()` — runtime feature probe (`popover`, `declarativeShadowDom`, `scopedRegistries`, `trustedTypes`, `cssRegisteredProperties`, `elementInternalsAria`, `formAssociated`, `adoptedStyleSheets`). Agents use this to adapt to the sandbox they're in rather than the one they expect.\n\nEvery enum-typed attribute carries a `values` array — e.g. `schmancy-button`'s `variant` ships `[\"elevated\", \"filled\", \"filled tonal\", \"tonal\", \"outlined\", \"text\"]` so agents never have to parse `\"'filled' | 'tonal' | ...\"` strings.\n\nThe manifest is also emitted as a sibling file at `@mhmo91/schmancy/agent/manifest`\nfor tooling that prefers reading JSON from disk.\n\n## Install\n\n```bash\nnpm install @mhmo91/schmancy\n```\n\n```typescript\nimport '@mhmo91/schmancy'\nimport { magnetic, cursorGlow, gravity } from '@mhmo91/schmancy/directives'\n```\n\n## Use with Claude Code\n\nSchmancy ships a Claude Code plugin. In any Claude Code session, run:\n\n```\n/plugin install https://github.com/samwaai/schmancy\n```\n\nClaude now knows every Schmancy component, foundation pattern, and convention in your project. The skill activates automatically when you work on schmancy code — no CLAUDE.md edits, no symlinks.\n\n## Quick Start\n\n```html\n<schmancy-theme root scheme=\"dark\">\n <schmancy-surface type=\"solid\" fill=\"all\">\n <schmancy-area name=\"root\" .default=${lazy(() => import('./home.page'))}>\n <schmancy-route when=\"home-page\" .component=${lazy(() => import('./home.page'))} />\n </schmancy-area>\n </schmancy-surface>\n</schmancy-theme>\n```\n\n## Design: Luminous Glass\n\n| Surface | Opacity | Blur | Purpose |\n|---------|---------|------|---------|\n| `solid` | 92% | — | Dense glass, high readability |\n| `subtle` | 78% | 8px | Frosted panel (default) |\n| `glass` | 55% | 16px | Overlays, dialogs, dropdowns |\n| `luminous` | 42% | 20px | Hero panels with glow halo |\n\n## Docs\n\nSchmancy is organized in four layers:\n\n- **Foundations** — [Area](./skills/schmancy/area.md) · [Store](./skills/schmancy/store.md) · [Mixins ($LitElement)](./skills/schmancy/mixins.md) · [Theme](./skills/schmancy/theme.md) · [Directives](./skills/schmancy/directives.md)\n- **Atoms** — [Typography](./skills/schmancy/typography.md) · [Icons](./skills/schmancy/icons.md) · [Button](./skills/schmancy/button.md) · [Surface](./skills/schmancy/surface.md) · [Divider](./skills/schmancy/divider.md) · [Avatar](./skills/schmancy/avatar.md)\n- **Composites (by job)** — Forms, Navigation, Overlays, Interaction, Feedback, Display\n- **Utilities** — [Animation](./skills/schmancy/animation.md) · [Audio](./skills/schmancy/audio.md) · [Discovery](./skills/schmancy/discovery.md) · [RxJS Utils](./skills/schmancy/rxjs-utils.md) · [Utils](./skills/schmancy/utils.md)\n\n**Full component index:** [skills/schmancy/INDEX.md](./skills/schmancy/INDEX.md) — the single-file map with every tag, service, and convention. Written primarily for AI agents; humans welcome.\n\n## Tech Stack\n\n[Lit](https://lit.dev) · [RxJS](https://rxjs.dev) · [Tailwind CSS v4](https://tailwindcss.com) · [Blackbird](./src/utils/animation.ts)\n\n## License\n\nApache-2.0\n",
31064
30577
  modules: [
@@ -31469,7 +30982,13 @@ var qp = {
31469
30982
  kind: "class",
31470
30983
  name: "SchmancyBreadcrumb",
31471
30984
  tagName: "schmancy-breadcrumb",
31472
- description: "Breadcrumb navigation container. Wraps a list of `schmancy-breadcrumb-item` elements with the correct ARIA landmark and semantics.",
30985
+ description: "Breadcrumb trail — navigation history from root to current page. Renders schmancy-breadcrumb-item children with separators between.",
30986
+ summary: "Use for deep hierarchical navigation (file explorer paths, e-commerce category chains, admin settings trees). Last item is styled as the current page automatically.",
30987
+ platformPrimitive: {
30988
+ tag: "nav",
30989
+ mode: "-",
30990
+ note: "Styled `<nav aria-label=\"Breadcrumb\">`. Degrades to a plain nav if the tag never registers."
30991
+ },
31473
30992
  attributes: [{
31474
30993
  name: "separator",
31475
30994
  type: { text: "string" },
@@ -31482,12 +31001,19 @@ var qp = {
31482
31001
  cssParts: [{
31483
31002
  name: "separator",
31484
31003
  description: "The separator element."
31485
- }]
31004
+ }],
31005
+ examples: ["<schmancy-breadcrumb separator=\"›\">\n <schmancy-breadcrumb-item href=\"/\">Home</schmancy-breadcrumb-item>\n <schmancy-breadcrumb-item href=\"/docs\">Docs</schmancy-breadcrumb-item>\n <schmancy-breadcrumb-item>Getting started</schmancy-breadcrumb-item>\n</schmancy-breadcrumb>"]
31486
31006
  }, {
31487
31007
  kind: "class",
31488
31008
  name: "SchmancyBreadcrumbItem",
31489
31009
  tagName: "schmancy-breadcrumb-item",
31490
- description: "Individual breadcrumb item. Renders as a link when `href` is provided, otherwise as a plain span (represents the current page).",
31010
+ description: "Single segment in a schmancy-breadcrumb trail a link when `href` is set, or a plain span (the current page) when omitted.",
31011
+ summary: "Always nested inside schmancy-breadcrumb. Omit `href` on the current page — it gets aria-current=\"page\" automatically.",
31012
+ platformPrimitive: {
31013
+ tag: "a",
31014
+ mode: "-",
31015
+ note: "Renders an `<a>` or `<span>` depending on href. Degrades to a plain anchor/span if the tag never registers."
31016
+ },
31491
31017
  attributes: [{
31492
31018
  name: "href",
31493
31019
  type: { text: "string" },
@@ -31500,7 +31026,8 @@ var qp = {
31500
31026
  slots: [{
31501
31027
  name: "",
31502
31028
  description: "Label content."
31503
- }]
31029
+ }],
31030
+ examples: ["<schmancy-breadcrumb-item href=\"/products\">Products</schmancy-breadcrumb-item>"]
31504
31031
  }]
31505
31032
  },
31506
31033
  {
@@ -32884,7 +32411,13 @@ var qp = {
32884
32411
  kind: "class",
32885
32412
  name: "SchmancyDialog",
32886
32413
  tagName: "schmancy-dialog",
32887
- description: "Unified dialog component that handles both content-only and confirm modes.",
32414
+ description: "Modal dialog content-only (just a styled panel) or confirm mode (title + message + confirm/cancel buttons). Prefer the imperative `$dialog` service for most use cases; use the element directly only when you want a declaratively-positioned dialog.",
32415
+ summary: "Blocks interaction with the rest of the page until dismissed. For quick confirmations, prefer `$dialog.confirm({ ... })` over this element. For arbitrary dialog content driven imperatively, prefer `$dialog.component(MyComponent)`.",
32416
+ platformPrimitive: {
32417
+ tag: "dialog",
32418
+ mode: "close",
32419
+ note: "Positioned overlay in light DOM. Degrades to a styled `<dialog>` if the tag never registers — loses custom animations but keeps focus trap + ESC close."
32420
+ },
32888
32421
  attributes: [
32889
32422
  {
32890
32423
  name: "uid",
@@ -32935,6 +32468,13 @@ var qp = {
32935
32468
  description: "Whether to hide action buttons (force content mode)"
32936
32469
  }
32937
32470
  ],
32471
+ events: [{
32472
+ name: "confirm",
32473
+ description: "In confirm mode, when the confirm button is clicked."
32474
+ }, {
32475
+ name: "cancel",
32476
+ description: "In confirm mode, when the cancel button or ESC is activated."
32477
+ }],
32938
32478
  slots: [{
32939
32479
  name: "default",
32940
32480
  description: "Content slot for dialog body (used in content mode)"
@@ -32942,7 +32482,7 @@ var qp = {
32942
32482
  name: "content",
32943
32483
  description: "Named slot for custom content in confirm mode"
32944
32484
  }],
32945
- examples: ["Content mode (no buttons):\n\n<schmancy-dialog>\n <my-custom-content></my-custom-content>\n</schmancy-dialog>", "Confirm mode (with buttons):\n\n<schmancy-dialog\n title=\"Confirm Action\"\n message=\"Are you sure?\"\n confirm-text=\"Yes\"\n cancel-text=\"No\"\n></schmancy-dialog>"]
32485
+ examples: ["Content mode (no buttons):\n<schmancy-dialog>\n <my-custom-content></my-custom-content>\n</schmancy-dialog>", "Confirm mode (with buttons):\n<schmancy-dialog\n title=\"Delete item?\"\n message=\"This action cannot be undone.\"\n confirm-text=\"Delete\"\n cancel-text=\"Keep\"\n></schmancy-dialog>"]
32946
32486
  }]
32947
32487
  },
32948
32488
  {
@@ -32992,7 +32532,13 @@ var qp = {
32992
32532
  kind: "class",
32993
32533
  name: "SchmancyDropdown",
32994
32534
  tagName: "schmancy-dropdown",
32995
- description: "A dropdown component that displays content when triggered.",
32535
+ description: "Anchored floating dropdown a generic \"show this content relative to that trigger\" primitive. Unlike schmancy-menu (which uses the dialog service and is list-shaped), dropdown is a low-level popover anchored with Floating UI. Use when you want a custom-shaped overlay tied to a specific trigger element without the menu semantics.",
32536
+ summary: "Prefer schmancy-menu for action lists, schmancy-autocomplete for type-ahead, schmancy-tooltip for hover hints. Reach for schmancy-dropdown when none of those fit — custom filters, color pickers, inline forms anchored to a trigger.",
32537
+ platformPrimitive: {
32538
+ tag: "div",
32539
+ mode: "-",
32540
+ note: "Anchored via Floating UI (autoUpdate, flip, shift). Degrades to inline content if the tag never registers — loses positioning but content stays accessible."
32541
+ },
32996
32542
  attributes: [
32997
32543
  {
32998
32544
  name: "open",
@@ -33027,13 +32573,21 @@ var qp = {
33027
32573
  description: "Offset distance in pixels"
33028
32574
  }
33029
32575
  ],
32576
+ events: [{
32577
+ name: "open",
32578
+ description: "When the dropdown opens."
32579
+ }, {
32580
+ name: "close",
32581
+ description: "When the dropdown closes."
32582
+ }],
33030
32583
  slots: [{
33031
32584
  name: "trigger",
33032
32585
  description: "The element that triggers the dropdown"
33033
32586
  }, {
33034
32587
  name: "",
33035
32588
  description: "Default slot for the dropdown content"
33036
- }]
32589
+ }],
32590
+ examples: ["<schmancy-dropdown>\n <schmancy-button slot=\"trigger\">Filters</schmancy-button>\n <schmancy-dropdown-content>\n <schmancy-form>…</schmancy-form>\n </schmancy-dropdown-content>\n</schmancy-dropdown>"]
33037
32591
  }]
33038
32592
  },
33039
32593
  {
@@ -33043,7 +32597,13 @@ var qp = {
33043
32597
  kind: "class",
33044
32598
  name: "SchmancyDropdownContent",
33045
32599
  tagName: "schmancy-dropdown-content",
33046
- description: "Content container for the schmancy-dropdown component.",
32600
+ description: "Content panel for a schmancy-dropdown — a styled positioned surface. Always nested inside schmancy-dropdown and placed alongside the trigger slot.",
32601
+ summary: "Nest this inside schmancy-dropdown (not in the trigger slot). Use the `content` CSS part to customize backgrounds / shadows / padding without shadow-root piercing.",
32602
+ platformPrimitive: {
32603
+ tag: "div",
32604
+ mode: "-",
32605
+ note: "Positioned panel with theme-aware styling. Degrades to an inline div if the tag never registers."
32606
+ },
33047
32607
  attributes: [
33048
32608
  {
33049
32609
  name: "width",
@@ -33084,7 +32644,8 @@ var qp = {
33084
32644
  cssParts: [{
33085
32645
  name: "content",
33086
32646
  description: "The inner wrapper element; style to override panel backgrounds, shadows, padding, or borders without shadow-root piercing."
33087
- }]
32647
+ }],
32648
+ examples: ["<schmancy-dropdown>\n <schmancy-button slot=\"trigger\">Open</schmancy-button>\n <schmancy-dropdown-content>\n Panel contents…\n </schmancy-dropdown-content>\n</schmancy-dropdown>"]
33088
32649
  }]
33089
32650
  },
33090
32651
  {
@@ -33616,6 +33177,13 @@ var qp = {
33616
33177
  kind: "class",
33617
33178
  name: "SchmancyListItem",
33618
33179
  tagName: "schmancy-list-item",
33180
+ description: "Single row in a schmancy-list — supports leading icon/avatar, main content, trailing actions. Clickable via click event, or used as a schmancy-menu-item's visual base.",
33181
+ summary: "Prefer nesting inside schmancy-list for consistent spacing/surface. Use `href` to make the row a navigation target (renders as `<a>`), or a click handler for in-app actions.",
33182
+ platformPrimitive: {
33183
+ tag: "li",
33184
+ mode: "click",
33185
+ note: "Styled `<li>` or `<a>` depending on `href`. Degrades to a plain list item if the tag never registers."
33186
+ },
33619
33187
  attributes: [
33620
33188
  {
33621
33189
  name: "variant",
@@ -33673,6 +33241,7 @@ var qp = {
33673
33241
  description: "default content"
33674
33242
  }
33675
33243
  ],
33244
+ examples: ["<schmancy-list-item href=\"/profile\">\n <schmancy-icon slot=\"leading\">person</schmancy-icon>\n Profile\n <schmancy-icon slot=\"trailing\">chevron_right</schmancy-icon>\n</schmancy-list-item>"],
33676
33245
  contexts: [{
33677
33246
  name: "SchmancySurfaceTypeContext",
33678
33247
  kind: "consume"
@@ -33686,7 +33255,13 @@ var qp = {
33686
33255
  kind: "class",
33687
33256
  name: "List",
33688
33257
  tagName: "schmancy-list",
33689
- description: "`<schmancy-list>` component. A list component that wraps its content within a customizable surface. It allows you to set the surface type and fill style, and can optionally enable scrolling behavior by delegating the scroller attribute to the surface.",
33258
+ description: "Wrapped list container holds schmancy-list-item children on a themed surface. Optionally scrollable.",
33259
+ summary: "Use for vertical lists of similarly-shaped items: settings entries, menu items, contact lists, notification lists. Pair with schmancy-list-item children.",
33260
+ platformPrimitive: {
33261
+ tag: "ul",
33262
+ mode: "-",
33263
+ note: "Styled list container. Degrades to a plain ul/div if the tag never registers."
33264
+ },
33690
33265
  attributes: [
33691
33266
  {
33692
33267
  name: "surface",
@@ -33740,7 +33315,7 @@ var qp = {
33740
33315
  name: "",
33741
33316
  description: "The default slot for list items."
33742
33317
  }],
33743
- examples: ["<schmancy-list surface=\"container\" scroller>\n <schmancy-list-item>List Item 1</schmancy-list-item>\n</schmancy-list>"],
33318
+ examples: ["<schmancy-list surface=\"container\" scroller>\n <schmancy-list-item>First</schmancy-list-item>\n <schmancy-list-item>Second</schmancy-list-item>\n <schmancy-list-item>Third</schmancy-list-item>\n</schmancy-list>"],
33744
33319
  contexts: [{
33745
33320
  name: "SchmancyListTypeContext",
33746
33321
  kind: "provide"
@@ -34103,7 +33678,19 @@ var qp = {
34103
33678
  declarations: [{
34104
33679
  kind: "class",
34105
33680
  name: "SchmancyMenuItem",
34106
- tagName: "schmancy-menu-item"
33681
+ tagName: "schmancy-menu-item",
33682
+ description: "Single item inside a schmancy-menu. Auto-dismisses the menu dialog on click — attach your action handler to `@click` and it just works.",
33683
+ summary: "Always nested inside schmancy-menu. The click handler runs before the dialog closes, so `@click=${() => doThing()}` is the full pattern.",
33684
+ platformPrimitive: {
33685
+ tag: "menuitem",
33686
+ mode: "click",
33687
+ note: "Wraps schmancy-list-item with auto-dismiss. Degrades to a styled `<button role=\"menuitem\">` if the tag never registers."
33688
+ },
33689
+ slots: [{
33690
+ name: "",
33691
+ description: "The item label and optional icons."
33692
+ }],
33693
+ examples: ["<schmancy-menu-item @click=${() => archive()}>\n <schmancy-icon slot=\"leading\">archive</schmancy-icon>\n Archive\n</schmancy-menu-item>"]
34107
33694
  }]
34108
33695
  },
34109
33696
  {
@@ -34113,7 +33700,13 @@ var qp = {
34113
33700
  kind: "class",
34114
33701
  name: "SchmancyMenu",
34115
33702
  tagName: "schmancy-menu",
34116
- description: "Menu Component CRITICAL: The dialog ONLY renders the raw menu items passed via the default slot. NO <ul> wrapper, NO classes, NO additional markup in the dialog call. The dialog service handles positioning and display - we just pass the pure content.",
33703
+ description: "Floating menu a trigger button + a list of schmancy-menu-item children that open as a positioned dialog on click.",
33704
+ summary: "Use for dropdown menus attached to a button or icon — \"More actions\", \"Account\", row overflow menus in tables. Clicking a schmancy-menu-item inside auto-dismisses; custom components slotted inside must call `$dialog.dismiss()` themselves.",
33705
+ platformPrimitive: {
33706
+ tag: "menu",
33707
+ mode: "close",
33708
+ note: "Trigger + floating listbox dialog. Degrades to a native `<select>` or inline list if the tag never registers."
33709
+ },
34117
33710
  slots: [
34118
33711
  {
34119
33712
  name: "trigger",
@@ -34128,7 +33721,7 @@ var qp = {
34128
33721
  description: "Menu items or any custom component to display in dialog"
34129
33722
  }
34130
33723
  ],
34131
- examples: ["Basic menu with auto-dismiss\n\n<schmancy-menu>\n <schmancy-button slot=\"trigger\">Actions</schmancy-button>\n <schmancy-menu-item @click=${() => editItem()}>Edit</schmancy-menu-item>\n <schmancy-menu-item @click=${() => deleteItem()}>Delete</schmancy-menu-item>\n</schmancy-menu>\n\nNote: Dialog auto-dismisses when schmancy-menu-item is clicked", "Custom component (manual dismiss)\n\n<schmancy-menu>\n <schmancy-icon-button slot=\"trigger\">settings</schmancy-icon-button>\n <my-settings-form @submit=${() => $dialog.dismiss()}></my-settings-form>\n</schmancy-menu>\n\nNote: Custom components must call $dialog.dismiss() manually"]
33724
+ examples: ["<schmancy-menu>\n <schmancy-icon-button slot=\"trigger\" aria-label=\"Actions\">\n <schmancy-icon>more_vert</schmancy-icon>\n </schmancy-icon-button>\n <schmancy-menu-item @click=${() => edit()}>Edit</schmancy-menu-item>\n <schmancy-menu-item @click=${() => remove()}>Delete</schmancy-menu-item>\n</schmancy-menu>"]
34132
33725
  }]
34133
33726
  },
34134
33727
  {
@@ -34138,10 +33731,18 @@ var qp = {
34138
33731
  kind: "class",
34139
33732
  name: "SchmancyDrawerAppbar",
34140
33733
  tagName: "schmancy-nav-drawer-appbar",
33734
+ description: "Top app bar region inside schmancy-nav-drawer — the horizontal strip above the content area that typically holds the page title, hamburger trigger, and contextual actions.",
33735
+ summary: "Always nested inside schmancy-nav-drawer. Holds the page-level title + top-right actions. On mobile, the drawer's hamburger button renders inside this region.",
33736
+ platformPrimitive: {
33737
+ tag: "header",
33738
+ mode: "-",
33739
+ note: "Styled horizontal bar. Degrades to a plain header element if the tag never registers."
33740
+ },
34141
33741
  slots: [{
34142
33742
  name: "",
34143
33743
  description: "The default slot"
34144
- }]
33744
+ }],
33745
+ examples: ["<schmancy-nav-drawer-appbar>\n <schmancy-typography type=\"title\" token=\"lg\">Dashboard</schmancy-typography>\n <schmancy-icon-button slot=\"trailing\" aria-label=\"Notifications\">\n <schmancy-icon>notifications</schmancy-icon>\n </schmancy-icon-button>\n</schmancy-nav-drawer-appbar>"]
34145
33746
  }]
34146
33747
  },
34147
33748
  {
@@ -34150,7 +33751,15 @@ var qp = {
34150
33751
  declarations: [{
34151
33752
  kind: "class",
34152
33753
  name: "SchmancyNavigationDrawerContent",
34153
- tagName: "schmancy-nav-drawer-content"
33754
+ tagName: "schmancy-nav-drawer-content",
33755
+ description: "Main content region inside schmancy-nav-drawer — typically hosts the router outlet or the page's body content.",
33756
+ summary: "Always nested inside schmancy-nav-drawer. Scrollable by default; propagates scroll events up so the drawer can collapse app-bar on scroll.",
33757
+ platformPrimitive: {
33758
+ tag: "main",
33759
+ mode: "scroll",
33760
+ note: "Scrollable `<main>`. Degrades to a plain scrollable div if the tag never registers."
33761
+ },
33762
+ examples: ["<schmancy-nav-drawer-content>\n <schmancy-area name=\"main\"></schmancy-area>\n</schmancy-nav-drawer-content>"]
34154
33763
  }]
34155
33764
  },
34156
33765
  {
@@ -34160,6 +33769,13 @@ var qp = {
34160
33769
  kind: "class",
34161
33770
  name: "SchmancyNavigationDrawer",
34162
33771
  tagName: "schmancy-nav-drawer",
33772
+ description: "Responsive navigation drawer — a left sidebar that becomes a hamburger-triggered modal overlay on narrow viewports. Composes schmancy-nav-drawer-navbar (the nav rail), schmancy-nav-drawer-appbar (the top bar), and schmancy-nav-drawer-content (the main region).",
33773
+ summary: "The app-shell layout primitive. Wrap your whole app in this when you want \"persistent sidebar on desktop, drawer on mobile\" behavior. Mode auto-switches at the breakpoint.",
33774
+ platformPrimitive: {
33775
+ tag: "div",
33776
+ mode: "-",
33777
+ note: "Flex layout with viewport-width mode switching. Degrades to a stack of plain divs if the tag never registers."
33778
+ },
34163
33779
  attributes: [
34164
33780
  {
34165
33781
  name: "fullscreen",
@@ -34184,10 +33800,15 @@ var qp = {
34184
33800
  values: ["open", "close"]
34185
33801
  }
34186
33802
  ],
33803
+ events: [{
33804
+ name: "schmancy-drawer-state",
33805
+ description: "When the drawer open/close state changes on mobile."
33806
+ }],
34187
33807
  slots: [{
34188
33808
  name: "",
34189
33809
  description: "The content slot"
34190
33810
  }],
33811
+ examples: ["<schmancy-nav-drawer>\n <schmancy-nav-drawer-navbar>\n <!-- nav items, typically schmancy-list-item links -->\n </schmancy-nav-drawer-navbar>\n <schmancy-nav-drawer-appbar>App title</schmancy-nav-drawer-appbar>\n <schmancy-nav-drawer-content>\n <!-- router outlet / page content -->\n </schmancy-nav-drawer-content>\n</schmancy-nav-drawer>"],
34191
33812
  contexts: [{
34192
33813
  name: "SchmancyDrawerNavbarMode",
34193
33814
  kind: "provide"
@@ -34204,11 +33825,19 @@ var qp = {
34204
33825
  kind: "class",
34205
33826
  name: "SchmancyNavigationDrawerSidebar",
34206
33827
  tagName: "schmancy-nav-drawer-navbar",
33828
+ description: "Sidebar region inside schmancy-nav-drawer — the persistent-on-desktop / modal-on-mobile nav rail.",
33829
+ summary: "Always nested inside schmancy-nav-drawer. On desktop: pinned left sidebar. On mobile: modal overlay triggered by the hamburger button in schmancy-nav-drawer-appbar.",
33830
+ platformPrimitive: {
33831
+ tag: "nav",
33832
+ mode: "-",
33833
+ note: "Sidebar `<nav>` with responsive open/close behavior. Degrades to a plain sidebar div if the tag never registers."
33834
+ },
34207
33835
  attributes: [{
34208
33836
  name: "width",
34209
33837
  type: { text: "string" },
34210
33838
  default: "'220px'"
34211
33839
  }],
33840
+ examples: ["<schmancy-nav-drawer-navbar>\n <schmancy-list>\n <schmancy-list-item href=\"/dashboard\">Dashboard</schmancy-list-item>\n <schmancy-list-item href=\"/settings\">Settings</schmancy-list-item>\n </schmancy-list>\n</schmancy-nav-drawer-navbar>"],
34212
33841
  contexts: [{
34213
33842
  name: "SchmancyDrawerNavbarMode",
34214
33843
  kind: "consume"
@@ -34225,7 +33854,13 @@ var qp = {
34225
33854
  kind: "class",
34226
33855
  name: "SchmancyNavigationBarItem",
34227
33856
  tagName: "schmancy-navigation-bar-item",
34228
- description: "`<schmancy-navigation-bar-item>` component Individual navigation item for use within a navigation bar. Represents a single destination with an icon and optional label following Material Design 3 specifications.",
33857
+ description: "Single destination inside schmancy-navigation-bar an icon + optional label representing one primary app destination.",
33858
+ summary: "Always nested inside schmancy-navigation-bar. Use `icon` attr for a Material Symbols glyph or slot=icon for custom content.",
33859
+ platformPrimitive: {
33860
+ tag: "button",
33861
+ mode: "click",
33862
+ note: "Styled navigation target. Degrades to a plain `<button>` if the tag never registers."
33863
+ },
34229
33864
  attributes: [
34230
33865
  {
34231
33866
  name: "icon",
@@ -34289,7 +33924,13 @@ var qp = {
34289
33924
  kind: "class",
34290
33925
  name: "SchmancyNavigationBar",
34291
33926
  tagName: "schmancy-navigation-bar",
34292
- description: "`<schmancy-navigation-bar>` component A horizontal navigation component following Material Design 3 specifications. Navigation bars provide access to between 3-7 primary destinations. Automatically hides in fullscreen mode when triggered via schmancyTheme.next({ fullscreen: true }). **IMPORTANT**: This component includes `z-10` by default (consistent with navigation-rail). The consumer is responsible for positioning the navigation bar in their layout. For typical bottom-fixed positioning, add: `class=\"fixed bottom-0 left-0 right-0\"`.",
33927
+ description: "Bottom navigation bar Material Design 3 horizontal nav for mobile primary destinations (37 items). Auto-hides in fullscreen mode.",
33928
+ summary: "Use for mobile primary navigation (home, search, favorites, settings). For persistent desktop nav, prefer schmancy-navigation-rail or schmancy-nav-drawer. Consumer is responsible for fixed-bottom positioning via class.",
33929
+ platformPrimitive: {
33930
+ tag: "nav",
33931
+ mode: "-",
33932
+ note: "Styled horizontal nav with schmancy-navigation-bar-item children. Degrades to a plain flex container if the tag never registers."
33933
+ },
34293
33934
  attributes: [
34294
33935
  {
34295
33936
  name: "hideLabels",
@@ -34328,7 +33969,13 @@ var qp = {
34328
33969
  kind: "class",
34329
33970
  name: "SchmancyNavigationRailItem",
34330
33971
  tagName: "schmancy-navigation-rail-item",
34331
- description: "Material Design 3 Navigation Rail Item Component",
33972
+ description: "Single destination inside schmancy-navigation-rail vertically-stacked icon + optional label. @see https://m3.material.io/components/navigation-rail/overview",
33973
+ summary: "Always nested inside schmancy-navigation-rail. Use `icon` attr for a Material Symbols glyph, or slot=icon for custom content. Supports a `badge` slot for notification dots / counts.",
33974
+ platformPrimitive: {
33975
+ tag: "button",
33976
+ mode: "click",
33977
+ note: "Styled vertical navigation target. Degrades to a plain `<button>` if the tag never registers."
33978
+ },
34332
33979
  attributes: [
34333
33980
  {
34334
33981
  name: "icon",
@@ -34444,7 +34091,7 @@ var qp = {
34444
34091
  kind: "class",
34445
34092
  name: "SchmancyNavigationRail",
34446
34093
  tagName: "schmancy-navigation-rail",
34447
- description: "Material Design 3 Navigation Rail Component\r @see https://m3.material.io/components/navigation-rail/overview\r `<schmancy-navigation-rail>` component\r A Material Design 3 vertical navigation component positioned on the left side of an application.\r Navigation rails provide access to between 3-7 primary destinations with a compact footprint.\r Automatically hides in fullscreen mode when triggered via schmancyTheme.next({ fullscreen: true }).\r @element schmancy-navigation-rail\r @slot fab - Slot for a floating action button at the top\r @slot menu - Slot for a menu icon or button below the FAB\r @slot header - Custom header content slot\r @slot footer - Custom footer content slot\r @slot - Default slot for navigation rail items\r @fires navigate - When a navigation item is selected\r @fires menu-click - When the menu button is clicked\r @fires fab-click - When the FAB is clicked\r @csspart rail - The main rail container\r @csspart header - The header section\r @csspart nav - The navigation items container\r @csspart footer - The footer section",
34094
+ description: "Vertical navigation rail Material Design 3 compact left-side nav for desktop / tablet layouts with 37 primary destinations. Auto-hides in fullscreen mode. @see https://m3.material.io/components/navigation-rail/overview\r @element schmancy-navigation-rail\r @summary Use as the desktop counterpart of schmancy-navigation-bar: same destinations, different form factor. Prefer schmancy-nav-drawer when you also want a drawer + app-bar combo.",
34448
34095
  attributes: [
34449
34096
  {
34450
34097
  name: "label-visibility",
@@ -34487,7 +34134,7 @@ var qp = {
34487
34134
  description: "Whether the navigation rail is expanded\r @default false"
34488
34135
  }
34489
34136
  ],
34490
- examples: ["<schmancy-navigation-rail activeIndex=\"0\">\r\n <schmancy-button slot=\"fab\" variant=\"filled\" aria-label=\"Compose\">\r\n <schmancy-icon>add</schmancy-icon>\r\n </schmancy-button>\r\n <schmancy-button slot=\"menu\" variant=\"text\" aria-label=\"Menu\">\r\n <schmancy-icon>menu</schmancy-icon>\r\n </schmancy-button>\r\n <schmancy-navigation-rail-item icon=\"home\" label=\"Home\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"search\" label=\"Search\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"favorite\" label=\"Favorites\" badge=\"3\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"settings\" label=\"Settings\"></schmancy-navigation-rail-item>\r\n</schmancy-navigation-rail>"]
34137
+ examples: ["<schmancy-navigation-rail activeIndex=\"0\">\r\n <schmancy-icon-button slot=\"fab\" variant=\"filled\">\r\n <schmancy-icon>add</schmancy-icon>\r\n </schmancy-icon-button>\r\n <schmancy-navigation-rail-item icon=\"home\" label=\"Home\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"search\" label=\"Search\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"settings\" label=\"Settings\"></schmancy-navigation-rail-item>\r\n</schmancy-navigation-rail>\r\n@platform nav - Vertical styled nav. Degrades to a plain vertical flex container if the tag never registers.\r\n@slot fab - Slot for a floating action button at the top\r\n@slot menu - Slot for a menu icon or button below the FAB\r\n@slot header - Custom header content slot\r\n@slot footer - Custom footer content slot\r\n@slot - Default slot for navigation rail items\r\n\n@fires navigate - When a navigation item is selected\r\n@fires menu-click - When the menu button is clicked\r\n@fires fab-click - When the FAB is clicked\r\n\n@csspart rail - The main rail container\r\n@csspart header - The header section\r\n@csspart nav - The navigation items container\r\n@csspart footer - The footer section", "<schmancy-navigation-rail activeIndex=\"0\">\r\n <schmancy-button slot=\"fab\" variant=\"filled\" aria-label=\"Compose\">\r\n <schmancy-icon>add</schmancy-icon>\r\n </schmancy-button>\r\n <schmancy-button slot=\"menu\" variant=\"text\" aria-label=\"Menu\">\r\n <schmancy-icon>menu</schmancy-icon>\r\n </schmancy-button>\r\n <schmancy-navigation-rail-item icon=\"home\" label=\"Home\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"search\" label=\"Search\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"favorite\" label=\"Favorites\" badge=\"3\"></schmancy-navigation-rail-item>\r\n <schmancy-navigation-rail-item icon=\"settings\" label=\"Settings\"></schmancy-navigation-rail-item>\r\n</schmancy-navigation-rail>"]
34491
34138
  }]
34492
34139
  },
34493
34140
  {
@@ -35091,6 +34738,13 @@ var qp = {
35091
34738
  kind: "class",
35092
34739
  name: "SchmancySheet",
35093
34740
  tagName: "schmancy-sheet",
34741
+ description: "Side-docked or bottom-docked panel — a dialog variant that slides in from an edge. Driven imperatively by the `sheet` service; rarely instantiated directly.",
34742
+ summary: "Prefer `sheet.open({ component, position })` over placing this element declaratively — the service handles stacking, focus, close on outside-click, ESC, and router integration.",
34743
+ platformPrimitive: {
34744
+ tag: "dialog",
34745
+ mode: "close",
34746
+ note: "Positioned-fixed panel with backdrop. Degrades to a `<dialog>` if the tag never registers — loses slide animation, keeps focus trap + dismiss."
34747
+ },
35094
34748
  attributes: [
35095
34749
  {
35096
34750
  name: "open",
@@ -35118,7 +34772,12 @@ var qp = {
35118
34772
  type: { text: "boolean" },
35119
34773
  default: "true"
35120
34774
  }
35121
- ]
34775
+ ],
34776
+ events: [{
34777
+ name: "close",
34778
+ description: "When the sheet is dismissed (backdrop click, close button, ESC)."
34779
+ }],
34780
+ examples: ["import { sheet, SchmancySheetPosition } from '@mhmo91/schmancy'\nsheet.open({\n component: new MyEditorElement(),\n position: SchmancySheetPosition.Side,\n title: 'Edit item',\n})"]
35122
34781
  }]
35123
34782
  },
35124
34783
  {
@@ -36633,43 +36292,43 @@ var qp = {
36633
36292
  "Prefer `fromEvent(target, type).pipe(takeUntil(this.disconnecting))` over raw `addEventListener` inside components."
36634
36293
  ]
36635
36294
  };
36636
- function Jp() {
36295
+ function gp() {
36637
36296
  let e = [];
36638
- for (let t of qp.modules ?? []) {
36297
+ for (let t of hp.modules ?? []) {
36639
36298
  let n = t.declarations ?? [];
36640
36299
  for (let t of n) e.push(t);
36641
36300
  }
36642
36301
  return e;
36643
36302
  }
36644
- function Yp() {
36645
- return Jp().filter((e) => e.kind === "class" && typeof e.tagName == "string");
36303
+ function _p() {
36304
+ return gp().filter((e) => e.kind === "class" && typeof e.tagName == "string");
36646
36305
  }
36647
- function Xp() {
36648
- return Jp().filter((e) => e.kind === "variable" && !0 === e.service);
36306
+ function vp() {
36307
+ return gp().filter((e) => e.kind === "variable" && !0 === e.service);
36649
36308
  }
36650
- function Zp(e) {
36651
- return e ? Yp().find((t) => t.tagName === e) || Xp().find((t) => t.name === e) || null : {
36652
- elements: Yp().map((e) => ({
36309
+ function yp(e) {
36310
+ return e ? _p().find((t) => t.tagName === e) || vp().find((t) => t.name === e) || null : {
36311
+ elements: _p().map((e) => ({
36653
36312
  tag: e.tagName,
36654
36313
  summary: e.summary ?? e.description
36655
36314
  })),
36656
- services: Xp().map((e) => ({
36315
+ services: vp().map((e) => ({
36657
36316
  name: e.name,
36658
36317
  summary: e.summary ?? e.description
36659
36318
  }))
36660
36319
  };
36661
36320
  }
36662
- function Qp() {
36663
- return qp.tokens ?? [];
36321
+ function bp() {
36322
+ return hp.tokens ?? [];
36664
36323
  }
36665
- function $p(e) {
36666
- return Yp().find((t) => t.tagName === e)?.platformPrimitive ?? null;
36324
+ function xp(e) {
36325
+ return _p().find((t) => t.tagName === e)?.platformPrimitive ?? null;
36667
36326
  }
36668
- function em() {
36669
- return Yp().map((e) => e.tagName).filter((e) => customElements.get(e) !== void 0);
36327
+ function Sp() {
36328
+ return _p().map((e) => e.tagName).filter((e) => customElements.get(e) !== void 0);
36670
36329
  }
36671
- function tm() {
36672
- let e = new Set(Yp().map((e) => e.tagName)), t = [], n = document.querySelectorAll("*");
36330
+ function Cp() {
36331
+ let e = new Set(_p().map((e) => e.tagName)), t = [], n = document.querySelectorAll("*");
36673
36332
  for (let r of Array.from(n)) {
36674
36333
  let n = r.tagName.toLowerCase();
36675
36334
  if (!e.has(n)) continue;
@@ -36684,7 +36343,7 @@ function tm() {
36684
36343
  }
36685
36344
  return t;
36686
36345
  }
36687
- function nm() {
36346
+ function wp() {
36688
36347
  let e = typeof HTMLTemplateElement < "u" ? HTMLTemplateElement.prototype : null, t = typeof ElementInternals < "u" ? ElementInternals.prototype : null;
36689
36348
  return {
36690
36349
  popover: typeof HTMLElement < "u" && "popover" in HTMLElement.prototype,
@@ -36703,29 +36362,29 @@ function nm() {
36703
36362
  adoptedStyleSheets: typeof Document < "u" && "adoptedStyleSheets" in Document.prototype
36704
36363
  };
36705
36364
  }
36706
- var rm = null;
36707
- function im() {
36708
- typeof window < "u" && (rm || (rm = function() {
36709
- let e = new Blob([JSON.stringify(qp)], { type: "application/json" });
36365
+ var Tp = null;
36366
+ function Ep() {
36367
+ typeof window < "u" && (Tp || (Tp = function() {
36368
+ let e = new Blob([JSON.stringify(hp)], { type: "application/json" });
36710
36369
  return URL.createObjectURL(e);
36711
36370
  }(), window.schmancy = {
36712
- manifest: qp,
36713
- manifestUrl: rm,
36714
- help: Zp,
36715
- tokens: Qp,
36716
- platformPrimitive: $p,
36717
- registeredTags: em,
36718
- a11yAudit: tm,
36719
- capabilities: nm
36371
+ manifest: hp,
36372
+ manifestUrl: Tp,
36373
+ help: yp,
36374
+ tokens: bp,
36375
+ platformPrimitive: xp,
36376
+ registeredTags: Sp,
36377
+ a11yAudit: Cp,
36378
+ capabilities: wp
36720
36379
  }));
36721
36380
  }
36722
- var am = class extends V() {
36381
+ var Dp = class extends V() {
36723
36382
  connectedCallback() {
36724
- super.connectedCallback(), im();
36383
+ super.connectedCallback(), Ep();
36725
36384
  }
36726
36385
  render() {
36727
36386
  return M``;
36728
36387
  }
36729
36388
  };
36730
- am = P([F("schmancy-skill")], am);
36389
+ Dp = P([F("schmancy-skill")], Dp);
36731
36390
  export { V as $LitElement, Lc as $dialog, bd as $notify, Rc as SchmancySheetPosition, si as area, Pa as createContext, di as lazy, xc as schmancyContentDrawer, Ba as select, Va as selectItem, zc as sheet, Po as theme };