@ixfx/components 0.11.6 → 0.11.8

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 (59) hide show
  1. package/bundle/index.d.ts +213 -2
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +1766 -165
  4. package/bundle/index.js.map +1 -1
  5. package/dist/checkbox.d.ts +3 -0
  6. package/dist/checkbox.d.ts.map +1 -1
  7. package/dist/checkbox.js +24 -1
  8. package/dist/checkbox.js.map +1 -1
  9. package/dist/checked-select-CglRukbP.d.ts +59 -0
  10. package/dist/checked-select-CglRukbP.d.ts.map +1 -0
  11. package/dist/checked-select-Dejl13qd.js +604 -0
  12. package/dist/checked-select-Dejl13qd.js.map +1 -0
  13. package/dist/checked-select.d.ts +2 -0
  14. package/dist/checked-select.js +3 -0
  15. package/dist/{detail-list-CmdCxddo.d.ts → detail-list-lE_5UWVl.d.ts} +36 -3
  16. package/dist/detail-list-lE_5UWVl.d.ts.map +1 -0
  17. package/dist/detail-list.d.ts +3 -2
  18. package/dist/detail-list.js +293 -6
  19. package/dist/detail-list.js.map +1 -1
  20. package/dist/{grid-list-D6AfWfwn.d.ts → grid-list-Bc-RkDoO.d.ts} +42 -1
  21. package/dist/grid-list-Bc-RkDoO.d.ts.map +1 -0
  22. package/dist/{grid-list-3fGhdaFA.js → grid-list-Bwaf61is.js} +659 -158
  23. package/dist/grid-list-Bwaf61is.js.map +1 -0
  24. package/dist/grid-list.d.ts +3 -2
  25. package/dist/grid-list.js +2 -1
  26. package/dist/grouping-CUKgmkMm.d.ts +63 -0
  27. package/dist/grouping-CUKgmkMm.d.ts.map +1 -0
  28. package/dist/grouping-RYPnHkrS.js +53 -0
  29. package/dist/grouping-RYPnHkrS.js.map +1 -0
  30. package/dist/{hex-editor-BiRfwTz1.js → hex-editor-DiYpgIKs.js} +2 -2
  31. package/dist/{hex-editor-BiRfwTz1.js.map → hex-editor-DiYpgIKs.js.map} +1 -1
  32. package/dist/hex.js +1 -1
  33. package/dist/index.d.ts +6 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +9 -6
  36. package/dist/index.js.map +1 -1
  37. package/dist/list-group-header.d.ts +26 -0
  38. package/dist/list-group-header.d.ts.map +1 -0
  39. package/dist/list-group-header.js +122 -0
  40. package/dist/list-group-header.js.map +1 -0
  41. package/dist/{list-selection-controller-SA4piSBi.js → list-selection-controller-BeE70lbB.js} +42 -4
  42. package/dist/list-selection-controller-BeE70lbB.js.map +1 -0
  43. package/dist/plots.js +1 -1
  44. package/dist/vertical-list.js +1 -1
  45. package/dist/{xy-axis-COKw338Q.js → xy-axis-CyMd_Bn1.js} +2 -2
  46. package/dist/{xy-axis-COKw338Q.js.map → xy-axis-CyMd_Bn1.js.map} +1 -1
  47. package/docs-user/README.md +2 -0
  48. package/docs-user/checked-select.md +63 -0
  49. package/docs-user/detail-list.md +28 -0
  50. package/docs-user/grid-list.md +35 -3
  51. package/docs-user/index.json +12 -2
  52. package/docs-user/list-group-header.md +14 -0
  53. package/docs-user/llms.txt +2 -0
  54. package/llms.txt +2 -0
  55. package/package.json +9 -1
  56. package/dist/detail-list-CmdCxddo.d.ts.map +0 -1
  57. package/dist/grid-list-3fGhdaFA.js.map +0 -1
  58. package/dist/grid-list-D6AfWfwn.d.ts.map +0 -1
  59. package/dist/list-selection-controller-SA4piSBi.js.map +0 -1
