@haiilo/catalyst 3.0.0 → 3.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 (77) hide show
  1. package/dist/catalyst/catalyst.css +22 -22
  2. package/dist/catalyst/catalyst.esm.js +1 -1
  3. package/dist/catalyst/catalyst.esm.js.map +1 -1
  4. package/dist/catalyst/p-1c6eace6.js +3 -0
  5. package/dist/catalyst/p-1c6eace6.js.map +1 -0
  6. package/dist/catalyst/p-d5ac868d.entry.js +10 -0
  7. package/dist/catalyst/p-d5ac868d.entry.js.map +1 -0
  8. package/dist/catalyst/scss/core/_dialog.scss +1 -1
  9. package/dist/catalyst/scss/core/_notification.scss +10 -10
  10. package/dist/catalyst/scss/core/_typography.scss +1 -1
  11. package/dist/cjs/cat-alert_24.cjs.entry.js +1354 -32
  12. package/dist/cjs/cat-alert_24.cjs.entry.js.map +1 -1
  13. package/dist/cjs/catalyst.cjs.js +2 -2
  14. package/dist/cjs/{index-e540e911.js → index-22e41d18.js} +1 -4
  15. package/dist/cjs/index-22e41d18.js.map +1 -0
  16. package/dist/cjs/loader.cjs.js +2 -2
  17. package/dist/collection/collection-manifest.json +0 -1
  18. package/dist/collection/components/cat-input/cat-input.css +10 -0
  19. package/dist/collection/components/cat-scrollable/cat-scrollable.js +18 -14
  20. package/dist/collection/components/cat-scrollable/cat-scrollable.js.map +1 -1
  21. package/dist/collection/components/cat-textarea/cat-textarea.css +5 -0
  22. package/dist/collection/scss/core/_dialog.scss +1 -1
  23. package/dist/collection/scss/core/_notification.scss +10 -10
  24. package/dist/collection/scss/core/_typography.scss +1 -1
  25. package/dist/components/cat-badge.js.map +1 -1
  26. package/dist/components/cat-button2.js.map +1 -1
  27. package/dist/components/cat-card.js.map +1 -1
  28. package/dist/components/cat-dropdown2.js +759 -2
  29. package/dist/components/cat-dropdown2.js.map +1 -1
  30. package/dist/components/cat-input.js +1 -1
  31. package/dist/components/cat-input.js.map +1 -1
  32. package/dist/components/cat-scrollable2.js +241 -14
  33. package/dist/components/cat-scrollable2.js.map +1 -1
  34. package/dist/components/cat-select-demo.js +2 -2
  35. package/dist/components/cat-select2.js +2 -187
  36. package/dist/components/cat-select2.js.map +1 -1
  37. package/dist/components/cat-textarea.js +1 -1
  38. package/dist/components/cat-textarea.js.map +1 -1
  39. package/dist/components/index.d.ts +0 -1
  40. package/dist/components/index.js +0 -1
  41. package/dist/components/index.js.map +1 -1
  42. package/dist/esm/cat-alert_24.entry.js +1348 -26
  43. package/dist/esm/cat-alert_24.entry.js.map +1 -1
  44. package/dist/esm/catalyst.js +2 -2
  45. package/dist/esm/{index-c2a28ebb.js → index-7b85fb91.js} +1 -4
  46. package/dist/esm/index-7b85fb91.js.map +1 -0
  47. package/dist/esm/loader.js +2 -2
  48. package/dist/types/components/cat-scrollable/cat-scrollable.d.ts +3 -0
  49. package/dist/types/components.d.ts +0 -25
  50. package/package.json +2 -2
  51. package/dist/catalyst/p-52f9fea7.entry.js +0 -2
  52. package/dist/catalyst/p-52f9fea7.entry.js.map +0 -1
  53. package/dist/catalyst/p-53a1db22.js +0 -3
  54. package/dist/catalyst/p-53a1db22.js.map +0 -1
  55. package/dist/catalyst/p-557c8009.entry.js +0 -2
  56. package/dist/catalyst/p-557c8009.entry.js.map +0 -1
  57. package/dist/catalyst/p-60a20ebe.js +0 -10
  58. package/dist/catalyst/p-60a20ebe.js.map +0 -1
  59. package/dist/cjs/cat-modal.cjs.entry.js +0 -74
  60. package/dist/cjs/cat-modal.cjs.entry.js.map +0 -1
  61. package/dist/cjs/first-tabbable-7966cf1c.js +0 -1288
  62. package/dist/cjs/first-tabbable-7966cf1c.js.map +0 -1
  63. package/dist/cjs/index-e540e911.js.map +0 -1
  64. package/dist/collection/components/cat-modal/cat-modal.css +0 -65
  65. package/dist/collection/components/cat-modal/cat-modal.js +0 -117
  66. package/dist/collection/components/cat-modal/cat-modal.js.map +0 -1
  67. package/dist/components/cat-modal.d.ts +0 -11
  68. package/dist/components/cat-modal.js +0 -111
  69. package/dist/components/cat-modal.js.map +0 -1
  70. package/dist/components/focus-trap.esm.js +0 -763
  71. package/dist/components/focus-trap.esm.js.map +0 -1
  72. package/dist/esm/cat-modal.entry.js +0 -70
  73. package/dist/esm/cat-modal.entry.js.map +0 -1
  74. package/dist/esm/first-tabbable-4a00de61.js +0 -1284
  75. package/dist/esm/first-tabbable-4a00de61.js.map +0 -1
  76. package/dist/esm/index-c2a28ebb.js.map +0 -1
  77. package/dist/types/components/cat-modal/cat-modal.d.ts +0 -20
