kanto-ds 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +8 -1
  2. package/dist/chunks/defaults-DKzFsNbv.js +57 -0
  3. package/dist/chunks/defaults-DKzFsNbv.js.map +1 -0
  4. package/dist/chunks/{listbox-CUXYn_3S.js → listbox-Sm3nvsC6.js} +5 -5
  5. package/dist/chunks/{listbox-CUXYn_3S.js.map → listbox-Sm3nvsC6.js.map} +1 -1
  6. package/dist/components/core/kt-icon/kt-icon.js +1 -1
  7. package/dist/components/core/kt-split-button/kt-split-button.d.ts +112 -0
  8. package/dist/components/core/kt-split-button/kt-split-button.js +262 -0
  9. package/dist/components/core/kt-split-button/kt-split-button.js.map +1 -0
  10. package/dist/components/data/kt-chart/cartesian.d.ts +62 -0
  11. package/dist/components/data/kt-chart/geometry.d.ts +41 -0
  12. package/dist/components/data/kt-chart/kt-chart.d.ts +79 -35
  13. package/dist/components/data/kt-chart/kt-chart.js +1200 -213
  14. package/dist/components/data/kt-chart/kt-chart.js.map +1 -1
  15. package/dist/components/data/kt-chart/model.d.ts +38 -0
  16. package/dist/components/data/kt-chart/point.d.ts +56 -0
  17. package/dist/components/data/kt-chart/radial.d.ts +60 -0
  18. package/dist/components/data/kt-chart/scale.d.ts +37 -0
  19. package/dist/components/forms/kt-input-menu/kt-input-menu.js +1 -1
  20. package/dist/components/forms/kt-select/kt-select.js +1 -1
  21. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +41 -25
  22. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -1
  23. package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +3 -0
  24. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +48 -28
  25. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
  26. package/dist/components/overlays/kt-modal/kt-modal.js +12 -10
  27. package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -1
  28. package/dist/icons/index.js +7 -34
  29. package/dist/icons/index.js.map +1 -1
  30. package/dist/index.d.ts +4 -2
  31. package/dist/index.js +89 -87
  32. package/dist/index.js.map +1 -1
  33. package/dist/react/index.d.ts +13 -0
  34. package/dist/react/index.js +176 -162
  35. package/dist/react/index.js.map +1 -1
  36. package/dist/vue/index.d.ts +2 -0
  37. package/dist/vue/index.js +8 -7
  38. package/dist/vue/index.js.map +1 -1
  39. package/package.json +8 -2
  40. package/dist/chunks/registry-X4LS9J5K.js +0 -30
  41. package/dist/chunks/registry-X4LS9J5K.js.map +0 -1
@@ -1,13 +1,13 @@
1
- import { css as f, nothing as c, html as d } from "lit";
2
- import { query as m, property as r } from "lit/decorators.js";
3
- import { K as p, d as h } from "../../../chunks/kt-element-CcMLO5e8.js";
1
+ import { css as f, nothing as d, html as c } from "lit";
2
+ import { query as h, property as o } from "lit/decorators.js";
3
+ import { K as p, d as m } from "../../../chunks/kt-element-CcMLO5e8.js";
4
4
  import { e as g } from "../../../chunks/events-Bjl5Zmmq.js";
5
- import { o as u, c as b, i as y } from "../../../chunks/dialog-CPIfFIlF.js";
5
+ import { o as y, c as u, i as b } from "../../../chunks/dialog-CPIfFIlF.js";
6
6
  import "../../core/kt-button/kt-button.js";