@@ -6,9 +6,12 @@ declare class Checkbox extends LitElement {
6
6
  checked: boolean;
7
7
  disabled: boolean;
8
8
  indeterminate: boolean;
9
+ readonly: boolean;
9
10
  label: string;
10
11
  name: string;
11
12
  value: string;
13
+ /** Focus the inner input, so the host can be focused like a native checkbox. */
14
+ focus(options?: FocusOptions): void;
12
15
  render(): ReturnType<typeof html>;
13
16
  }
14
17
  type CheckboxChangeDetail = {
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.d.ts","names":[],"sources":["../src/checkbox/checkbox.ts"],"mappings":";;cA2Ca,iBAAiB;;SACrB,sBAAM;EAiKgB;EACA;EACA;EACD;EACA;EACA;EAanB,UAAU,kBAAkB;;KAoB3B;WACD;;KAGC,sBAAsB,YAAY;QAEtC;YACI;IACR,iBAAiB;;;UAIJ;EACf,QAAQ;;UAGO;EACf,oBAAoB,gBAAgB,kBAClC,MAAM,GACN,WAAW,MAAM,UAAU,OAAO,iBAAiB,aACnD,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
1
+ {"version":3,"file":"checkbox.d.ts","names":[],"sources":["../src/checkbox/checkbox.ts"],"mappings":";;cA4Ca,iBAAiB;;SACrB,sBAAM;EA2KgB;EACA;EACA;EACe;EAChB;EACA;EACA;;EAGnB,MAAM,UAAU;EAiBhB,UAAU,kBAAkB;;KAsB3B;WACD;;KAGC,sBAAsB,YAAY;QAEtC;YACI;IACR,iBAAiB;;;UAIJ;EACf,QAAQ;;UAGO;EACf,oBAAoB,gBAAgB,kBAClC,MAAM,GACN,WAAW,MAAM,UAAU,OAAO,iBAAiB,aACnD,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
package/dist/checkbox.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
2
2
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
3
3
  import { t as prominenceStyles } from "./prominence-DlFShic3.js";
4
- import { LitElement, css, html } from "lit";
4
+ import { LitElement, css, html, nothing } from "lit";
5
5
  import { property } from "lit/decorators.js";
6
6
  //#region src/checkbox/checkbox.ts
7
7
  /**
@@ -14,6 +14,7 @@ import { property } from "lit/decorators.js";
14
14
  * Properties
15
15
  * checked – checkbox state (default: false)
16
16
  * disabled – disabled state (default: false)
17
+ * readonly – display-only: no pointer/keyboard interaction, full opacity (default: false)
17
18
  * label – label text
18
19
  * name – form field name
19
20
  * value – form field value
@@ -45,12 +46,14 @@ let Checkbox = class Checkbox extends LitElement {
45
46
  this.checked = false;
46
47
  this.disabled = false;
47
48
  this.indeterminate = false;
49
+ this.readonly = false;
48
50
  this.label = ``;
49
51
  this.name = ``;
50
52
  this.value = ``;
51
53
  this.#handleChange = (e) => {
52
54
  const target = e.target;
53
55
  this.checked = target.checked;
56
+ this.indeterminate = false;
54
57
  this.dispatchEvent(new CustomEvent(`change`, {
55
58
  detail: { checked: this.checked },
56
59
  bubbles: true,
@@ -113,6 +116,16 @@ let Checkbox = class Checkbox extends LitElement {
113
116
  opacity: var(--box-opacity-checked);
114
117
  }
115
118
 
119
+ /* Display-only: inert, keeps full opacity, no hover reveal */
120
+ :host([readonly]) {
121
+ pointer-events: none;
122
+ }
123
+ :host([readonly]) label,
124
+ :host([readonly]) label:hover {
125
+ cursor: default;
126
+ opacity: var(--box-opacity-checked);
127
+ }
128
+
116
129
  input {
117
130
  position: absolute;
118
131
  opacity: 0;
@@ -224,6 +237,10 @@ let Checkbox = class Checkbox extends LitElement {
224
237
  `
225
238
  ];
226
239
  }
240
+ /** Focus the inner input, so the host can be focused like a native checkbox. */
241
+ focus(options) {
242
+ this.renderRoot.querySelector(`input`)?.focus(options);
243
+ }
227
244
  #handleChange;
228
245
  render() {
229
246
  return html`
@@ -233,6 +250,8 @@ let Checkbox = class Checkbox extends LitElement {
233
250
  type="checkbox"
234
251
  .checked=${this.checked}
235
252
  .disabled=${this.disabled}
253
+ tabindex=${this.readonly ? `-1` : nothing}
254
+ aria-hidden=${this.readonly ? `true` : nothing}
236
255
  .indeterminate=${this.indeterminate}
237
256
  .name=${this.name}
238
257
  .value=${this.value}
@@ -247,6 +266,10 @@ let Checkbox = class Checkbox extends LitElement {
247
266
  __decorate([property({ type: Boolean })], Checkbox.prototype, "checked", void 0);
248
267
  __decorate([property({ type: Boolean })], Checkbox.prototype, "disabled", void 0);
249
268
  __decorate([property({ type: Boolean })], Checkbox.prototype, "indeterminate", void 0);
269
+ __decorate([property({
270
+ type: Boolean,
271
+ reflect: true
272
+ })], Checkbox.prototype, "readonly", void 0);
250
273
  __decorate([property({ type: String })], Checkbox.prototype, "label", void 0);
251
274
  __decorate([property({ type: String })], Checkbox.prototype, "name", void 0);
252
275
  __decorate([property({ type: String })], Checkbox.prototype, "value", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","names":["#handleChange","customElement"],"sources":["../src/checkbox/checkbox.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <x-checkbox> — Custom checkbox with diagonal line indicator.\n *\n * A brutalist checkbox component featuring a thick diagonal line\n * (top-left to bottom-right) when checked. Uses shadow DOM with\n * CSS variables for appearance customization.\n *\n * Properties\n * checked – checkbox state (default: false)\n * disabled – disabled state (default: false)\n * label – label text\n * name – form field name\n * value – form field value\n *\n * Events\n * change – CustomEvent { detail: { checked: boolean } }, bubbles + composed\n *\n * CSS Variables\n * --box-size – box size (default: 18px)\n * --box-border-width – border width (default: 2px)\n * --box-border-color – border color\n * --box-bg-unchecked – background when unchecked\n * --box-bg-checked – background when checked\n * --check-line-color – diagonal line color\n * --check-line-width – diagonal line thickness (default: 6px)\n * --box-opacity-unchecked – opacity when unchecked (default: 0.5)\n * --box-opacity-checked – opacity when checked (default: 1)\n * --box-opacity-hover – opacity on hover (default: 1)\n * --box-opacity-disabled – opacity when disabled (default: 0.3)\n * --box-label-gap – gap between box and label (default: 8px)\n * --label-font-size – label font size (default: 14px)\n * --label-opacity – label opacity (default: 1)\n * --label-opacity-unchecked – label opacity when unchecked (default: uses --label-opacity)\n * --transition-duration – animation duration (default: 0.2s)\n */\nimport { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-checkbox`)\nexport class Checkbox extends LitElement {\n static styles = [prominenceStyles, themeFallbacks, css`\n :host {\n /* Box */\n --box-size: 18px;\n --box-border-color: var(--surface-4);\n --box-bg-unchecked: color-mix(in oklch, var(--surface-3) 50%, var(--surface-2));\n --box-bg-checked: color-mix(in oklch, var(--surface-3) 50%, var(--surface-2));\n --box-opacity-checked: 1;\n --box-opacity-hover: var(--prominence-tickled-opacity);\n --box-opacity-disabled: var(--prominence-disabled-opacity);\n --box-border-width: 2px;\n \n /* Check */\n --check-line-width: 6px;\n --check-line-color: var(--accent);\n\n /* Spacing & borders */\n --label-gap: var(--space-m);\n\n /* Label */\n --label-opacity: 1;\n --label-opacity-unchecked: var(--label-opacity);\n --label-fg: var(--surface-3-text);\n --label-active: var(--surface-2-text);\n --label-hover: var(--surface-2-text);\n\n /* Animation */\n --transition-duration: var(--transition);\n\n display: inline-flex;\n user-select: none;\n }\n\n label {\n display: inline-flex;\n align-items: center;\n gap: var(--label-gap);\n cursor: pointer;\n position: relative;\n opacity: var(--box-opacity-unchecked);\n transition: opacity var(--transition-duration);\n }\n\n label:hover {\n opacity: var(--box-opacity-hover);\n }\n\n label:has(input:checked) {\n opacity: var(--box-opacity-checked);\n }\n\n input {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n margin: -1px;\n clip: rect(0, 0, 0, 0);\n }\n\n .box {\n position: relative;\n width: var(--box-size);\n height: var(--box-size);\n border: var(--border, 1px solid #999);\n background: var(--box-bg-unchecked);\n flex-shrink: 0;\n transition: background var(--transition-duration);\n overflow: hidden;\n box-shadow: inset 1px 1px 0px 1px color-mix(in oklch, var(--surface-2) 60%, transparent);\n }\n label:has(input:not(:disabled)) {\n .box:hover {\n background: color-mix(in oklch, var(--surface-4) 80%, transparent);\n border-color: var(--accent, #666);\n box-shadow: unset;\n }\n }\n\n input:checked ~ .box {\n background: var(--box-bg-checked);\n }\n\n /* Diagonal line from top-left to bottom-right */\n .box::after {\n content: '';\n position: absolute;\n width: 141.4%; /* sqrt(2) × 100% to span corner-to-corner */\n height: var(--check-line-width);\n background: var(--check-line-color);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n opacity: 0;\n transition: opacity var(--transition-duration);\n }\n\n input:checked ~ .box::after {\n opacity: 1;\n }\n\n /* Horizontal line for indeterminate state */\n .box::before {\n content: '';\n position: absolute;\n width: 60%;\n height: var(--check-line-width);\n background: var(--check-line-color);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity var(--transition-duration);\n }\n\n input:indeterminate ~ .box::before {\n opacity: 1;\n }\n\n /* Hide diagonal checkmark when indeterminate (must come after checked rule) */\n input:indeterminate ~ .box::after {\n opacity: 0;\n }\n\n /* Focus state */\n input:focus-visible ~ .box {\n outline: 2px solid var(--check-line-color);\n outline-offset: 2px;\n }\n\n /* Disabled state */\n label:has(input:disabled) {\n opacity: var(--box-opacity-disabled);\n cursor: not-allowed;\n .box {\n box-shadow: unset;\n } \n }\n\n .label {\n color: var(--label-fg);\n opacity: var(--label-opacity);\n transition: opacity var(--transition-duration);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .label:hover {\n color: var(--label-hover);\n }\n .label:has(+ :hover) {\n color: var(--label-hover);\n }\n .label:has(+ :active) {\n color: var(--label-active);\n }\n input:not(:checked) ~ .label {\n opacity: var(--label-opacity-unchecked);\n }\n `];\n\n @property({ type: Boolean }) checked = false;\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) indeterminate = false;\n @property({ type: String }) label = ``;\n @property({ type: String }) name = ``;\n @property({ type: String }) value = ``;\n\n #handleChange = (e: Event): void => {\n const target = e.target as HTMLInputElement;\n this.checked = target.checked;\n\n this.dispatchEvent(new CustomEvent<CheckboxChangeDetail>(`change`, {\n detail: { checked: this.checked },\n bubbles: true,\n composed: true,\n }));\n };\n\n override render(): ReturnType<typeof html> {\n return html`\n <label>\n <input\n name=\"checkbox\"\n type=\"checkbox\"\n .checked=${this.checked}\n .disabled=${this.disabled}\n .indeterminate=${this.indeterminate}\n .name=${this.name}\n .value=${this.value}\n @change=${this.#handleChange}\n />\n <span class=\"box\"></span>\n ${this.label ? html`<span class=\"label\">${this.label}</span>` : ``}\n </label>\n `;\n }\n}\n\nexport type CheckboxChangeDetail = {\n readonly checked: boolean;\n};\n\nexport type CheckboxChangeEvent = CustomEvent<CheckboxChangeDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-checkbox': Checkbox;\n }\n}\n\nexport interface CheckboxEventMap {\n change: CheckboxChangeEvent;\n}\n\nexport interface Checkbox {\n addEventListener: (<K extends keyof CheckboxEventMap>(\n type: K,\n listener: (this: Checkbox, event: CheckboxEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CO,IAAM,WAAN,MAAM,iBAAiB,WAAW;;;EAkKA,KAAA,UAAA;EACC,KAAA,WAAA;EACK,KAAA,gBAAA;EACT,KAAA,QAAA;EACD,KAAA,OAAA;EACC,KAAA,QAAA;EAEnB,KAAA,iBAAA,MAAmB;GAClC,MAAM,SAAS,EAAE;GACjB,KAAK,UAAU,OAAO;GAEtB,KAAK,cAAc,IAAI,YAAkC,UAAU;IACjE,QAAQ,EAAE,SAAS,KAAK,QAAQ;IAChC,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;EACJ;;;EAjLgB,KAAA,SAAA;GAAC;GAAkB;GAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+JrD;;CASD;CAWA,SAA2C;EACzC,OAAO,IAAI;;;;;qBAKM,KAAK,QAAQ;sBACZ,KAAK,SAAS;2BACT,KAAK,cAAc;kBAC5B,KAAK,KAAK;mBACT,KAAK,MAAM;oBACV,KAAKA,cAAc;;;UAG7B,KAAK,QAAQ,IAAI,uBAAuB,KAAK,MAAM,WAAW,GAAG;;;CAGzE;AACF;AApCG,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,SAAA,WAAA,WAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,SAAA,WAAA,YAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,SAAA,WAAA,iBAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,SAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,QAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,SAAA,KAAA,CAAA;AAxK3BC,WAAAA,WAAAA,CAAAA,kBAAc,eAAe,CAAA,GAAA,QAAA"}
1
+ {"version":3,"file":"checkbox.js","names":["#handleChange","customElement"],"sources":["../src/checkbox/checkbox.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <x-checkbox> — Custom checkbox with diagonal line indicator.\n *\n * A brutalist checkbox component featuring a thick diagonal line\n * (top-left to bottom-right) when checked. Uses shadow DOM with\n * CSS variables for appearance customization.\n *\n * Properties\n * checked – checkbox state (default: false)\n * disabled – disabled state (default: false)\n * readonly – display-only: no pointer/keyboard interaction, full opacity (default: false)\n * label – label text\n * name – form field name\n * value – form field value\n *\n * Events\n * change – CustomEvent { detail: { checked: boolean } }, bubbles + composed\n *\n * CSS Variables\n * --box-size – box size (default: 18px)\n * --box-border-width – border width (default: 2px)\n * --box-border-color – border color\n * --box-bg-unchecked – background when unchecked\n * --box-bg-checked – background when checked\n * --check-line-color – diagonal line color\n * --check-line-width – diagonal line thickness (default: 6px)\n * --box-opacity-unchecked – opacity when unchecked (default: 0.5)\n * --box-opacity-checked – opacity when checked (default: 1)\n * --box-opacity-hover – opacity on hover (default: 1)\n * --box-opacity-disabled – opacity when disabled (default: 0.3)\n * --box-label-gap – gap between box and label (default: 8px)\n * --label-font-size – label font size (default: 14px)\n * --label-opacity – label opacity (default: 1)\n * --label-opacity-unchecked – label opacity when unchecked (default: uses --label-opacity)\n * --transition-duration – animation duration (default: 0.2s)\n */\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-checkbox`)\nexport class Checkbox extends LitElement {\n static styles = [prominenceStyles, themeFallbacks, css`\n :host {\n /* Box */\n --box-size: 18px;\n --box-border-color: var(--surface-4);\n --box-bg-unchecked: color-mix(in oklch, var(--surface-3) 50%, var(--surface-2));\n --box-bg-checked: color-mix(in oklch, var(--surface-3) 50%, var(--surface-2));\n --box-opacity-checked: 1;\n --box-opacity-hover: var(--prominence-tickled-opacity);\n --box-opacity-disabled: var(--prominence-disabled-opacity);\n --box-border-width: 2px;\n \n /* Check */\n --check-line-width: 6px;\n --check-line-color: var(--accent);\n\n /* Spacing & borders */\n --label-gap: var(--space-m);\n\n /* Label */\n --label-opacity: 1;\n --label-opacity-unchecked: var(--label-opacity);\n --label-fg: var(--surface-3-text);\n --label-active: var(--surface-2-text);\n --label-hover: var(--surface-2-text);\n\n /* Animation */\n --transition-duration: var(--transition);\n\n display: inline-flex;\n user-select: none;\n }\n\n label {\n display: inline-flex;\n align-items: center;\n gap: var(--label-gap);\n cursor: pointer;\n position: relative;\n opacity: var(--box-opacity-unchecked);\n transition: opacity var(--transition-duration);\n }\n\n label:hover {\n opacity: var(--box-opacity-hover);\n }\n\n label:has(input:checked) {\n opacity: var(--box-opacity-checked);\n }\n\n /* Display-only: inert, keeps full opacity, no hover reveal */\n :host([readonly]) {\n pointer-events: none;\n }\n :host([readonly]) label,\n :host([readonly]) label:hover {\n cursor: default;\n opacity: var(--box-opacity-checked);\n }\n\n input {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n margin: -1px;\n clip: rect(0, 0, 0, 0);\n }\n\n .box {\n position: relative;\n width: var(--box-size);\n height: var(--box-size);\n border: var(--border, 1px solid #999);\n background: var(--box-bg-unchecked);\n flex-shrink: 0;\n transition: background var(--transition-duration);\n overflow: hidden;\n box-shadow: inset 1px 1px 0px 1px color-mix(in oklch, var(--surface-2) 60%, transparent);\n }\n label:has(input:not(:disabled)) {\n .box:hover {\n background: color-mix(in oklch, var(--surface-4) 80%, transparent);\n border-color: var(--accent, #666);\n box-shadow: unset;\n }\n }\n\n input:checked ~ .box {\n background: var(--box-bg-checked);\n }\n\n /* Diagonal line from top-left to bottom-right */\n .box::after {\n content: '';\n position: absolute;\n width: 141.4%; /* sqrt(2) × 100% to span corner-to-corner */\n height: var(--check-line-width);\n background: var(--check-line-color);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n opacity: 0;\n transition: opacity var(--transition-duration);\n }\n\n input:checked ~ .box::after {\n opacity: 1;\n }\n\n /* Horizontal line for indeterminate state */\n .box::before {\n content: '';\n position: absolute;\n width: 60%;\n height: var(--check-line-width);\n background: var(--check-line-color);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity var(--transition-duration);\n }\n\n input:indeterminate ~ .box::before {\n opacity: 1;\n }\n\n /* Hide diagonal checkmark when indeterminate (must come after checked rule) */\n input:indeterminate ~ .box::after {\n opacity: 0;\n }\n\n /* Focus state */\n input:focus-visible ~ .box {\n outline: 2px solid var(--check-line-color);\n outline-offset: 2px;\n }\n\n /* Disabled state */\n label:has(input:disabled) {\n opacity: var(--box-opacity-disabled);\n cursor: not-allowed;\n .box {\n box-shadow: unset;\n } \n }\n\n .label {\n color: var(--label-fg);\n opacity: var(--label-opacity);\n transition: opacity var(--transition-duration);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .label:hover {\n color: var(--label-hover);\n }\n .label:has(+ :hover) {\n color: var(--label-hover);\n }\n .label:has(+ :active) {\n color: var(--label-active);\n }\n input:not(:checked) ~ .label {\n opacity: var(--label-opacity-unchecked);\n }\n `];\n\n @property({ type: Boolean }) checked = false;\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) indeterminate = false;\n @property({ type: Boolean, reflect: true }) readonly = false;\n @property({ type: String }) label = ``;\n @property({ type: String }) name = ``;\n @property({ type: String }) value = ``;\n\n /** Focus the inner input, so the host can be focused like a native checkbox. */\n override focus(options?: FocusOptions): void {\n this.renderRoot.querySelector(`input`)?.focus(options);\n }\n\n #handleChange = (e: Event): void => {\n const target = e.target as HTMLInputElement;\n this.checked = target.checked;\n // A native click clears the input's indeterminate flag; keep the property in step\n this.indeterminate = false;\n\n this.dispatchEvent(new CustomEvent<CheckboxChangeDetail>(`change`, {\n detail: { checked: this.checked },\n bubbles: true,\n composed: true,\n }));\n };\n\n override render(): ReturnType<typeof html> {\n return html`\n <label>\n <input\n name=\"checkbox\"\n type=\"checkbox\"\n .checked=${this.checked}\n .disabled=${this.disabled}\n tabindex=${this.readonly ? `-1` : nothing}\n aria-hidden=${this.readonly ? `true` : nothing}\n .indeterminate=${this.indeterminate}\n .name=${this.name}\n .value=${this.value}\n @change=${this.#handleChange}\n />\n <span class=\"box\"></span>\n ${this.label ? html`<span class=\"label\">${this.label}</span>` : ``}\n </label>\n `;\n }\n}\n\nexport type CheckboxChangeDetail = {\n readonly checked: boolean;\n};\n\nexport type CheckboxChangeEvent = CustomEvent<CheckboxChangeDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-checkbox': Checkbox;\n }\n}\n\nexport interface CheckboxEventMap {\n change: CheckboxChangeEvent;\n}\n\nexport interface Checkbox {\n addEventListener: (<K extends keyof CheckboxEventMap>(\n type: K,\n listener: (this: Checkbox, event: CheckboxEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CO,IAAM,WAAN,MAAM,iBAAiB,WAAW;;;EA4KA,KAAA,UAAA;EACC,KAAA,WAAA;EACK,KAAA,gBAAA;EACU,KAAA,WAAA;EACnB,KAAA,QAAA;EACD,KAAA,OAAA;EACC,KAAA,QAAA;EAOnB,KAAA,iBAAA,MAAmB;GAClC,MAAM,SAAS,EAAE;GACjB,KAAK,UAAU,OAAO;GAEtB,KAAK,gBAAgB;GAErB,KAAK,cAAc,IAAI,YAAkC,UAAU;IACjE,QAAQ,EAAE,SAAS,KAAK,QAAQ;IAChC,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;EACJ;;;EAnMgB,KAAA,SAAA;GAAC;GAAkB;GAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyKrD;;;CAWD,MAAe,SAA8B;EAC3C,KAAK,WAAW,cAAc,OAAO,CAAC,EAAE,MAAM,OAAO;CACvD;CAEA;CAaA,SAA2C;EACzC,OAAO,IAAI;;;;;qBAKM,KAAK,QAAQ;sBACZ,KAAK,SAAS;qBACf,KAAK,WAAW,OAAO,QAAQ;wBAC5B,KAAK,WAAW,SAAS,QAAQ;2BAC9B,KAAK,cAAc;kBAC5B,KAAK,KAAK;mBACT,KAAK,MAAM;oBACV,KAAKA,cAAc;;;UAG7B,KAAK,QAAQ,IAAI,uBAAuB,KAAK,MAAM,WAAW,GAAG;;;CAGzE;AACF;AA9CG,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,SAAA,WAAA,WAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,SAAA,WAAA,YAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,SAAA,WAAA,iBAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,SAAA,WAAA,YAAA,KAAA,CAAA;AACzC,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,SAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,QAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,SAAA,KAAA,CAAA;AAnL3BC,WAAAA,WAAAA,CAAAA,kBAAc,eAAe,CAAA,GAAA,QAAA"}
@@ -0,0 +1,59 @@
1
+ import "./checkbox.js";
2
+ import { LitElement, PropertyValues } from "lit";
3
+ //#region src/checked-select/types.d.ts
4
+ type CheckState = `true` | `false` | `indeterminate`;
5
+ type CheckedSelectItem = {
6
+ readonly value: string;
7
+ readonly label: string;
8
+ readonly checked: CheckState;
9
+ };
10
+ type ItemDisplay = `checkbox` | `text`;
11
+ type ItemOrientation = `horizontal` | `vertical`;
12
+ //#endregion
13
+ //#region src/checked-select/checked-select.d.ts
14
+ declare class CheckedSelect extends LitElement {
15
+ #private;
16
+ static styles: import("lit").CSSResult[];
17
+ items: readonly CheckedSelectItem[];
18
+ multiline: boolean;
19
+ /** At-rest checkboxes are display-only; clicking them just opens the popup. (Not `inert`: that native attribute would block the whole element.) */
20
+ itemsInert: boolean;
21
+ /** How at-rest items are shown: as `checkbox`es, or as comma-separated `text`. */
22
+ itemDisplay: ItemDisplay;
23
+ /** Direction the resting items flow: `horizontal` (default) or `vertical` (one per row). */
24
+ orientation: ItemOrientation;
25
+ placeholder: string;
26
+ disabled: boolean;
27
+ private _open;
28
+ private _draft;
29
+ private _order;
30
+ private _size;
31
+ get isOpen(): boolean;
32
+ disconnectedCallback(): void;
33
+ willUpdate(changed: PropertyValues): void;
34
+ open(): Promise<void>;
35
+ commit(): void;
36
+ cancel(): void;
37
+ protected render(): import("lit").TemplateResult<1>;
38
+ }
39
+ type CheckedSelectChangeDetail = {
40
+ /** Every item, with its committed state. */
41
+ readonly items: readonly CheckedSelectItem[];
42
+ /** Only the items whose state changed. */
43
+ readonly changed: readonly CheckedSelectItem[];
44
+ };
45
+ type CheckedSelectChangeEvent = CustomEvent<CheckedSelectChangeDetail>;
46
+ declare global {
47
+ interface HTMLElementTagNameMap {
48
+ 'ixfx-checked-select': CheckedSelect;
49
+ }
50
+ }
51
+ interface CheckedSelectEventMap {
52
+ change: CheckedSelectChangeEvent;
53
+ }
54
+ interface CheckedSelect {
55
+ addEventListener: (<K extends keyof CheckedSelectEventMap>(type: K, listener: (this: CheckedSelect, event: CheckedSelectEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);
56
+ }
57
+ //#endregion
58
+ export { CheckState as a, ItemOrientation as c, CheckedSelectEventMap as i, CheckedSelectChangeDetail as n, CheckedSelectItem as o, CheckedSelectChangeEvent as r, ItemDisplay as s, CheckedSelect as t };
59
+ //# sourceMappingURL=checked-select-CglRukbP.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checked-select-CglRukbP.d.ts","names":[],"sources":["../src/checked-select/types.ts","../src/checked-select/checked-select.ts"],"mappings":";;;KAAY;KAEA;WACD;WACA;WACA,SAAS;;KAGR;KAEA;;;cCwCC,sBAAsB;;SACjB,sBAAM;EA6LK,gBAAgB;EACC;;EAE0B;;EAEA,aAAa;;EAExC,aAAa;EAC5B;EACgB;UAE3B;UACA;UACA;UACA;MAQb;EAsBK;EAKA,WAAW,SAAS;EAOvB,QAAQ;EAed;EAsCA;YAmMmB,wBAAM;;KA6Cf;;WAED,gBAAgB;;WAEhB,kBAAkB;;KAGjB,2BAA2B,YAAY;QAE3C;YACI;IACR,uBAAuB;;;UAIV;EACf,QAAQ;;UAGO;EACf,oBAAoB,gBAAgB,uBAClC,MAAM,GACN,WAAW,MAAM,eAAe,OAAO,sBAAsB,aAC7D,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}