@@ -1,117 +0,0 @@
1
- import { Component, Element, h, Method, Prop, State } from '@stencil/core';
2
- import * as focusTrap from 'focus-trap';
3
- import firstTabbable from '../../utils/first-tabbable';
4
- export class CatModal {
5
- constructor() {
6
- this.isVisible = false;
7
- /**
8
- * The size of the modal.
9
- */
10
- this.size = 'm';
11
- }
12
- componentDidLoad() {
13
- if (this.modal) {
14
- this.trap = focusTrap.createFocusTrap(this.modal, {
15
- tabbableOptions: {
16
- getShadowRoot: true
17
- },
18
- initialFocus: firstTabbable(this.closeButton),
19
- allowOutsideClick: true,
20
- clickOutsideDeactivates: event => !this.modal || !event.composedPath().includes(this.modal),
21
- onDeactivate: () => (this.isVisible = false),
22
- setReturnFocus: previousActiveElement => previousActiveElement instanceof HTMLElement
23
- ? firstTabbable(previousActiveElement)
24
- : previousActiveElement
25
- });
26
- }
27
- }
28
- componentDidUpdate() {
29
- var _a;
30
- if (this.isVisible)
31
- (_a = this.trap) === null || _a === void 0 ? void 0 : _a.activate();
32
- this.updateAccessibility(this.hostElement);
33
- }
34
- /**
35
- * Shows the modal.
36
- */
37
- async show() {
38
- this.isVisible = true;
39
- }
40
- render() {
41
- return (h("div", { "aria-modal": true, role: "dialog", "aria-hidden": !this.isVisible ? 'true' : 'false', class: "modal-wrapper" },
42
- h("div", { ref: el => (this.modal = el), class: { modal: true, [`modal-${this.size}`]: Boolean(this.size) } },
43
- h("div", { class: "modal-header" },
44
- h("cat-button", { ref: el => (this.closeButton = el), icon: "cross-outlined", class: "close-button", size: "s", iconOnly: true, a11yLabel: "close", onCatClick: this.onClick.bind(this) })),
45
- h("div", { class: "modal-content" },
46
- h("slot", null)))));
47
- }
48
- onClick() {
49
- var _a;
50
- (_a = this.trap) === null || _a === void 0 ? void 0 : _a.deactivate();
51
- }
52
- updateAccessibility(element) {
53
- if (element.parentElement) {
54
- Array.from(element.parentElement.children).forEach(elementSibling => {
55
- if (elementSibling !== element) {
56
- this.isVisible
57
- ? elementSibling.setAttribute('aria-hidden', 'true')
58
- : elementSibling.removeAttribute('aria-hidden');
59
- }
60
- });
61
- if (element.parentElement !== document.body) {
62
- this.updateAccessibility(element.parentElement);
63
- }
64
- }
65
- }
66
- static get is() { return "cat-modal"; }
67
- static get encapsulation() { return "shadow"; }
68
- static get originalStyleUrls() { return {
69
- "$": ["cat-modal.scss"]
70
- }; }
71
- static get styleUrls() { return {
72
- "$": ["cat-modal.css"]
73
- }; }
74
- static get properties() { return {
75
- "size": {
76
- "type": "string",
77
- "mutable": false,
78
- "complexType": {
79
- "original": "'s' | 'm' | 'l'",
80
- "resolved": "\"l\" | \"m\" | \"s\"",
81
- "references": {}
82
- },
83
- "required": false,
84
- "optional": false,
85
- "docs": {
86
- "tags": [],
87
- "text": "The size of the modal."
88
- },
89
- "attribute": "size",
90
- "reflect": false,
91
- "defaultValue": "'m'"
92
- }
93
- }; }
94
- static get states() { return {
95
- "isVisible": {}
96
- }; }
97
- static get methods() { return {
98
- "show": {
99
- "complexType": {
100
- "signature": "() => Promise<void>",
101
- "parameters": [],
102
- "references": {
103
- "Promise": {
104
- "location": "global"
105
- }
106
- },
107
- "return": "Promise<void>"
108
- },
109
- "docs": {
110
- "text": "Shows the modal.",
111
- "tags": []
112
- }
113
- }
114
- }; }
115
- static get elementRef() { return "hostElement"; }
116
- }
117
- //# sourceMappingURL=cat-modal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cat-modal.js","sourceRoot":"","sources":["../../../src/components/cat-modal/cat-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Element, h, Method, Prop, State } from '@stencil/core';\nimport * as focusTrap from 'focus-trap';\nimport firstTabbable from '../../utils/first-tabbable';\n\n@Component({\n tag: 'cat-modal',\n styleUrl: 'cat-modal.scss',\n shadow: true\n})\nexport class CatModal {\n private trap?: focusTrap.FocusTrap;\n private modal?: HTMLElement;\n private closeButton?: HTMLElement;\n\n @Element() hostElement!: HTMLElement;\n\n @State() isVisible = false;\n\n /**\n * The size of the modal.\n */\n @Prop() size: 's' | 'm' | 'l' = 'm';\n\n componentDidLoad(): void {\n if (this.modal) {\n this.trap = focusTrap.createFocusTrap(this.modal, {\n tabbableOptions: {\n getShadowRoot: true\n },\n initialFocus: firstTabbable(this.closeButton),\n allowOutsideClick: true,\n clickOutsideDeactivates: event => !this.modal || !event.composedPath().includes(this.modal),\n onDeactivate: () => (this.isVisible = false),\n setReturnFocus: previousActiveElement =>\n previousActiveElement instanceof HTMLElement\n ? (firstTabbable(previousActiveElement) as HTMLElement)\n : previousActiveElement\n });\n }\n }\n\n componentDidUpdate(): void {\n if (this.isVisible) this.trap?.activate();\n this.updateAccessibility(this.hostElement);\n }\n\n /**\n * Shows the modal.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true;\n }\n\n render() {\n return (\n <div aria-modal role=\"dialog\" aria-hidden={!this.isVisible ? 'true' : 'false'} class=\"modal-wrapper\">\n <div ref={el => (this.modal = el)} class={{ modal: true, [`modal-${this.size}`]: Boolean(this.size) }}>\n <div class=\"modal-header\">\n <cat-button\n ref={el => (this.closeButton = el)}\n icon=\"cross-outlined\"\n class=\"close-button\"\n size=\"s\"\n iconOnly\n a11yLabel=\"close\"\n onCatClick={this.onClick.bind(this)}\n ></cat-button>\n </div>\n <div class=\"modal-content\">\n <slot></slot>\n </div>\n </div>\n </div>\n );\n }\n\n private onClick() {\n this.trap?.deactivate();\n }\n\n private updateAccessibility(element: HTMLElement) {\n if (element.parentElement) {\n Array.from(element.parentElement.children).forEach(elementSibling => {\n if (elementSibling !== element) {\n this.isVisible\n ? elementSibling.setAttribute('aria-hidden', 'true')\n : elementSibling.removeAttribute('aria-hidden');\n }\n });\n\n if (element.parentElement !== document.body) {\n this.updateAccessibility(element.parentElement);\n }\n }\n }\n}\n"]}
@@ -1,11 +0,0 @@
1
- import type { Components, JSX } from "../types/components";
2
-
3
- interface CatModal extends Components.CatModal, HTMLElement {}
4
- export const CatModal: {
5
- prototype: CatModal;
6
- new (): CatModal;
7
- };
8
- /**
9
- * Used to define this component and all nested components recursively.
10
- */
11
- export const defineCustomElement: () => void;
@@ -1,111 +0,0 @@
1
- import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client';
2
- import { c as createFocusTrap } from './focus-trap.esm.js';
3
- import { f as firstTabbable } from './first-tabbable.js';
4
- import { d as defineCustomElement$4 } from './cat-button2.js';
5
- import { d as defineCustomElement$3 } from './cat-icon2.js';
6
- import { d as defineCustomElement$2 } from './cat-spinner2.js';
7
-
8
- const catModalCss = ":host{display:block}:host([hidden]){display:none}.modal-wrapper{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgb(rgb(var(--cat-bg-backdrop, 27, 31, 38)), var(--cat-opacity-backdrop, 0.4));z-index:2;display:flex}.modal-wrapper[aria-hidden=true]{display:none}.modal{margin:auto;z-index:2;position:relative;background-color:white;border-radius:var(--cat-border-radius-l, 0.5rem);max-width:100%;padding:32px}.modal-header{display:flex;justify-content:end;align-self:stretch}.modal-header .close-button::part(button){box-shadow:unset}.modal-content{display:flex;flex-direction:column;align-items:flex-start;align-self:stretch;margin:16px 0}.modal-s{width:400px}.modal-m{width:600px}.modal-l{width:800px}";
9
-
10
- const CatModal$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
11
- constructor() {
12
- super();
13
- this.__registerHost();
14
- this.__attachShadow();
15
- this.isVisible = false;
16
- /**
17
- * The size of the modal.
18
- */
19
- this.size = 'm';
20
- }
21
- componentDidLoad() {
22
- if (this.modal) {
23
- this.trap = createFocusTrap(this.modal, {
24
- tabbableOptions: {
25
- getShadowRoot: true
26
- },
27
- initialFocus: firstTabbable(this.closeButton),
28
- allowOutsideClick: true,
29
- clickOutsideDeactivates: event => !this.modal || !event.composedPath().includes(this.modal),
30
- onDeactivate: () => (this.isVisible = false),
31
- setReturnFocus: previousActiveElement => previousActiveElement instanceof HTMLElement
32
- ? firstTabbable(previousActiveElement)
33
- : previousActiveElement
34
- });
35
- }
36
- }
37
- componentDidUpdate() {
38
- var _a;
39
- if (this.isVisible)
40
- (_a = this.trap) === null || _a === void 0 ? void 0 : _a.activate();
41
- this.updateAccessibility(this.hostElement);
42
- }
43
- /**
44
- * Shows the modal.
45
- */
46
- async show() {
47
- this.isVisible = true;
48
- }
49
- render() {
50
- return (h("div", { "aria-modal": true, role: "dialog", "aria-hidden": !this.isVisible ? 'true' : 'false', class: "modal-wrapper" }, h("div", { ref: el => (this.modal = el), class: { modal: true, [`modal-${this.size}`]: Boolean(this.size) } }, h("div", { class: "modal-header" }, h("cat-button", { ref: el => (this.closeButton = el), icon: "cross-outlined", class: "close-button", size: "s", iconOnly: true, a11yLabel: "close", onCatClick: this.onClick.bind(this) })), h("div", { class: "modal-content" }, h("slot", null)))));
51
- }
52
- onClick() {
53
- var _a;
54
- (_a = this.trap) === null || _a === void 0 ? void 0 : _a.deactivate();
55
- }
56
- updateAccessibility(element) {
57
- if (element.parentElement) {
58
- Array.from(element.parentElement.children).forEach(elementSibling => {
59
- if (elementSibling !== element) {
60
- this.isVisible
61
- ? elementSibling.setAttribute('aria-hidden', 'true')
62
- : elementSibling.removeAttribute('aria-hidden');
63
- }
64
- });
65
- if (element.parentElement !== document.body) {
66
- this.updateAccessibility(element.parentElement);
67
- }
68
- }
69
- }
70
- get hostElement() { return this; }
71
- static get style() { return catModalCss; }
72
- }, [1, "cat-modal", {
73
- "size": [1],
74
- "isVisible": [32],
75
- "show": [64]
76
- }]);
77
- function defineCustomElement$1() {
78
- if (typeof customElements === "undefined") {
79
- return;
80
- }
81
- const components = ["cat-modal", "cat-button", "cat-icon", "cat-spinner"];
82
- components.forEach(tagName => { switch (tagName) {
83
- case "cat-modal":
84
- if (!customElements.get(tagName)) {
85
- customElements.define(tagName, CatModal$1);
86
- }
87
- break;
88
- case "cat-button":
89
- if (!customElements.get(tagName)) {
90
- defineCustomElement$4();
91
- }
92
- break;
93
- case "cat-icon":
94
- if (!customElements.get(tagName)) {
95
- defineCustomElement$3();
96
- }
97
- break;
98
- case "cat-spinner":
99
- if (!customElements.get(tagName)) {
100
- defineCustomElement$2();
101
- }
102
- break;
103
- } });
104
- }
105
-
106
- const CatModal = CatModal$1;
107
- const defineCustomElement = defineCustomElement$1;
108
-
109
- export { CatModal, defineCustomElement };
110
-
111
- //# sourceMappingURL=cat-modal.js.map
@@ -1 +0,0 @@
1
- {"file":"cat-modal.js","mappings":";;;;;;;AAAA,MAAM,WAAW,GAAG,6sBAA6sB;;MCSptBA,UAAQ;EALrB;;;;IAYW,cAAS,GAAG,KAAK,CAAC;;;;IAKnB,SAAI,GAAoB,GAAG,CAAC;GA2ErC;EAzEC,gBAAgB;IACd,IAAI,IAAI,CAAC,KAAK,EAAE;MACd,IAAI,CAAC,IAAI,GAAGC,eAAyB,CAAC,IAAI,CAAC,KAAK,EAAE;QAChD,eAAe,EAAE;UACf,aAAa,EAAE,IAAI;SACpB;QACD,YAAY,EAAE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7C,iBAAiB,EAAE,IAAI;QACvB,uBAAuB,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC3F,YAAY,EAAE,OAAO,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC5C,cAAc,EAAE,qBAAqB,IACnC,qBAAqB,YAAY,WAAW;YACvC,aAAa,CAAC,qBAAqB,CAAiB;YACrD,qBAAqB;OAC5B,CAAC,CAAC;KACJ;GACF;EAED,kBAAkB;;IAChB,IAAI,IAAI,CAAC,SAAS;MAAE,MAAA,IAAI,CAAC,IAAI,0CAAE,QAAQ,EAAE,CAAC;IAC1C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;GAC5C;;;;EAMD,MAAM,IAAI;IACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;GACvB;EAED,MAAM;IACJ,QACE,+BAAgB,IAAI,EAAC,QAAQ,iBAAc,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,OAAO,EAAE,KAAK,EAAC,eAAe,IAClG,WAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IACnG,WAAK,KAAK,EAAC,cAAc,IACvB,kBACE,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,EAClC,IAAI,EAAC,gBAAgB,EACrB,KAAK,EAAC,cAAc,EACpB,IAAI,EAAC,GAAG,EACR,QAAQ,QACR,SAAS,EAAC,OAAO,EACjB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GACvB,CACV,EACN,WAAK,KAAK,EAAC,eAAe,IACxB,eAAa,CACT,CACF,CACF,EACN;GACH;EAEO,OAAO;;IACb,MAAA,IAAI,CAAC,IAAI,0CAAE,UAAU,EAAE,CAAC;GACzB;EAEO,mBAAmB,CAAC,OAAoB;IAC9C,IAAI,OAAO,CAAC,aAAa,EAAE;MACzB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc;QAC/D,IAAI,cAAc,KAAK,OAAO,EAAE;UAC9B,IAAI,CAAC,SAAS;cACV,cAAc,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;cAClD,cAAc,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;SACnD;OACF,CAAC,CAAC;MAEH,IAAI,OAAO,CAAC,aAAa,KAAK,QAAQ,CAAC,IAAI,EAAE;QAC3C,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;OACjD;KACF;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["CatModal","focusTrap.createFocusTrap"],"sources":["./src/components/cat-modal/cat-modal.scss?tag=cat-modal&encapsulation=shadow","./src/components/cat-modal/cat-modal.tsx"],"sourcesContent":["@use 'variables' as *;\n@use 'mixins' as *;\n\n:host {\n display: block;\n}\n\n:host([hidden]) {\n display: none;\n}\n\n.modal-wrapper {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgb(cat-token('color.ui.background.backdrop'), cat-token('opacity.backdrop'));\n z-index: 2;\n display: flex;\n\n &[aria-hidden='true'] {\n display: none;\n }\n}\n\n.modal {\n margin: auto;\n z-index: 2;\n position: relative;\n background-color: cat-token('color.ui.background.body');\n border-radius: cat-border-radius('l');\n max-width: 100%;\n padding: 32px;\n}\n\n.modal-header {\n display: flex;\n justify-content: end;\n align-self: stretch;\n\n .close-button::part(button) {\n box-shadow: unset;\n }\n}\n\n.modal-content {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n align-self: stretch;\n margin: 16px 0;\n}\n\n@mixin size($size) {\n .modal-#{$size} {\n width: cat-token('size.modal.#{$size}');\n }\n}\n\n@include size('s');\n@include size('m');\n@include size('l');\n","import { Component, Element, h, Method, Prop, State } from '@stencil/core';\nimport * as focusTrap from 'focus-trap';\nimport firstTabbable from '../../utils/first-tabbable';\n\n@Component({\n tag: 'cat-modal',\n styleUrl: 'cat-modal.scss',\n shadow: true\n})\nexport class CatModal {\n private trap?: focusTrap.FocusTrap;\n private modal?: HTMLElement;\n private closeButton?: HTMLElement;\n\n @Element() hostElement!: HTMLElement;\n\n @State() isVisible = false;\n\n /**\n * The size of the modal.\n */\n @Prop() size: 's' | 'm' | 'l' = 'm';\n\n componentDidLoad(): void {\n if (this.modal) {\n this.trap = focusTrap.createFocusTrap(this.modal, {\n tabbableOptions: {\n getShadowRoot: true\n },\n initialFocus: firstTabbable(this.closeButton),\n allowOutsideClick: true,\n clickOutsideDeactivates: event => !this.modal || !event.composedPath().includes(this.modal),\n onDeactivate: () => (this.isVisible = false),\n setReturnFocus: previousActiveElement =>\n previousActiveElement instanceof HTMLElement\n ? (firstTabbable(previousActiveElement) as HTMLElement)\n : previousActiveElement\n });\n }\n }\n\n componentDidUpdate(): void {\n if (this.isVisible) this.trap?.activate();\n this.updateAccessibility(this.hostElement);\n }\n\n /**\n * Shows the modal.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true;\n }\n\n render() {\n return (\n <div aria-modal role=\"dialog\" aria-hidden={!this.isVisible ? 'true' : 'false'} class=\"modal-wrapper\">\n <div ref={el => (this.modal = el)} class={{ modal: true, [`modal-${this.size}`]: Boolean(this.size) }}>\n <div class=\"modal-header\">\n <cat-button\n ref={el => (this.closeButton = el)}\n icon=\"cross-outlined\"\n class=\"close-button\"\n size=\"s\"\n iconOnly\n a11yLabel=\"close\"\n onCatClick={this.onClick.bind(this)}\n ></cat-button>\n </div>\n <div class=\"modal-content\">\n <slot></slot>\n </div>\n </div>\n </div>\n );\n }\n\n private onClick() {\n this.trap?.deactivate();\n }\n\n private updateAccessibility(element: HTMLElement) {\n if (element.parentElement) {\n Array.from(element.parentElement.children).forEach(elementSibling => {\n if (elementSibling !== element) {\n this.isVisible\n ? elementSibling.setAttribute('aria-hidden', 'true')\n : elementSibling.removeAttribute('aria-hidden');\n }\n });\n\n if (element.parentElement !== document.body) {\n this.updateAccessibility(element.parentElement);\n }\n }\n }\n}\n"],"version":3}