7
- var v = Object.defineProperty, a = (i, o, s, k) => {
8
- for (var e = void 0, n = i.length - 1, l; n >= 0; n--)
9
- (l = i[n]) && (e = l(o, s, e) || e);
10
- return e && v(o, s, e), e;
7
+ var v = Object.defineProperty, a = (r, e, l, k) => {
8
+ for (var i = void 0, n = r.length - 1, s; n >= 0; n--)
9
+ (s = r[n]) && (i = s(e, l, i) || i);
10
+ return i && v(e, l, i), i;
11
11
  };
12
12
  class t extends p {
13
13
  constructor() {
@@ -21,8 +21,23 @@ class t extends p {
21
21
  display: contents;
22
22
  }
23
23
 
24
+ /*
25
+ * Closed by default (\`display: none\`, the native UA default a plain
26
+ * \`dialog\` selector here would otherwise override): before this,
27
+ * \`display: flex\` applied unconditionally, so a \`<kt-confirm-dialog>\`
28
+ * that had never been opened still rendered its \`<dialog>\` in normal
29
+ * flow — \`opacity: 0\` hides it, but does not stop it from occupying
30
+ * its box or intercepting clicks meant for whatever sits underneath.
31
+ * Verified against a real page: a closed dialog several screens away
32
+ * from where it was declared silently ate clicks on the content
33
+ * behind it. \`display\` is already in the transition list below with
34
+ * \`allow-discrete\` for exactly this swap — switching \`dialog[open]\`
35
+ * to set \`display: flex\` is what makes that transition real instead
36
+ * of a no-op, and the close animation (opacity/transform) still plays
37
+ * in full before \`display\` flips back to \`none\`.
38
+ */
24
39
  dialog {
25
- display: flex;
40
+ display: none;
26
41
  flex-direction: column;
27
42
  gap: var(--gap-modal);
28
43
  box-sizing: border-box;
@@ -43,6 +58,7 @@ class t extends p {
43
58
  }
44
59
 
45
60
  dialog[open] {
61
+ display: flex;
46
62
  transform: translateY(0);
47
63
  opacity: 1;
48
64
  }
@@ -84,8 +100,8 @@ class t extends p {
84
100
  `
85
101
  ];
86
102
  }
87
- updated(o) {
88
- o.has("open") && (this.open ? (u(this.dialog), this.cancelButton?.focus()) : b(this.dialog));
103
+ updated(e) {
104
+ e.has("open") && (this.open ? (y(this.dialog), this.cancelButton?.focus()) : u(this.dialog));
89
105
  }
90
106
  confirm() {
91
107
  this.open = !1, g(this, "kt-confirm");
@@ -97,20 +113,20 @@ class t extends p {
97
113
  onDialogClose() {
98
114
  this.open && this.cancel();
99
115
  }
100
- onDialogClick(o) {
101
- y(this.dialog, o) && this.cancel();
116
+ onDialogClick(e) {
117
+ b(this.dialog, e) && this.cancel();
102
118
  }
103
119
  render() {
104
- return d`<dialog
120
+ return c`<dialog
105
121
  part="dialog"
106
122
  role="alertdialog"
107
123
  aria-label=${this.heading}
108
- aria-describedby=${this.message ? "kt-confirm-message" : c}
124
+ aria-describedby=${this.message ? "kt-confirm-message" : d}
109
125
  @close=${this.onDialogClose}
110
126
  @click=${this.onDialogClick}
111
127
  >
112
128
  <h2>${this.heading}</h2>
113
- ${this.message ? d`<p id="kt-confirm-message">${this.message}</p>` : c}
129
+ ${this.message ? c`<p id="kt-confirm-message">${this.message}</p>` : d}
114
130
  <slot></slot>
115
131
 
116
132
  <div part="actions" class="actions">
@@ -125,30 +141,30 @@ class t extends p {
125
141
  }
126
142
  }
127
143
  a([
128
- m("dialog")
144
+ h("dialog")
129
145
  ], t.prototype, "dialog");
130
146
  a([
131
- m("kt-button[data-cancel]")
147
+ h("kt-button[data-cancel]")
132
148
  ], t.prototype, "cancelButton");
133
149
  a([
134
- r({ type: Boolean, reflect: !0 })
150
+ o({ type: Boolean, reflect: !0 })
135
151
  ], t.prototype, "open");
136
152
  a([
137
- r({ type: String })
153
+ o({ type: String })
138
154
  ], t.prototype, "heading");
139
155
  a([
140
- r({ type: String })
156
+ o({ type: String })
141
157
  ], t.prototype, "message");
142
158
  a([
143
- r({ type: String, attribute: "confirm-label" })
159
+ o({ type: String, attribute: "confirm-label" })
144
160
  ], t.prototype, "confirmLabel");
145
161
  a([
146
- r({ type: String, attribute: "cancel-label" })
162
+ o({ type: String, attribute: "cancel-label" })
147
163
  ], t.prototype, "cancelLabel");
148
164
  a([
149
- r({ type: String, reflect: !0 })
165
+ o({ type: String, reflect: !0 })
150
166
  ], t.prototype, "variant");
151
- h("kt-confirm-dialog", t);
167
+ m("kt-confirm-dialog", t);
152
168
  export {
153
169
  t as KtConfirmDialog
154
170
  };
@@ -1 +1 @@
1
- {"version":3,"file":"kt-confirm-dialog.js","sources":["../../../../src/components/overlays/kt-confirm-dialog/kt-confirm-dialog.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { closeDialog, isBackdropClick, openModal } from '#internal/dialog';\nimport '../../core/kt-button/kt-button.js';\n\nexport type KtConfirmVariant = 'danger' | 'primary';\n\n/**\n * A centred yes/no overlay, for an action worth stopping to think about.\n *\n * Confirmations are for destructive or irreversible work. Editing belongs in a\n * `<kt-side-panel>`, which does not block the page behind it.\n *\n * `role=\"alertdialog\"` and the cancel button takes focus on open, so a stray\n * Enter dismisses rather than confirms.\n *\n * @element kt-confirm-dialog\n *\n * @slot - Extra content between the message and the buttons.\n *\n * @csspart dialog - The `<dialog>`.\n * @csspart actions - The button row.\n *\n * @fires kt-confirm - The confirm button was pressed.\n * @fires kt-cancel - Dismissed, by button, Escape or backdrop.\n *\n * @example\n * ```html\n * <kt-confirm-dialog\n * heading=\"Delete this entity?\"\n * message=\"This action cannot be undone.\"\n * confirm-label=\"Delete\"\n * ></kt-confirm-dialog>\n * ```\n */\nexport class KtConfirmDialog extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: contents;\n }\n\n dialog {\n display: flex;\n flex-direction: column;\n gap: var(--gap-modal);\n box-sizing: border-box;\n width: 400px;\n max-width: calc(100vw - 48px);\n padding: var(--padding-modal);\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--radius-modal);\n transform: translateY(8px);\n opacity: 0;\n transition:\n transform var(--duration-normal) var(--easing-standard),\n opacity var(--duration-normal) var(--easing-standard),\n overlay var(--duration-normal) allow-discrete,\n display var(--duration-normal) allow-discrete;\n }\n\n dialog[open] {\n transform: translateY(0);\n opacity: 1;\n }\n\n @starting-style {\n dialog[open] {\n transform: translateY(8px);\n opacity: 0;\n }\n }\n\n dialog::backdrop {\n background: var(--color-backdrop, rgba(0, 0, 0, 0.45));\n }\n\n h2 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n\n p {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--gap-button);\n }\n\n @media (prefers-reduced-motion: reduce) {\n dialog {\n transition: none;\n }\n }\n `,\n ];\n\n @query('dialog')\n private dialog!: HTMLDialogElement;\n\n @query('kt-button[data-cancel]')\n private cancelButton!: HTMLElement | null;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n heading = 'Are you sure?';\n\n @property({ type: String })\n message = '';\n\n @property({ type: String, attribute: 'confirm-label' })\n confirmLabel = 'Confirm';\n\n @property({ type: String, attribute: 'cancel-label' })\n cancelLabel = 'Cancel';\n\n /** `danger` gives the confirm button the solid red treatment. */\n @property({ type: String, reflect: true })\n variant: KtConfirmVariant = 'danger';\n\n override updated(changed: PropertyValues<this>): void {\n if (!changed.has('open')) return;\n\n if (this.open) {\n openModal(this.dialog);\n // Focus lands on Cancel, not Confirm: an Enter meant for whatever was\n // behind the dialog should not delete anything.\n this.cancelButton?.focus();\n } else {\n closeDialog(this.dialog);\n }\n }\n\n private confirm(): void {\n this.open = false;\n emit(this, 'kt-confirm');\n }\n\n private cancel(): void {\n this.open = false;\n emit(this, 'kt-cancel');\n }\n\n /** Escape closes the native dialog; report it as a cancel. */\n private onDialogClose(): void {\n if (this.open) this.cancel();\n }\n\n private onDialogClick(event: MouseEvent): void {\n if (isBackdropClick(this.dialog, event)) this.cancel();\n }\n\n override render(): TemplateResult {\n return html`<dialog\n part=\"dialog\"\n role=\"alertdialog\"\n aria-label=${this.heading}\n aria-describedby=${this.message ? 'kt-confirm-message' : nothing}\n @close=${this.onDialogClose}\n @click=${this.onDialogClick}\n >\n <h2>${this.heading}</h2>\n ${this.message ? html`<p id=\"kt-confirm-message\">${this.message}</p>` : nothing}\n <slot></slot>\n\n <div part=\"actions\" class=\"actions\">\n <kt-button data-cancel variant=\"dark\" @click=${this.cancel}>${this.cancelLabel}</kt-button>\n <kt-button\n variant=${this.variant === 'danger' ? 'delete' : 'primary'}\n @click=${this.confirm}\n >${this.confirmLabel}</kt-button\n >\n </div>\n </dialog>`;\n }\n}\n\ndefineElement('kt-confirm-dialog', KtConfirmDialog);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-confirm-dialog': KtConfirmDialog;\n }\n}\n"],"names":["KtConfirmDialog","KtElement","css","changed","openModal","closeDialog","emit","event","isBackdropClick","html","nothing","__decorateClass","query","property","defineElement"],"mappings":";;;;;;;;;;;AAqCO,MAAMA,UAAwBC,EAAU;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA,GA8EL,KAAA,OAAO,IAGP,KAAA,UAAU,iBAGV,KAAA,UAAU,IAGV,KAAA,eAAe,WAGf,KAAA,cAAc,UAId,KAAA,UAA4B;AAAA,EAAA;AAAA,EA7F5B,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAkEF;AAAA,EA2BS,QAAQC,GAAqC;AACpD,IAAKA,EAAQ,IAAI,MAAM,MAEnB,KAAK,QACPC,EAAU,KAAK,MAAM,GAGrB,KAAK,cAAc,MAAA,KAEnBC,EAAY,KAAK,MAAM;AAAA,EAE3B;AAAA,EAEQ,UAAgB;AACtB,SAAK,OAAO,IACZC,EAAK,MAAM,YAAY;AAAA,EACzB;AAAA,EAEQ,SAAe;AACrB,SAAK,OAAO,IACZA,EAAK,MAAM,WAAW;AAAA,EACxB;AAAA;AAAA,EAGQ,gBAAsB;AAC5B,IAAI,KAAK,QAAM,KAAK,OAAA;AAAA,EACtB;AAAA,EAEQ,cAAcC,GAAyB;AAC7C,IAAIC,EAAgB,KAAK,QAAQD,CAAK,UAAQ,OAAA;AAAA,EAChD;AAAA,EAES,SAAyB;AAChC,WAAOE;AAAA;AAAA;AAAA,mBAGQ,KAAK,OAAO;AAAA,yBACN,KAAK,UAAU,uBAAuBC,CAAO;AAAA,eACvD,KAAK,aAAa;AAAA,eAClB,KAAK,aAAa;AAAA;AAAA,YAErB,KAAK,OAAO;AAAA,QAChB,KAAK,UAAUD,+BAAkC,KAAK,OAAO,SAASC,CAAO;AAAA;AAAA;AAAA;AAAA,uDAI9B,KAAK,MAAM,IAAI,KAAK,WAAW;AAAA;AAAA,oBAElE,KAAK,YAAY,WAAW,WAAW,SAAS;AAAA,mBACjD,KAAK,OAAO;AAAA,aAClB,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA,EAI5B;AACF;AA/EUC,EAAA;AAAA,EADPC,EAAM,QAAQ;AAAA,GAvEJZ,EAwEH,WAAA,QAAA;AAGAW,EAAA;AAAA,EADPC,EAAM,wBAAwB;AAAA,GA1EpBZ,EA2EH,WAAA,cAAA;AAGRW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA7E/Bb,EA8EX,WAAA,MAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhFfb,EAiFX,WAAA,SAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnFfb,EAoFX,WAAA,SAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,WAAW,iBAAiB;AAAA,GAtF3Cb,EAuFX,WAAA,cAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,WAAW,gBAAgB;AAAA,GAzF1Cb,EA0FX,WAAA,aAAA;AAIAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA7F9Bb,EA8FX,WAAA,SAAA;AA2DFc,EAAc,qBAAqBd,CAAe;"}
1
+ {"version":3,"file":"kt-confirm-dialog.js","sources":["../../../../src/components/overlays/kt-confirm-dialog/kt-confirm-dialog.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { closeDialog, isBackdropClick, openModal } from '#internal/dialog';\nimport '../../core/kt-button/kt-button.js';\n\nexport type KtConfirmVariant = 'danger' | 'primary';\n\n/**\n * A centred yes/no overlay, for an action worth stopping to think about.\n *\n * Confirmations are for destructive or irreversible work. Editing belongs in a\n * `<kt-side-panel>`, which does not block the page behind it.\n *\n * `role=\"alertdialog\"` and the cancel button takes focus on open, so a stray\n * Enter dismisses rather than confirms.\n *\n * @element kt-confirm-dialog\n *\n * @slot - Extra content between the message and the buttons.\n *\n * @csspart dialog - The `<dialog>`.\n * @csspart actions - The button row.\n *\n * @fires kt-confirm - The confirm button was pressed.\n * @fires kt-cancel - Dismissed, by button, Escape or backdrop.\n *\n * @example\n * ```html\n * <kt-confirm-dialog\n * heading=\"Delete this entity?\"\n * message=\"This action cannot be undone.\"\n * confirm-label=\"Delete\"\n * ></kt-confirm-dialog>\n * ```\n */\nexport class KtConfirmDialog extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: contents;\n }\n\n /*\n * Closed by default (\\`display: none\\`, the native UA default a plain\n * \\`dialog\\` selector here would otherwise override): before this,\n * \\`display: flex\\` applied unconditionally, so a \\`<kt-confirm-dialog>\\`\n * that had never been opened still rendered its \\`<dialog>\\` in normal\n * flow — \\`opacity: 0\\` hides it, but does not stop it from occupying\n * its box or intercepting clicks meant for whatever sits underneath.\n * Verified against a real page: a closed dialog several screens away\n * from where it was declared silently ate clicks on the content\n * behind it. \\`display\\` is already in the transition list below with\n * \\`allow-discrete\\` for exactly this swap — switching \\`dialog[open]\\`\n * to set \\`display: flex\\` is what makes that transition real instead\n * of a no-op, and the close animation (opacity/transform) still plays\n * in full before \\`display\\` flips back to \\`none\\`.\n */\n dialog {\n display: none;\n flex-direction: column;\n gap: var(--gap-modal);\n box-sizing: border-box;\n width: 400px;\n max-width: calc(100vw - 48px);\n padding: var(--padding-modal);\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--radius-modal);\n transform: translateY(8px);\n opacity: 0;\n transition:\n transform var(--duration-normal) var(--easing-standard),\n opacity var(--duration-normal) var(--easing-standard),\n overlay var(--duration-normal) allow-discrete,\n display var(--duration-normal) allow-discrete;\n }\n\n dialog[open] {\n display: flex;\n transform: translateY(0);\n opacity: 1;\n }\n\n @starting-style {\n dialog[open] {\n transform: translateY(8px);\n opacity: 0;\n }\n }\n\n dialog::backdrop {\n background: var(--color-backdrop, rgba(0, 0, 0, 0.45));\n }\n\n h2 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n\n p {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--gap-button);\n }\n\n @media (prefers-reduced-motion: reduce) {\n dialog {\n transition: none;\n }\n }\n `,\n ];\n\n @query('dialog')\n private dialog!: HTMLDialogElement;\n\n @query('kt-button[data-cancel]')\n private cancelButton!: HTMLElement | null;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n heading = 'Are you sure?';\n\n @property({ type: String })\n message = '';\n\n @property({ type: String, attribute: 'confirm-label' })\n confirmLabel = 'Confirm';\n\n @property({ type: String, attribute: 'cancel-label' })\n cancelLabel = 'Cancel';\n\n /** `danger` gives the confirm button the solid red treatment. */\n @property({ type: String, reflect: true })\n variant: KtConfirmVariant = 'danger';\n\n override updated(changed: PropertyValues<this>): void {\n if (!changed.has('open')) return;\n\n if (this.open) {\n openModal(this.dialog);\n // Focus lands on Cancel, not Confirm: an Enter meant for whatever was\n // behind the dialog should not delete anything.\n this.cancelButton?.focus();\n } else {\n closeDialog(this.dialog);\n }\n }\n\n private confirm(): void {\n this.open = false;\n emit(this, 'kt-confirm');\n }\n\n private cancel(): void {\n this.open = false;\n emit(this, 'kt-cancel');\n }\n\n /** Escape closes the native dialog; report it as a cancel. */\n private onDialogClose(): void {\n if (this.open) this.cancel();\n }\n\n private onDialogClick(event: MouseEvent): void {\n if (isBackdropClick(this.dialog, event)) this.cancel();\n }\n\n override render(): TemplateResult {\n return html`<dialog\n part=\"dialog\"\n role=\"alertdialog\"\n aria-label=${this.heading}\n aria-describedby=${this.message ? 'kt-confirm-message' : nothing}\n @close=${this.onDialogClose}\n @click=${this.onDialogClick}\n >\n <h2>${this.heading}</h2>\n ${this.message ? html`<p id=\"kt-confirm-message\">${this.message}</p>` : nothing}\n <slot></slot>\n\n <div part=\"actions\" class=\"actions\">\n <kt-button data-cancel variant=\"dark\" @click=${this.cancel}>${this.cancelLabel}</kt-button>\n <kt-button\n variant=${this.variant === 'danger' ? 'delete' : 'primary'}\n @click=${this.confirm}\n >${this.confirmLabel}</kt-button\n >\n </div>\n </dialog>`;\n }\n}\n\ndefineElement('kt-confirm-dialog', KtConfirmDialog);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-confirm-dialog': KtConfirmDialog;\n }\n}\n"],"names":["KtConfirmDialog","KtElement","css","changed","openModal","closeDialog","emit","event","isBackdropClick","html","nothing","__decorateClass","query","property","defineElement"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { type TemplateResult } from 'lit';
2
2
  import { KtElement } from '#internal/kt-element';
3
3
  import { type KtOption } from '#internal/listbox';
4
4
  export type KtDropdownPlacement = 'bottom' | 'top';
5
+ export type KtDropdownAlign = 'start' | 'end';
5
6
  /**
6
7
  * A panel anchored to a trigger.
7
8
  *
@@ -35,6 +36,8 @@ export declare class KtDropdown extends KtElement {
35
36
  value: string | number | null;
36
37
  /** Where to put the panel when there is room on both sides. */
37
38
  preferredPlacement: KtDropdownPlacement;
39
+ /** Which edge of the trigger the panel lines up with. */
40
+ align: KtDropdownAlign;
38
41
  disabled: boolean;
39
42
  emptyText: string;
40
43
  /** Whether the panel is showing. */
@@ -1,20 +1,20 @@
1
- import { css as v, nothing as f, html as a } from "lit";
2
- import { query as b, state as g, property as n } from "lit/decorators.js";
3
- import { classMap as h } from "lit/directives/class-map.js";
1
+ import { css as f, nothing as v, html as s } from "lit";
2
+ import { query as b, state as g, property as i } from "lit/decorators.js";
3
+ import { classMap as c } from "lit/directives/class-map.js";
4
4
  import { K as m, d as y } from "../../../chunks/kt-element-CcMLO5e8.js";
5
- import { e as l } from "../../../chunks/events-Bjl5Zmmq.js";
6
- import { o as w } from "../../../chunks/listbox-CUXYn_3S.js";
7
- var x = Object.defineProperty, r = (p, t, i, s) => {
8
- for (var e = void 0, d = p.length - 1, c; d >= 0; d--)
9
- (c = p[d]) && (e = c(t, i, e) || e);
10
- return e && x(t, i, e), e;
5
+ import { e as d } from "../../../chunks/events-Bjl5Zmmq.js";
6
+ import { o as w } from "../../../chunks/listbox-Sm3nvsC6.js";
7
+ var x = Object.defineProperty, r = (p, t, n, a) => {
8
+ for (var e = void 0, l = p.length - 1, h; l >= 0; l--)
9
+ (h = p[l]) && (e = h(t, n, e) || e);
10
+ return e && x(t, n, e), e;
11
11
  };
12
12
  const u = 230;
13
13
  class o extends m {
14
14
  constructor() {
15
- super(...arguments), this.open = !1, this.placement = "bottom", this.options = [], this.value = null, this.preferredPlacement = "bottom", this.disabled = !1, this.emptyText = "No results", this.reposition = () => {
16
- const i = (this.triggerWrapper ?? this).getBoundingClientRect(), s = window.innerHeight - i.bottom, e = i.top;
17
- this.placement = this.preferredPlacement === "top" ? e >= u || e >= s ? "top" : "bottom" : s >= u || s >= e ? "bottom" : "top";
15
+ super(...arguments), this.open = !1, this.placement = "bottom", this.options = [], this.value = null, this.preferredPlacement = "bottom", this.align = "start", this.disabled = !1, this.emptyText = "No results", this.reposition = () => {
16
+ const n = (this.triggerWrapper ?? this).getBoundingClientRect(), a = window.innerHeight - n.bottom, e = n.top;
17
+ this.placement = this.preferredPlacement === "top" ? e >= u || e >= a ? "top" : "bottom" : a >= u || a >= e ? "bottom" : "top";
18
18
  }, this.onDocumentPointerDown = (t) => {
19
19
  t.composedPath().includes(this) || this.hide();
20
20
  }, this.onDocumentKeyDown = (t) => {
@@ -24,7 +24,7 @@ class o extends m {
24
24
  static {
25
25
  this.styles = [
26
26
  m.styles,
27
- v`
27
+ f`
28
28
  :host {
29
29
  position: relative;
30
30
  display: inline-block;
@@ -68,6 +68,18 @@ class o extends m {
68
68
  transform-origin: bottom left;
69
69
  }
70
70
 
71
+ /* Hangs the panel off the trigger's right edge, for a trigger that sits
72
+ at the right of what it belongs to — the caret of a split button. */
73
+ .panel.end {
74
+ right: 0;
75
+ left: auto;
76
+ transform-origin: top right;
77
+ }
78
+
79
+ .panel.end.top {
80
+ transform-origin: bottom right;
81
+ }
82
+
71
83
  .panel.open {
72
84
  visibility: visible;
73
85
  opacity: 1;
@@ -129,21 +141,21 @@ class o extends m {
129
141
  }
130
142
  /** Opens the panel. */
131
143
  show() {
132
- this.disabled || this.open || (this.reposition(), this.open = !0, l(this, "kt-open"));
144
+ this.disabled || this.open || (this.reposition(), this.open = !0, d(this, "kt-open"));
133
145
  }
134
146
  /** Closes the panel. */
135
147
  hide() {
136
- this.open && (this.open = !1, l(this, "kt-close"));
148
+ this.open && (this.open = !1, d(this, "kt-close"));
137
149
  }
138
150
  /** Opens or closes it. */
139
151
  toggle() {
140
152
  this.open ? this.hide() : this.show();
141
153
  }
142
154
  choose(t) {
143
- t.disabled || (this.value = t.id, this.hide(), l(this, "kt-select", { value: t.id, option: t }));
155
+ t.disabled || (this.value = t.id, this.hide(), d(this, "kt-select", { value: t.id, option: t }));
144
156
  }
145
157
  render() {
146
- return a`<div
158
+ return s`<div
147
159
  part="trigger"
148
160
  class="trigger"
149
161
  aria-haspopup="menu"
@@ -155,27 +167,32 @@ class o extends m {
155
167
 
156
168
  <div
157
169
  part="panel"
158
- class=${h({ panel: !0, open: this.open, top: this.placement === "top" })}
170
+ class=${c({
171
+ panel: !0,
172
+ open: this.open,
173
+ top: this.placement === "top",
174
+ end: this.align === "end"
175
+ })}
159
176
  role=${this.options.length > 0 ? "menu" : "group"}
160
177
  aria-hidden=${this.open ? "false" : "true"}
161
178
  >
162
- ${this.options.length > 0 ? a`<ul class="list">
179
+ ${this.options.length > 0 ? s`<ul class="list">
163
180
  ${this.options.map(
164
- (t) => a`<li
181
+ (t) => s`<li
165
182
  part="option"
166
- class=${h({
183
+ class=${c({
167
184
  option: !0,
168
185
  selected: t.id === this.value,
169
186
  disabled: !!t.disabled
170
187
  })}
171
188
  role="menuitem"
172
- aria-disabled=${t.disabled ? "true" : f}
189
+ aria-disabled=${t.disabled ? "true" : v}
173
190
  @click=${() => this.choose(t)}
174
191
  >
175
192
  ${w(t)}
176
193
  </li>`
177
194
  )}
178
- </ul>` : a`<slot name="panel">
195
+ </ul>` : s`<slot name="panel">
179
196
  <div class="empty">${this.emptyText}</div>
180
197
  </slot>`}
181
198
  </div>`;
@@ -191,19 +208,22 @@ r([
191
208
  g()
192
209
  ], o.prototype, "placement");
193
210
  r([
194
- n({ attribute: !1 })
211
+ i({ attribute: !1 })
195
212
  ], o.prototype, "options");
196
213
  r([
197
- n({ type: String })
214
+ i({ type: String })
198
215
  ], o.prototype, "value");
199
216
  r([
200
- n({ type: String, attribute: "preferred-placement" })
217
+ i({ type: String, attribute: "preferred-placement" })
201
218
  ], o.prototype, "preferredPlacement");
202
219
  r([
203
- n({ type: Boolean, reflect: !0 })
220
+ i({ type: String, reflect: !0 })
221
+ ], o.prototype, "align");
222
+ r([
223
+ i({ type: Boolean, reflect: !0 })
204
224
  ], o.prototype, "disabled");
205
225
  r([
206
- n({ type: String, attribute: "empty-text" })
226
+ i({ type: String, attribute: "empty-text" })
207
227
  ], o.prototype, "emptyText");
208
228
  y("kt-dropdown", o);
209
229
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"kt-dropdown.js","sources":["../../../../src/components/overlays/kt-dropdown/kt-dropdown.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { optionLabel, type KtOption } from '#internal/listbox';\n\nexport type KtDropdownPlacement = 'bottom' | 'top';\n\n/** Panel height plus the 6px offset, used to decide whether it fits below. */\nconst PANEL_SPACE = 224 + 6;\n\n/**\n * A panel anchored to a trigger.\n *\n * The generic overlay: pass `options` for a menu, or slot anything into\n * `panel` for arbitrary content. For choosing a value in a form, reach for\n * `<kt-select>` or `<kt-input-menu>` instead — they carry the listbox\n * semantics this one deliberately does not assume.\n *\n * @element kt-dropdown\n *\n * @slot trigger - What opens the panel.\n * @slot panel - Panel contents, when `options` is not used.\n *\n * @csspart trigger - The trigger wrapper.\n * @csspart panel - The floating panel.\n * @csspart option - A menu row.\n *\n * @fires kt-select - A menu row was chosen. `detail: { value, option }`.\n * @fires kt-open - The panel opened.\n * @fires kt-close - The panel closed.\n */\nexport class KtDropdown extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n position: relative;\n display: inline-block;\n }\n\n .trigger {\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n\n :host([disabled]) .trigger {\n cursor: not-allowed;\n opacity: 0.6;\n }\n\n .panel {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: var(--z-dropdown);\n box-sizing: border-box;\n width: 224px;\n max-height: 224px;\n margin: 0;\n padding: var(--padding-expand);\n background: var(--surface-raised);\n border-radius: var(--radius-input);\n transform: translateY(-6px);\n transform-origin: top left;\n visibility: hidden;\n opacity: 0;\n transition:\n opacity var(--duration-normal) var(--easing-standard),\n transform var(--duration-normal) var(--easing-standard);\n }\n\n .panel.top {\n top: auto;\n bottom: calc(100% + 6px);\n transform: translateY(6px);\n transform-origin: bottom left;\n }\n\n .panel.open {\n visibility: visible;\n opacity: 1;\n transform: translateY(0);\n }\n\n .list {\n display: flex;\n flex-direction: column;\n gap: var(--gap-element);\n max-height: 208px;\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n scrollbar-width: thin;\n }\n\n .option {\n padding: var(--padding-expand-item);\n color: var(--text-muted);\n font: var(--font-normal-regular);\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n .option:hover {\n background: var(--surface-hover);\n }\n\n .option.selected {\n color: var(--text-body);\n font-weight: 600;\n background: var(--color-dark-23);\n }\n\n .option.disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .empty {\n padding: var(--padding-expand-item);\n color: var(--text-muted);\n font: var(--font-normal-small);\n cursor: default;\n }\n `,\n ];\n\n @query('.trigger')\n private triggerWrapper!: HTMLElement;\n\n @state()\n private open = false;\n\n /** Where the panel actually landed, after checking the room available. */\n @state()\n private placement: KtDropdownPlacement = 'bottom';\n\n /** Menu rows. Leave empty and slot into `panel` for custom content. */\n @property({ attribute: false })\n options: readonly KtOption[] = [];\n\n /** Marks one row as current. */\n @property({ type: String })\n value: string | number | null = null;\n\n /** Where to put the panel when there is room on both sides. */\n @property({ type: String, attribute: 'preferred-placement' })\n preferredPlacement: KtDropdownPlacement = 'bottom';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: String, attribute: 'empty-text' })\n emptyText = 'No results';\n\n /** Whether the panel is showing. */\n get isOpen(): boolean {\n return this.open;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('pointerdown', this.onDocumentPointerDown);\n document.addEventListener('keydown', this.onDocumentKeyDown);\n window.addEventListener('resize', this.reposition);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this.onDocumentPointerDown);\n document.removeEventListener('keydown', this.onDocumentKeyDown);\n window.removeEventListener('resize', this.reposition);\n }\n\n /**\n * Flips the panel above the trigger when there is not enough room below,\n * preferring whichever side has more space if neither fits.\n */\n private reposition = (): void => {\n const anchor = this.triggerWrapper ?? this;\n const rect = anchor.getBoundingClientRect();\n const below = window.innerHeight - rect.bottom;\n const above = rect.top;\n\n this.placement =\n this.preferredPlacement === 'top'\n ? above >= PANEL_SPACE || above >= below\n ? 'top'\n : 'bottom'\n : below >= PANEL_SPACE || below >= above\n ? 'bottom'\n : 'top';\n };\n\n private onDocumentPointerDown = (event: Event): void => {\n if (event.composedPath().includes(this)) return;\n this.hide();\n };\n\n private onDocumentKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') this.hide();\n };\n\n /** Opens the panel. */\n show(): void {\n if (this.disabled || this.open) return;\n this.reposition();\n this.open = true;\n emit(this, 'kt-open');\n }\n\n /** Closes the panel. */\n hide(): void {\n if (!this.open) return;\n this.open = false;\n emit(this, 'kt-close');\n }\n\n /** Opens or closes it. */\n toggle(): void {\n if (this.open) this.hide();\n else this.show();\n }\n\n private choose(option: KtOption): void {\n if (option.disabled) return;\n this.value = option.id;\n this.hide();\n emit(this, 'kt-select', { value: option.id, option });\n }\n\n override render(): TemplateResult {\n return html`<div\n part=\"trigger\"\n class=\"trigger\"\n aria-haspopup=\"menu\"\n aria-expanded=${this.open ? 'true' : 'false'}\n @click=${this.toggle}\n >\n <slot name=\"trigger\"></slot>\n </div>\n\n <div\n part=\"panel\"\n class=${classMap({ panel: true, open: this.open, top: this.placement === 'top' })}\n role=${this.options.length > 0 ? 'menu' : 'group'}\n aria-hidden=${this.open ? 'false' : 'true'}\n >\n ${\n this.options.length > 0\n ? html`<ul class=\"list\">\n ${this.options.map(\n (option) =>\n html`<li\n part=\"option\"\n class=${classMap({\n option: true,\n selected: option.id === this.value,\n disabled: Boolean(option.disabled),\n })}\n role=\"menuitem\"\n aria-disabled=${option.disabled ? 'true' : nothing}\n @click=${() => this.choose(option)}\n >\n ${optionLabel(option)}\n </li>`,\n )}\n </ul>`\n : html`<slot name=\"panel\">\n <div class=\"empty\">${this.emptyText}</div>\n </slot>`\n }\n </div>`;\n }\n}\n\ndefineElement('kt-dropdown', KtDropdown);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-dropdown': KtDropdown;\n }\n}\n"],"names":["PANEL_SPACE","KtDropdown","KtElement","rect","below","above","event","css","emit","option","html","classMap","nothing","optionLabel","__decorateClass","query","state","property","defineElement"],"mappings":"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"}
1
+ {"version":3,"file":"kt-dropdown.js","sources":["../../../../src/components/overlays/kt-dropdown/kt-dropdown.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { optionLabel, type KtOption } from '#internal/listbox';\n\nexport type KtDropdownPlacement = 'bottom' | 'top';\nexport type KtDropdownAlign = 'start' | 'end';\n\n/** Panel height plus the 6px offset, used to decide whether it fits below. */\nconst PANEL_SPACE = 224 + 6;\n\n/**\n * A panel anchored to a trigger.\n *\n * The generic overlay: pass `options` for a menu, or slot anything into\n * `panel` for arbitrary content. For choosing a value in a form, reach for\n * `<kt-select>` or `<kt-input-menu>` instead — they carry the listbox\n * semantics this one deliberately does not assume.\n *\n * @element kt-dropdown\n *\n * @slot trigger - What opens the panel.\n * @slot panel - Panel contents, when `options` is not used.\n *\n * @csspart trigger - The trigger wrapper.\n * @csspart panel - The floating panel.\n * @csspart option - A menu row.\n *\n * @fires kt-select - A menu row was chosen. `detail: { value, option }`.\n * @fires kt-open - The panel opened.\n * @fires kt-close - The panel closed.\n */\nexport class KtDropdown extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n position: relative;\n display: inline-block;\n }\n\n .trigger {\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n\n :host([disabled]) .trigger {\n cursor: not-allowed;\n opacity: 0.6;\n }\n\n .panel {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: var(--z-dropdown);\n box-sizing: border-box;\n width: 224px;\n max-height: 224px;\n margin: 0;\n padding: var(--padding-expand);\n background: var(--surface-raised);\n border-radius: var(--radius-input);\n transform: translateY(-6px);\n transform-origin: top left;\n visibility: hidden;\n opacity: 0;\n transition:\n opacity var(--duration-normal) var(--easing-standard),\n transform var(--duration-normal) var(--easing-standard);\n }\n\n .panel.top {\n top: auto;\n bottom: calc(100% + 6px);\n transform: translateY(6px);\n transform-origin: bottom left;\n }\n\n /* Hangs the panel off the trigger's right edge, for a trigger that sits\n at the right of what it belongs to — the caret of a split button. */\n .panel.end {\n right: 0;\n left: auto;\n transform-origin: top right;\n }\n\n .panel.end.top {\n transform-origin: bottom right;\n }\n\n .panel.open {\n visibility: visible;\n opacity: 1;\n transform: translateY(0);\n }\n\n .list {\n display: flex;\n flex-direction: column;\n gap: var(--gap-element);\n max-height: 208px;\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n scrollbar-width: thin;\n }\n\n .option {\n padding: var(--padding-expand-item);\n color: var(--text-muted);\n font: var(--font-normal-regular);\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n .option:hover {\n background: var(--surface-hover);\n }\n\n .option.selected {\n color: var(--text-body);\n font-weight: 600;\n background: var(--color-dark-23);\n }\n\n .option.disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .empty {\n padding: var(--padding-expand-item);\n color: var(--text-muted);\n font: var(--font-normal-small);\n cursor: default;\n }\n `,\n ];\n\n @query('.trigger')\n private triggerWrapper!: HTMLElement;\n\n @state()\n private open = false;\n\n /** Where the panel actually landed, after checking the room available. */\n @state()\n private placement: KtDropdownPlacement = 'bottom';\n\n /** Menu rows. Leave empty and slot into `panel` for custom content. */\n @property({ attribute: false })\n options: readonly KtOption[] = [];\n\n /** Marks one row as current. */\n @property({ type: String })\n value: string | number | null = null;\n\n /** Where to put the panel when there is room on both sides. */\n @property({ type: String, attribute: 'preferred-placement' })\n preferredPlacement: KtDropdownPlacement = 'bottom';\n\n /** Which edge of the trigger the panel lines up with. */\n @property({ type: String, reflect: true })\n align: KtDropdownAlign = 'start';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: String, attribute: 'empty-text' })\n emptyText = 'No results';\n\n /** Whether the panel is showing. */\n get isOpen(): boolean {\n return this.open;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('pointerdown', this.onDocumentPointerDown);\n document.addEventListener('keydown', this.onDocumentKeyDown);\n window.addEventListener('resize', this.reposition);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this.onDocumentPointerDown);\n document.removeEventListener('keydown', this.onDocumentKeyDown);\n window.removeEventListener('resize', this.reposition);\n }\n\n /**\n * Flips the panel above the trigger when there is not enough room below,\n * preferring whichever side has more space if neither fits.\n */\n private reposition = (): void => {\n const anchor = this.triggerWrapper ?? this;\n const rect = anchor.getBoundingClientRect();\n const below = window.innerHeight - rect.bottom;\n const above = rect.top;\n\n this.placement =\n this.preferredPlacement === 'top'\n ? above >= PANEL_SPACE || above >= below\n ? 'top'\n : 'bottom'\n : below >= PANEL_SPACE || below >= above\n ? 'bottom'\n : 'top';\n };\n\n private onDocumentPointerDown = (event: Event): void => {\n if (event.composedPath().includes(this)) return;\n this.hide();\n };\n\n private onDocumentKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') this.hide();\n };\n\n /** Opens the panel. */\n show(): void {\n if (this.disabled || this.open) return;\n this.reposition();\n this.open = true;\n emit(this, 'kt-open');\n }\n\n /** Closes the panel. */\n hide(): void {\n if (!this.open) return;\n this.open = false;\n emit(this, 'kt-close');\n }\n\n /** Opens or closes it. */\n toggle(): void {\n if (this.open) this.hide();\n else this.show();\n }\n\n private choose(option: KtOption): void {\n if (option.disabled) return;\n this.value = option.id;\n this.hide();\n emit(this, 'kt-select', { value: option.id, option });\n }\n\n override render(): TemplateResult {\n return html`<div\n part=\"trigger\"\n class=\"trigger\"\n aria-haspopup=\"menu\"\n aria-expanded=${this.open ? 'true' : 'false'}\n @click=${this.toggle}\n >\n <slot name=\"trigger\"></slot>\n </div>\n\n <div\n part=\"panel\"\n class=${classMap({\n panel: true,\n open: this.open,\n top: this.placement === 'top',\n end: this.align === 'end',\n })}\n role=${this.options.length > 0 ? 'menu' : 'group'}\n aria-hidden=${this.open ? 'false' : 'true'}\n >\n ${\n this.options.length > 0\n ? html`<ul class=\"list\">\n ${this.options.map(\n (option) =>\n html`<li\n part=\"option\"\n class=${classMap({\n option: true,\n selected: option.id === this.value,\n disabled: Boolean(option.disabled),\n })}\n role=\"menuitem\"\n aria-disabled=${option.disabled ? 'true' : nothing}\n @click=${() => this.choose(option)}\n >\n ${optionLabel(option)}\n </li>`,\n )}\n </ul>`\n : html`<slot name=\"panel\">\n <div class=\"empty\">${this.emptyText}</div>\n </slot>`\n }\n </div>`;\n }\n}\n\ndefineElement('kt-dropdown', KtDropdown);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-dropdown': KtDropdown;\n }\n}\n"],"names":["PANEL_SPACE","KtDropdown","KtElement","rect","below","above","event","css","emit","option","html","classMap","nothing","optionLabel","__decorateClass","query","state","property","defineElement"],"mappings":";;;;;;;;;;;AAWA,MAAMA,IAAc;AAuBb,MAAMC,UAAmBC,EAAU;AAAA,EAAnC,cAAA;AAAA,UAAA,GAAA,SAAA,GAgHL,KAAQ,OAAO,IAIf,KAAQ,YAAiC,UAIzC,KAAA,UAA+B,CAAA,GAI/B,KAAA,QAAgC,MAIhC,KAAA,qBAA0C,UAI1C,KAAA,QAAyB,SAGzB,KAAA,WAAW,IAGX,KAAA,YAAY,cAyBZ,KAAQ,aAAa,MAAY;AAE/B,YAAMC,KADS,KAAK,kBAAkB,MAClB,sBAAA,GACdC,IAAQ,OAAO,cAAcD,EAAK,QAClCE,IAAQF,EAAK;AAEnB,WAAK,YACH,KAAK,uBAAuB,QACxBE,KAASL,KAAeK,KAASD,IAC/B,QACA,WACFA,KAASJ,KAAeI,KAASC,IAC/B,WACA;AAAA,IACV,GAEA,KAAQ,wBAAwB,CAACC,MAAuB;AACtD,MAAIA,EAAM,aAAA,EAAe,SAAS,IAAI,KACtC,KAAK,KAAA;AAAA,IACP,GAEA,KAAQ,oBAAoB,CAACA,MAA+B;AAC1D,MAAIA,EAAM,QAAQ,YAAU,KAAK,KAAA;AAAA,IACnC;AAAA,EAAA;AAAA,EAzLA,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBJ,EAAU;AAAA,MACVK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAuGF;AAAA;AAAA,EAmCA,IAAI,SAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAES,oBAA0B;AACjC,UAAM,kBAAA,GACN,SAAS,iBAAiB,eAAe,KAAK,qBAAqB,GACnE,SAAS,iBAAiB,WAAW,KAAK,iBAAiB,GAC3D,OAAO,iBAAiB,UAAU,KAAK,UAAU;AAAA,EACnD;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,SAAS,oBAAoB,eAAe,KAAK,qBAAqB,GACtE,SAAS,oBAAoB,WAAW,KAAK,iBAAiB,GAC9D,OAAO,oBAAoB,UAAU,KAAK,UAAU;AAAA,EACtD;AAAA;AAAA,EAgCA,OAAa;AACX,IAAI,KAAK,YAAY,KAAK,SAC1B,KAAK,WAAA,GACL,KAAK,OAAO,IACZC,EAAK,MAAM,SAAS;AAAA,EACtB;AAAA;AAAA,EAGA,OAAa;AACX,IAAK,KAAK,SACV,KAAK,OAAO,IACZA,EAAK,MAAM,UAAU;AAAA,EACvB;AAAA;AAAA,EAGA,SAAe;AACb,IAAI,KAAK,OAAM,KAAK,KAAA,SACV,KAAA;AAAA,EACZ;AAAA,EAEQ,OAAOC,GAAwB;AACrC,IAAIA,EAAO,aACX,KAAK,QAAQA,EAAO,IACpB,KAAK,KAAA,GACLD,EAAK,MAAM,aAAa,EAAE,OAAOC,EAAO,IAAI,QAAAA,GAAQ;AAAA,EACtD;AAAA,EAES,SAAyB;AAChC,WAAOC;AAAA;AAAA;AAAA;AAAA,wBAIa,KAAK,OAAO,SAAS,OAAO;AAAA,iBACnC,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOZC,EAAS;AAAA,MACf,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,KAAK,KAAK,cAAc;AAAA,MACxB,KAAK,KAAK,UAAU;AAAA,IAAA,CACrB,CAAC;AAAA,eACK,KAAK,QAAQ,SAAS,IAAI,SAAS,OAAO;AAAA,sBACnC,KAAK,OAAO,UAAU,MAAM;AAAA;AAAA,UAGxC,KAAK,QAAQ,SAAS,IAClBD;AAAA,kBACI,KAAK,QAAQ;AAAA,MACb,CAACD,MACCC;AAAA;AAAA,8BAEUC,EAAS;AAAA,QACf,QAAQ;AAAA,QACR,UAAUF,EAAO,OAAO,KAAK;AAAA,QAC7B,UAAU,EAAQA,EAAO;AAAA,MAAQ,CAClC,CAAC;AAAA;AAAA,sCAEcA,EAAO,WAAW,SAASG,CAAO;AAAA,+BACzC,MAAM,KAAK,OAAOH,CAAM,CAAC;AAAA;AAAA,wBAEhCI,EAAYJ,CAAM,CAAC;AAAA;AAAA,IAAA,CAE1B;AAAA,uBAEHC;AAAA,qCACuB,KAAK,SAAS;AAAA,sBAE3C;AAAA;AAAA,EAEN;AACF;AA3JUI,EAAA;AAAA,EADPC,EAAM,UAAU;AAAA,GA5GNd,EA6GH,WAAA,gBAAA;AAGAa,EAAA;AAAA,EADPE,EAAA;AAAM,GA/GIf,EAgHH,WAAA,MAAA;AAIAa,EAAA;AAAA,EADPE,EAAA;AAAM,GAnHIf,EAoHH,WAAA,WAAA;AAIRa,EAAA;AAAA,EADCG,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAvHnBhB,EAwHX,WAAA,SAAA;AAIAa,EAAA;AAAA,EADCG,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA3HfhB,EA4HX,WAAA,OAAA;AAIAa,EAAA;AAAA,EADCG,EAAS,EAAE,MAAM,QAAQ,WAAW,uBAAuB;AAAA,GA/HjDhB,EAgIX,WAAA,oBAAA;AAIAa,EAAA;AAAA,EADCG,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAnI9BhB,EAoIX,WAAA,OAAA;AAGAa,EAAA;AAAA,EADCG,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAtI/BhB,EAuIX,WAAA,UAAA;AAGAa,EAAA;AAAA,EADCG,EAAS,EAAE,MAAM,QAAQ,WAAW,cAAc;AAAA,GAzIxChB,EA0IX,WAAA,WAAA;AAgIFiB,EAAc,eAAejB,CAAU;"}
@@ -1,29 +1,30 @@
1
1
  import { css as g, nothing as r, html as s } from "lit";
2
2
  import { query as f, property as i } from "lit/decorators.js";
3
- import { K as h, d as m } from "../../../chunks/kt-element-CcMLO5e8.js";
3
+ import { K as c, d as m } from "../../../chunks/kt-element-CcMLO5e8.js";
4
4
  import { e as u } from "../../../chunks/events-Bjl5Zmmq.js";
5
- import { h as v } from "../../../chunks/slots-BPbIdxAJ.js";
6
- import { o as c, c as y, i as b } from "../../../chunks/dialog-CPIfFIlF.js";
5
+ import { h as y } from "../../../chunks/slots-BPbIdxAJ.js";
6
+ import { o as h, c as v, i as b } from "../../../chunks/dialog-CPIfFIlF.js";
7
7
  import "../../core/kt-button/kt-button.js";
8
- var x = Object.defineProperty, e = (l, t, d, C) => {
8
+ var x = Object.defineProperty, e = (l, t, d, k) => {
9
9
  for (var a = void 0, n = l.length - 1, p; n >= 0; n--)
10
10
  (p = l[n]) && (a = p(t, d, a) || a);
11
11
  return a && x(t, d, a), a;
12
12
  };
13
- class o extends h {
13
+ class o extends c {
14
14
  constructor() {
15
15
  super(...arguments), this.open = !1, this.heading = "", this.description = "", this.size = "medium", this.noCloseButton = !1, this.noBackdropClose = !1, this.hasFooter = !1;
16
16
  }
17
17
  static {
18
18
  this.styles = [
19
- h.styles,
19
+ c.styles,
20
20
  g`
21
21
  :host {
22
22
  display: contents;
23
23
  }
24
24
 
25
+ /* Closed by default — see kt-confirm-dialog.ts's identical comment: an unconditional \`display: flex\` here left a never-opened dialog occupying its centred box (\`opacity: 0\`, but still in flow and hit-testable), silently eating clicks meant for whatever sat underneath it on the page. */
25
26
  dialog {
26
- display: flex;
27
+ display: none;
27
28
  flex-direction: column;
28
29
  gap: var(--gap-modal);
29
30
  box-sizing: border-box;
@@ -56,6 +57,7 @@ class o extends h {
56
57
  }
57
58
 
58
59
  dialog[open] {
60
+ display: flex;
59
61
  opacity: 1;
60
62
  transform: translateY(0);
61
63
  }
@@ -125,10 +127,10 @@ class o extends h {
125
127
  ];
126
128
  }
127
129
  updated(t) {
128
- t.has("open") && (this.open ? c(this.dialog) : y(this.dialog)), this.readFooter();
130
+ t.has("open") && (this.open ? h(this.dialog) : v(this.dialog)), this.readFooter();
129
131
  }
130
132
  readFooter() {
131
- const t = v(
133
+ const t = y(
132
134
  this.shadowRoot?.querySelector('slot[name="footer"]')
133
135
  );
134
136
  t !== this.hasFooter && (this.hasFooter = t, this.requestUpdate());
@@ -136,7 +138,7 @@ class o extends h {
136
138
  /** Asks to close. A cancelled `kt-close` keeps the modal open. */
137
139
  requestClose() {
138
140
  if (u(this, "kt-close").defaultPrevented) {
139
- this.dialog.open || c(this.dialog);
141
+ this.dialog.open || h(this.dialog);
140
142
  return;
141
143
  }
142
144
  this.open = !1;
@@ -1 +1 @@
1
- {"version":3,"file":"kt-modal.js","sources":["../../../../src/components/overlays/kt-modal/kt-modal.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { hasAssignedContent } from '#internal/slots';\nimport { closeDialog, isBackdropClick, openModal } from '#internal/dialog';\nimport '../../core/kt-button/kt-button.js';\n\nexport type KtModalSize = 'small' | 'medium' | 'large' | 'full';\n\n/**\n * A centred dialog for anything that is not a yes/no question.\n *\n * `<kt-confirm-dialog>` asks one thing and offers two answers. This one holds\n * content — a compose window, a command palette, a picker — and lets you put\n * whatever you like in the footer.\n *\n * Built on the native `<dialog>`, so the top layer, focus containment, page\n * inertness and Escape all come from the platform rather than from a focus trap\n * that leaks.\n *\n * @element kt-modal\n *\n * @slot - The body.\n * @slot header - Replaces the `heading` attribute.\n * @slot footer - Actions. Hidden when empty.\n *\n * @csspart dialog - The `<dialog>`.\n * @csspart header - The header row.\n * @csspart body - The scrolling body.\n * @csspart footer - The action row.\n *\n * @fires kt-close - Dismissal requested. Cancelable, for an unsaved-changes guard.\n *\n * @example\n * ```html\n * <kt-modal open heading=\"Compose\">\n * <kt-textarea rows=\"6\"></kt-textarea>\n * <kt-button slot=\"footer\" type=\"submit\">Send</kt-button>\n * </kt-modal>\n * ```\n */\nexport class KtModal extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: contents;\n }\n\n dialog {\n display: flex;\n flex-direction: column;\n gap: var(--gap-modal);\n box-sizing: border-box;\n width: 560px;\n max-width: calc(100vw - 48px);\n max-height: calc(100vh - 96px);\n padding: var(--padding-modal);\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--radius-modal);\n opacity: 0;\n transform: translateY(8px);\n transition:\n transform var(--duration-normal) var(--easing-standard),\n opacity var(--duration-normal) var(--easing-standard),\n overlay var(--duration-normal) allow-discrete,\n display var(--duration-normal) allow-discrete;\n }\n\n :host([size='small']) dialog {\n width: 400px;\n }\n :host([size='large']) dialog {\n width: 760px;\n }\n :host([size='full']) dialog {\n width: calc(100vw - 48px);\n height: calc(100vh - 96px);\n }\n\n dialog[open] {\n opacity: 1;\n transform: translateY(0);\n }\n\n @starting-style {\n dialog[open] {\n opacity: 0;\n transform: translateY(8px);\n }\n }\n\n dialog::backdrop {\n background: var(--color-backdrop, rgba(0, 0, 0, 0.45));\n }\n\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--gap-card);\n }\n\n .titles {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n h2 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n\n .description {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .body {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n scrollbar-width: thin;\n }\n\n .footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--gap-button);\n }\n\n .footer.empty {\n display: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n dialog {\n transition: none;\n }\n }\n `,\n ];\n\n @query('dialog')\n private dialog!: HTMLDialogElement;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n @property({ type: String, reflect: true })\n size: KtModalSize = 'medium';\n\n /** Hides the close button. Escape still works — a modal you cannot leave is a trap. */\n @property({ type: Boolean, attribute: 'no-close-button' })\n noCloseButton = false;\n\n /** Stops a backdrop click from dismissing. */\n @property({ type: Boolean, attribute: 'no-backdrop-close' })\n noBackdropClose = false;\n\n private hasFooter = false;\n\n override updated(changed: PropertyValues<this>): void {\n if (changed.has('open')) {\n if (this.open) openModal(this.dialog);\n else closeDialog(this.dialog);\n }\n this.readFooter();\n }\n\n private readFooter(): void {\n const next = hasAssignedContent(\n this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"footer\"]'),\n );\n if (next === this.hasFooter) return;\n this.hasFooter = next;\n this.requestUpdate();\n }\n\n /** Asks to close. A cancelled `kt-close` keeps the modal open. */\n requestClose(): void {\n const proceed = emit(this, 'kt-close');\n if (proceed.defaultPrevented) {\n if (!this.dialog.open) openModal(this.dialog);\n return;\n }\n this.open = false;\n }\n\n private onDialogClose(): void {\n if (this.open) this.requestClose();\n }\n\n private onDialogClick(event: MouseEvent): void {\n if (this.noBackdropClose) return;\n if (isBackdropClick(this.dialog, event)) this.requestClose();\n }\n\n override render(): TemplateResult {\n const hasHeader = Boolean(this.heading) || Boolean(this.description);\n\n return html`<dialog\n part=\"dialog\"\n aria-label=${this.heading || nothing}\n @close=${this.onDialogClose}\n @click=${this.onDialogClick}\n >\n ${\n hasHeader || !this.noCloseButton\n ? html`<div part=\"header\" class=\"header\">\n <div class=\"titles\">\n <slot name=\"header\">\n ${this.heading ? html`<h2>${this.heading}</h2>` : nothing}\n </slot>\n ${this.description ? html`<p class=\"description\">${this.description}</p>` : nothing}\n </div>\n ${\n this.noCloseButton\n ? nothing\n : html`<kt-button\n variant=\"secondary-no-bg\"\n size=\"small\"\n icon=\"x\"\n label=\"Close\"\n @click=${this.requestClose}\n ></kt-button>`\n }\n </div>`\n : nothing\n }\n\n <div part=\"body\" class=\"body\"><slot></slot></div>\n\n <div part=\"footer\" class=${this.hasFooter ? 'footer' : 'footer empty'}>\n <slot name=\"footer\" @slotchange=${this.readFooter}></slot>\n </div>\n </dialog>`;\n }\n}\n\ndefineElement('kt-modal', KtModal);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-modal': KtModal;\n }\n}\n"],"names":["KtModal","KtElement","css","changed","openModal","closeDialog","next","hasAssignedContent","emit","event","isBackdropClick","hasHeader","html","nothing","__decorateClass","query","property","defineElement"],"mappings":"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"}
1
+ {"version":3,"file":"kt-modal.js","sources":["../../../../src/components/overlays/kt-modal/kt-modal.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { hasAssignedContent } from '#internal/slots';\nimport { closeDialog, isBackdropClick, openModal } from '#internal/dialog';\nimport '../../core/kt-button/kt-button.js';\n\nexport type KtModalSize = 'small' | 'medium' | 'large' | 'full';\n\n/**\n * A centred dialog for anything that is not a yes/no question.\n *\n * `<kt-confirm-dialog>` asks one thing and offers two answers. This one holds\n * content — a compose window, a command palette, a picker — and lets you put\n * whatever you like in the footer.\n *\n * Built on the native `<dialog>`, so the top layer, focus containment, page\n * inertness and Escape all come from the platform rather than from a focus trap\n * that leaks.\n *\n * @element kt-modal\n *\n * @slot - The body.\n * @slot header - Replaces the `heading` attribute.\n * @slot footer - Actions. Hidden when empty.\n *\n * @csspart dialog - The `<dialog>`.\n * @csspart header - The header row.\n * @csspart body - The scrolling body.\n * @csspart footer - The action row.\n *\n * @fires kt-close - Dismissal requested. Cancelable, for an unsaved-changes guard.\n *\n * @example\n * ```html\n * <kt-modal open heading=\"Compose\">\n * <kt-textarea rows=\"6\"></kt-textarea>\n * <kt-button slot=\"footer\" type=\"submit\">Send</kt-button>\n * </kt-modal>\n * ```\n */\nexport class KtModal extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: contents;\n }\n\n /* Closed by default — see kt-confirm-dialog.ts's identical comment: an unconditional \\`display: flex\\` here left a never-opened dialog occupying its centred box (\\`opacity: 0\\`, but still in flow and hit-testable), silently eating clicks meant for whatever sat underneath it on the page. */\n dialog {\n display: none;\n flex-direction: column;\n gap: var(--gap-modal);\n box-sizing: border-box;\n width: 560px;\n max-width: calc(100vw - 48px);\n max-height: calc(100vh - 96px);\n padding: var(--padding-modal);\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--radius-modal);\n opacity: 0;\n transform: translateY(8px);\n transition:\n transform var(--duration-normal) var(--easing-standard),\n opacity var(--duration-normal) var(--easing-standard),\n overlay var(--duration-normal) allow-discrete,\n display var(--duration-normal) allow-discrete;\n }\n\n :host([size='small']) dialog {\n width: 400px;\n }\n :host([size='large']) dialog {\n width: 760px;\n }\n :host([size='full']) dialog {\n width: calc(100vw - 48px);\n height: calc(100vh - 96px);\n }\n\n dialog[open] {\n display: flex;\n opacity: 1;\n transform: translateY(0);\n }\n\n @starting-style {\n dialog[open] {\n opacity: 0;\n transform: translateY(8px);\n }\n }\n\n dialog::backdrop {\n background: var(--color-backdrop, rgba(0, 0, 0, 0.45));\n }\n\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--gap-card);\n }\n\n .titles {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n h2 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n\n .description {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .body {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n scrollbar-width: thin;\n }\n\n .footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--gap-button);\n }\n\n .footer.empty {\n display: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n dialog {\n transition: none;\n }\n }\n `,\n ];\n\n @query('dialog')\n private dialog!: HTMLDialogElement;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n @property({ type: String, reflect: true })\n size: KtModalSize = 'medium';\n\n /** Hides the close button. Escape still works — a modal you cannot leave is a trap. */\n @property({ type: Boolean, attribute: 'no-close-button' })\n noCloseButton = false;\n\n /** Stops a backdrop click from dismissing. */\n @property({ type: Boolean, attribute: 'no-backdrop-close' })\n noBackdropClose = false;\n\n private hasFooter = false;\n\n override updated(changed: PropertyValues<this>): void {\n if (changed.has('open')) {\n if (this.open) openModal(this.dialog);\n else closeDialog(this.dialog);\n }\n this.readFooter();\n }\n\n private readFooter(): void {\n const next = hasAssignedContent(\n this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"footer\"]'),\n );\n if (next === this.hasFooter) return;\n this.hasFooter = next;\n this.requestUpdate();\n }\n\n /** Asks to close. A cancelled `kt-close` keeps the modal open. */\n requestClose(): void {\n const proceed = emit(this, 'kt-close');\n if (proceed.defaultPrevented) {\n if (!this.dialog.open) openModal(this.dialog);\n return;\n }\n this.open = false;\n }\n\n private onDialogClose(): void {\n if (this.open) this.requestClose();\n }\n\n private onDialogClick(event: MouseEvent): void {\n if (this.noBackdropClose) return;\n if (isBackdropClick(this.dialog, event)) this.requestClose();\n }\n\n override render(): TemplateResult {\n const hasHeader = Boolean(this.heading) || Boolean(this.description);\n\n return html`<dialog\n part=\"dialog\"\n aria-label=${this.heading || nothing}\n @close=${this.onDialogClose}\n @click=${this.onDialogClick}\n >\n ${\n hasHeader || !this.noCloseButton\n ? html`<div part=\"header\" class=\"header\">\n <div class=\"titles\">\n <slot name=\"header\">\n ${this.heading ? html`<h2>${this.heading}</h2>` : nothing}\n </slot>\n ${this.description ? html`<p class=\"description\">${this.description}</p>` : nothing}\n </div>\n ${\n this.noCloseButton\n ? nothing\n : html`<kt-button\n variant=\"secondary-no-bg\"\n size=\"small\"\n icon=\"x\"\n label=\"Close\"\n @click=${this.requestClose}\n ></kt-button>`\n }\n </div>`\n : nothing\n }\n\n <div part=\"body\" class=\"body\"><slot></slot></div>\n\n <div part=\"footer\" class=${this.hasFooter ? 'footer' : 'footer empty'}>\n <slot name=\"footer\" @slotchange=${this.readFooter}></slot>\n </div>\n </dialog>`;\n }\n}\n\ndefineElement('kt-modal', KtModal);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-modal': KtModal;\n }\n}\n"],"names":["KtModal","KtElement","css","changed","openModal","closeDialog","next","hasAssignedContent","emit","event","isBackdropClick","hasHeader","html","nothing","__decorateClass","query","property","defineElement"],"mappings":"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"}
@@ -1,37 +1,10 @@
1
- import { a as e } from "../chunks/registry-X4LS9J5K.js";
2
- import { g as E, r as F, b as L, t as T } from "../chunks/registry-X4LS9J5K.js";
3
- import { X as r, User as o, TriangleAlert as t, Trash2 as n, Search as s, Menu as a, LoaderCircle as c, Info as i, FileUp as C, File as h, EyeOff as l, Eye as f, Copy as p, CircleCheck as g, CircleAlert as I, ChevronUp as m, ChevronRight as v, ChevronLeft as w, ChevronDown as A, Check as U, ArrowUp as b, ArrowDown as d } from "lucide";
4
- const y = {
5
- ArrowDown: d,
6
- ArrowUp: b,
7
- Check: U,
8
- ChevronDown: A,
9
- ChevronLeft: w,
10
- ChevronRight: v,
11
- ChevronUp: m,
12
- CircleAlert: I,
13
- CircleCheck: g,
14
- Copy: p,
15
- Eye: f,
16
- EyeOff: l,
17
- File: h,
18
- FileUp: C,
19
- Info: i,
20
- LoaderCircle: c,
21
- Menu: a,
22
- Search: s,
23
- Trash2: n,
24
- TriangleAlert: t,
25
- User: o,
26
- X: r
27
- };
28
- e(y);
1
+ import { d as a, g as r, r as o, a as t, b as c, t as g } from "../chunks/defaults-DKzFsNbv.js";
29
2
  export {
30
- y as defaultIcons,
31
- E as getIcon,
32
- F as registerIcon,
33
- e as registerIcons,
34
- L as registeredIcons,
35
- T as toKebabCase
3
+ a as defaultIcons,
4
+ r as getIcon,
5
+ o as registerIcon,
6
+ t as registerIcons,
7
+ c as registeredIcons,
8
+ g as toKebabCase
36
9
  };
37
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/icons/defaults.ts"],"sourcesContent":["/**\n * The icons the design system uses in its own elements.\n *\n * Importing any Kanto element pulls this set in — roughly 2 kB of path data,\n * the price of `<kt-select>` being able to draw its own chevron. Application\n * icons are registered separately through `registerIcons`.\n */\nimport {\n ArrowDown,\n ArrowUp,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronUp,\n CircleAlert,\n CircleCheck,\n Copy,\n Eye,\n EyeOff,\n File,\n FileUp,\n Info,\n LoaderCircle,\n Menu,\n Search,\n Trash2,\n TriangleAlert,\n User,\n X,\n} from 'lucide';\n// The sibling registry, not the `kanto-ds` barrel: the barrel pulls in every\n// element, and one of them pulls in this file — a cycle that leaves\n// `registerIcons` undefined by the time the call below runs.\nimport { registerIcons } from './registry.js';\n\n/** Icons referenced by Kanto elements, keyed by their Lucide name. */\nexport const defaultIcons = {\n ArrowDown,\n ArrowUp,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronUp,\n CircleAlert,\n CircleCheck,\n Copy,\n Eye,\n EyeOff,\n File,\n FileUp,\n Info,\n LoaderCircle,\n Menu,\n Search,\n Trash2,\n TriangleAlert,\n User,\n X,\n};\n\nregisterIcons(defaultIcons);\n"],"names":["defaultIcons","ArrowDown","ArrowUp","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","CircleAlert","CircleCheck","Copy","Eye","EyeOff","File","FileUp","Info","LoaderCircle","Menu","Search","Trash2","TriangleAlert","User","X","registerIcons"],"mappings":";;;AAqCO,MAAMA,IAAe;AAAA,EAC1B,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,KAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,cAAAC;AAAA,EACA,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAAC;AACF;AAEAC,EAAcvB,CAAY;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,8 @@ export { KtBadge } from './components/core/kt-badge/kt-badge.js';
12
12
  export type { KtBadgeSize, KtBadgeTone, KtBadgeVariant, } from './components/core/kt-badge/kt-badge.js';
13
13
  export { KtButton } from './components/core/kt-button/kt-button.js';
14
14
  export type { KtButtonSize, KtButtonType, KtButtonVariant, } from './components/core/kt-button/kt-button.js';
15
+ export { KtSplitButton } from './components/core/kt-split-button/kt-split-button.js';
16
+ export type { KtSplitButtonItem } from './components/core/kt-split-button/kt-split-button.js';
15
17
  export { KtCard } from './components/core/kt-card/kt-card.js';
16
18
  export type { KtCardImagePosition } from './components/core/kt-card/kt-card.js';
17
19
  export { KtCode } from './components/core/kt-code/kt-code.js';
@@ -59,12 +61,12 @@ export { KtCollapsible } from './components/overlays/kt-collapsible/kt-collapsib
59
61
  export { KtConfirmDialog } from './components/overlays/kt-confirm-dialog/kt-confirm-dialog.js';
60
62
  export type { KtConfirmVariant } from './components/overlays/kt-confirm-dialog/kt-confirm-dialog.js';
61
63
  export { KtDropdown } from './components/overlays/kt-dropdown/kt-dropdown.js';
62
- export type { KtDropdownPlacement } from './components/overlays/kt-dropdown/kt-dropdown.js';
64
+ export type { KtDropdownAlign, KtDropdownPlacement, } from './components/overlays/kt-dropdown/kt-dropdown.js';
63
65
  export { KtModal } from './components/overlays/kt-modal/kt-modal.js';
64
66
  export type { KtModalSize } from './components/overlays/kt-modal/kt-modal.js';
65
67
  export { KtSidePanel } from './components/overlays/kt-side-panel/kt-side-panel.js';
66
68
  export { KtChart } from './components/data/kt-chart/kt-chart.js';
67
- export type { KtChartType, KtSeries } from './components/data/kt-chart/kt-chart.js';
69
+ export type { KtChartType, KtMark, KtPoint, KtSeries, } from './components/data/kt-chart/kt-chart.js';
68
70
  export { KtMeter } from './components/data/kt-meter/kt-meter.js';
69
71
  export type { KtMeterSegment } from './components/data/kt-meter/kt-meter.js';
70
72
  export { KtPagination } from './components/data/kt-pagination/kt-pagination.js';