@haiilo/catalyst 1.3.0 → 2.0.0

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 (167) hide show
  1. package/dist/catalyst/catalyst.css +1 -1
  2. package/dist/catalyst/catalyst.esm.js +1 -1
  3. package/dist/catalyst/catalyst.esm.js.map +1 -1
  4. package/dist/catalyst/index.cdn.js +7 -3
  5. package/dist/catalyst/index.esm.js +9 -1
  6. package/dist/catalyst/index.esm.js.map +1 -1
  7. package/dist/catalyst/p-167f01e8.entry.js +2 -0
  8. package/dist/catalyst/p-167f01e8.entry.js.map +1 -0
  9. package/dist/catalyst/p-53a1db22.js +3 -0
  10. package/dist/catalyst/p-53a1db22.js.map +1 -0
  11. package/dist/catalyst/p-5865f232.js +2 -0
  12. package/dist/catalyst/p-5865f232.js.map +1 -0
  13. package/dist/catalyst/p-5bfc70e3.entry.js +2 -0
  14. package/dist/catalyst/{p-270fd91d.entry.js.map → p-5bfc70e3.entry.js.map} +1 -1
  15. package/dist/catalyst/scss/_variables.scss +1 -1
  16. package/dist/catalyst/scss/core/_form.scss +8 -0
  17. package/dist/catalyst/scss/core/_nav.scss +3 -3
  18. package/dist/catalyst/scss/core/_notification.scss +48 -0
  19. package/dist/catalyst/scss/index.scss +2 -1
  20. package/dist/catalyst/scss/utils/_typography.scss +4 -0
  21. package/dist/cjs/cat-alert_22.cjs.entry.js +358 -301
  22. package/dist/cjs/cat-alert_22.cjs.entry.js.map +1 -1
  23. package/dist/cjs/cat-icon-registry-2a54df3d.js +417 -0
  24. package/dist/cjs/cat-icon-registry-2a54df3d.js.map +1 -0
  25. package/dist/cjs/cat-modal.cjs.entry.js +2 -2
  26. package/dist/cjs/cat-modal.cjs.entry.js.map +1 -1
  27. package/dist/cjs/catalyst.cjs.js +2 -2
  28. package/dist/cjs/{index-b2134f1b.js → index-e540e911.js} +1 -4
  29. package/dist/cjs/index-e540e911.js.map +1 -0
  30. package/dist/cjs/index.cjs.js +528 -4
  31. package/dist/cjs/index.cjs.js.map +1 -1
  32. package/dist/cjs/loader.cjs.js +2 -2
  33. package/dist/collection/collection-manifest.json +2 -2
  34. package/dist/collection/components/cat-button/cat-button.css +21 -63
  35. package/dist/collection/components/cat-button/cat-button.js +21 -4
  36. package/dist/collection/components/cat-button/cat-button.js.map +1 -1
  37. package/dist/collection/components/cat-card/cat-card.css +5 -4
  38. package/dist/collection/components/cat-checkbox/cat-checkbox.css +1 -4
  39. package/dist/collection/components/cat-checkbox/cat-checkbox.js +1 -1
  40. package/dist/collection/components/cat-checkbox/cat-checkbox.js.map +1 -1
  41. package/dist/collection/components/{cat-menu/cat-menu.css → cat-dropdown/cat-dropdown.css} +23 -1
  42. package/dist/collection/components/{cat-menu/cat-menu.js → cat-dropdown/cat-dropdown.js} +122 -85
  43. package/dist/collection/components/cat-dropdown/cat-dropdown.js.map +1 -0
  44. package/dist/collection/components/cat-i18n/cat-i18n-registry.js +13 -38
  45. package/dist/collection/components/cat-i18n/cat-i18n-registry.js.map +1 -1
  46. package/dist/collection/components/cat-icon/cat-icon-registry.js +1 -0
  47. package/dist/collection/components/cat-icon/cat-icon-registry.js.map +1 -1
  48. package/dist/collection/components/cat-input/cat-input.css +1 -4
  49. package/dist/collection/components/cat-input/cat-input.js +4 -5
  50. package/dist/collection/components/cat-input/cat-input.js.map +1 -1
  51. package/dist/collection/components/cat-notification/cat-notification.js +61 -89
  52. package/dist/collection/components/cat-notification/cat-notification.js.map +1 -1
  53. package/dist/collection/components/cat-pagination/cat-pagination.css +106 -0
  54. package/dist/collection/components/cat-pagination/cat-pagination.js +302 -0
  55. package/dist/collection/components/cat-pagination/cat-pagination.js.map +1 -0
  56. package/dist/collection/components/cat-radio/cat-radio.css +1 -4
  57. package/dist/collection/components/cat-radio/cat-radio.js +1 -1
  58. package/dist/collection/components/cat-radio/cat-radio.js.map +1 -1
  59. package/dist/collection/components/cat-radio-group/cat-radio-group.js +3 -11
  60. package/dist/collection/components/cat-radio-group/cat-radio-group.js.map +1 -1
  61. package/dist/collection/components/cat-select/cat-select.css +1 -4
  62. package/dist/collection/components/cat-select/cat-select.js +8 -9
  63. package/dist/collection/components/cat-select/cat-select.js.map +1 -1
  64. package/dist/collection/components/cat-select-demo/cat-select-demo.js +4 -1
  65. package/dist/collection/components/cat-select-demo/cat-select-demo.js.map +1 -1
  66. package/dist/collection/components/cat-tabs/cat-tabs.css +2 -2
  67. package/dist/collection/components/cat-tabs/cat-tabs.js +2 -2
  68. package/dist/collection/components/cat-tabs/cat-tabs.js.map +1 -1
  69. package/dist/collection/components/cat-textarea/cat-textarea.css +1 -4
  70. package/dist/collection/components/cat-textarea/cat-textarea.js +1 -1
  71. package/dist/collection/components/cat-textarea/cat-textarea.js.map +1 -1
  72. package/dist/collection/components/cat-toggle/cat-toggle.css +1 -4
  73. package/dist/collection/components/cat-toggle/cat-toggle.js +1 -1
  74. package/dist/collection/components/cat-toggle/cat-toggle.js.map +1 -1
  75. package/dist/collection/index.cdn.js +7 -3
  76. package/dist/collection/index.js +3 -3
  77. package/dist/collection/index.js.map +1 -1
  78. package/dist/collection/scss/_variables.scss +1 -1
  79. package/dist/collection/scss/core/_form.scss +8 -0
  80. package/dist/collection/scss/core/_nav.scss +3 -3
  81. package/dist/collection/scss/core/_notification.scss +48 -0
  82. package/dist/collection/scss/index.scss +2 -1
  83. package/dist/collection/scss/utils/_typography.scss +4 -0
  84. package/dist/components/cat-button2.js +6 -5
  85. package/dist/components/cat-button2.js.map +1 -1
  86. package/dist/components/cat-card.js +1 -1
  87. package/dist/components/cat-card.js.map +1 -1
  88. package/dist/components/cat-checkbox2.js +2 -2
  89. package/dist/components/cat-checkbox2.js.map +1 -1
  90. package/dist/components/{cat-menu.d.ts → cat-dropdown.d.ts} +4 -4
  91. package/dist/components/cat-dropdown.js +8 -0
  92. package/dist/components/cat-dropdown.js.map +1 -0
  93. package/dist/components/cat-dropdown2.js +195 -0
  94. package/dist/components/cat-dropdown2.js.map +1 -0
  95. package/dist/components/cat-i18n-registry.js +14 -39
  96. package/dist/components/cat-i18n-registry.js.map +1 -1
  97. package/dist/components/cat-icon2.js +2 -1
  98. package/dist/components/cat-icon2.js.map +1 -1
  99. package/dist/components/cat-input.js +5 -6
  100. package/dist/components/cat-input.js.map +1 -1
  101. package/dist/components/{cat-toast-demo.d.ts → cat-pagination.d.ts} +4 -4
  102. package/dist/components/cat-pagination.js +150 -0
  103. package/dist/components/cat-pagination.js.map +1 -0
  104. package/dist/components/cat-radio-group.js +3 -11
  105. package/dist/components/cat-radio-group.js.map +1 -1
  106. package/dist/components/cat-radio.js +2 -2
  107. package/dist/components/cat-radio.js.map +1 -1
  108. package/dist/components/cat-select-demo.js +13 -7
  109. package/dist/components/cat-select-demo.js.map +1 -1
  110. package/dist/components/cat-select2.js +7 -8
  111. package/dist/components/cat-select2.js.map +1 -1
  112. package/dist/components/cat-tabs.js +3 -3
  113. package/dist/components/cat-tabs.js.map +1 -1
  114. package/dist/components/cat-textarea.js +2 -2
  115. package/dist/components/cat-textarea.js.map +1 -1
  116. package/dist/components/cat-toggle.js +2 -2
  117. package/dist/components/cat-toggle.js.map +1 -1
  118. package/dist/components/index.d.ts +2 -2
  119. package/dist/components/index.js +531 -4
  120. package/dist/components/index.js.map +1 -1
  121. package/dist/esm/cat-alert_22.entry.js +355 -298
  122. package/dist/esm/cat-alert_22.entry.js.map +1 -1
  123. package/dist/esm/cat-icon-registry-d537b18b.js +409 -0
  124. package/dist/esm/cat-icon-registry-d537b18b.js.map +1 -0
  125. package/dist/esm/cat-modal.entry.js +2 -2
  126. package/dist/esm/cat-modal.entry.js.map +1 -1
  127. package/dist/esm/catalyst.js +2 -2
  128. package/dist/esm/{index-033048ed.js → index-c2a28ebb.js} +2 -4
  129. package/dist/esm/index-c2a28ebb.js.map +1 -0
  130. package/dist/esm/index.js +527 -1
  131. package/dist/esm/index.js.map +1 -1
  132. package/dist/esm/loader.js +2 -2
  133. package/dist/types/components/cat-button/cat-button.d.ts +4 -0
  134. package/dist/types/components/{cat-menu/cat-menu.d.ts → cat-dropdown/cat-dropdown.d.ts} +22 -11
  135. package/dist/types/components/cat-i18n/cat-i18n-registry.d.ts +4 -6
  136. package/dist/types/components/cat-icon/cat-icon-registry.d.ts +1 -0
  137. package/dist/types/components/cat-input/cat-input.d.ts +0 -1
  138. package/dist/types/components/cat-notification/cat-notification.d.ts +21 -48
  139. package/dist/types/components/cat-pagination/cat-pagination.d.ts +56 -0
  140. package/dist/types/components/cat-select/cat-select.d.ts +0 -1
  141. package/dist/types/components.d.ts +149 -53
  142. package/dist/types/index.d.ts +4 -4
  143. package/package.json +3 -3
  144. package/dist/catalyst/p-10b0d7a2.js +0 -10
  145. package/dist/catalyst/p-10b0d7a2.js.map +0 -1
  146. package/dist/catalyst/p-270fd91d.entry.js +0 -2
  147. package/dist/catalyst/p-3ad731e4.entry.js +0 -2
  148. package/dist/catalyst/p-3ad731e4.entry.js.map +0 -1
  149. package/dist/catalyst/p-692e49d6.js +0 -3
  150. package/dist/catalyst/p-692e49d6.js.map +0 -1
  151. package/dist/catalyst/scss/core/_toast.scss +0 -87
  152. package/dist/cjs/cat-notification-bcb9fb86.js +0 -990
  153. package/dist/cjs/cat-notification-bcb9fb86.js.map +0 -1
  154. package/dist/cjs/index-b2134f1b.js.map +0 -1
  155. package/dist/collection/components/cat-menu/cat-menu.js.map +0 -1
  156. package/dist/collection/components/cat-toast-demo/cat-toast-demo.css +0 -3
  157. package/dist/collection/components/cat-toast-demo/cat-toast-demo.js +0 -62
  158. package/dist/collection/components/cat-toast-demo/cat-toast-demo.js.map +0 -1
  159. package/dist/collection/scss/core/_toast.scss +0 -87
  160. package/dist/components/cat-menu.js +0 -174
  161. package/dist/components/cat-menu.js.map +0 -1
  162. package/dist/components/cat-toast-demo.js +0 -647
  163. package/dist/components/cat-toast-demo.js.map +0 -1
  164. package/dist/esm/cat-notification-8bcf6fa2.js +0 -985
  165. package/dist/esm/cat-notification-8bcf6fa2.js.map +0 -1
  166. package/dist/esm/index-033048ed.js.map +0 -1
  167. package/dist/types/components/cat-toast-demo/cat-toast-demo.d.ts +0 -9
@@ -1,87 +0,0 @@
1
- @use '../variables' as *;
2
- @use '../mixins' as *;
3
-
4
- $-background-color: cat-token('color.base.white');
5
- $-text-color: cat-token('color.base.black');
6
- $-title-border: cat-token('color.base.neutral.300');
7
- $-shadow: cat-token('color.ui.border.dark');
8
- $-error-color: cat-token('color.theme.danger.text');
9
- $-info-color: cat-token('color.base.orange.700');
10
- $-success-color: cat-token('color.theme.success.text');
11
- $-secondary-color: cat-token('color.base.black');
12
- $-primary-color: cat-token('color.base.brand.400');
13
-
14
- .cat-toastify {
15
- background: $-background-color;
16
- color: $-text-color;
17
- padding: 0;
18
- border-radius: 0.5rem;
19
- @include cat-elevation(1);
20
-
21
- .toast-close {
22
- float: right;
23
- font-size: 20px;
24
- margin-top: 0.5rem;
25
- position: absolute;
26
- top: 0;
27
- right: 0;
28
- z-index: 10;
29
- }
30
-
31
- .cat-toastify-wrapper {
32
- display: block;
33
- position: relative;
34
-
35
- .cat-toastify-icon-wrapper {
36
- position: absolute;
37
- top: 1.1rem;
38
- left: 1.125rem;
39
-
40
- &.error {
41
- color: $-error-color;
42
- }
43
-
44
- &.success {
45
- color: $-success-color;
46
- }
47
-
48
- &.primary {
49
- color: $-primary-color;
50
- }
51
-
52
- &.secondary {
53
- color: $-secondary-color;
54
- }
55
-
56
- &.info {
57
- color: $-info-color;
58
- }
59
- }
60
-
61
- .cat-toastify-title-wrapper {
62
- width: 100%;
63
- padding: 1.2rem 1.2rem 1.2rem 3rem;
64
-
65
- &.has-message {
66
- margin-bottom: -2.25rem;
67
- }
68
-
69
- .cat-toastify-title {
70
- width: 100%;
71
- padding-right: 1.5rem;
72
- overflow: hidden;
73
- text-overflow: ellipsis;
74
- white-space: nowrap;
75
- font-size: 15px;
76
- line-height: 20px;
77
- color: $-text-color;
78
- }
79
- }
80
-
81
- .cat-toastify-message {
82
- width: 100%;
83
- padding: 1.5rem 1.5rem 1.5rem 3rem;
84
- color: $-text-color;
85
- }
86
- }
87
- }
@@ -1,174 +0,0 @@
1
- import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
2
- import { a as autoUpdate, c as computePosition, o as offset, f as flip } from './floating-ui.dom.esm.js';
3
- import { c as createFocusTrap } from './focus-trap.esm.js';
4
- import { l as loglevel } from './loglevel.js';
5
- import { t as tabbable, f as firstTabbable } from './first-tabbable.js';
6
-
7
- const catMenuCss = ":host{display:contents}:host([hidden]){display:none}::slotted(nav){padding-top:0.5rem;padding-bottom:0.5rem;min-width:8rem;max-width:16rem}.content{position:absolute;background:white;display:none;overflow:auto;-webkit-overflow-scrolling:touch;min-height:2rem;max-height:calc(100vh - 48px);box-shadow:0 1px 4px 0 rgba(16, 29, 48, 0.2);border-radius:var(--cat-border-radius-m, 0.25rem);z-index:100}";
8
-
9
- let nextUniqueId = 0;
10
- const CatMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
11
- constructor() {
12
- super();
13
- this.__registerHost();
14
- this.__attachShadow();
15
- this.catOpen = createEvent(this, "catOpen", 7);
16
- this.catClose = createEvent(this, "catClose", 7);
17
- this.id = nextUniqueId++;
18
- /**
19
- * The placement of the menu.
20
- */
21
- this.placement = 'bottom-start';
22
- /**
23
- * Do not close the menu on outside clicks.
24
- */
25
- this.noAutoClose = false;
26
- }
27
- clickHandler(event) {
28
- if (!this.trigger) {
29
- this.initTrigger();
30
- this.show();
31
- }
32
- // hide menu on button click
33
- if (!this.noAutoClose && this.content && event.composedPath().includes(this.content)) {
34
- this.close();
35
- }
36
- }
37
- /**
38
- * Closes the menu.
39
- */
40
- async close() {
41
- var _a;
42
- (_a = this.trap) === null || _a === void 0 ? void 0 : _a.deactivate();
43
- this.hide();
44
- }
45
- componentDidLoad() {
46
- this.initTrigger();
47
- this.keyListener = event => {
48
- if (this.content && ['ArrowDown', 'ArrowUp'].includes(event.key)) {
49
- const targetElements = tabbable(this.content, { includeContainer: false, getShadowRoot: true });
50
- const activeElement = firstTabbable(document.activeElement);
51
- const activeIdx = activeElement ? targetElements.indexOf(activeElement) : -1;
52
- const activeOff = event.key === 'ArrowDown' ? 1 : -1;
53
- const targetIdx = activeIdx < 0 ? 0 : (activeIdx + activeOff + targetElements.length) % targetElements.length;
54
- targetElements[targetIdx].focus();
55
- event.preventDefault();
56
- }
57
- };
58
- document.addEventListener('keydown', this.keyListener);
59
- }
60
- disconnectedCallback() {
61
- if (this.keyListener) {
62
- document.removeEventListener('keydown', this.keyListener);
63
- }
64
- }
65
- render() {
66
- return (h(Host, null, h("slot", { name: "trigger", ref: el => (this.triggerSlot = el) }), h("div", { class: "content", ref: el => (this.content = el) }, h("slot", { name: "content" }))));
67
- }
68
- get contentId() {
69
- return `cat-menu-${this.id}`;
70
- }
71
- initTrigger() {
72
- var _a, _b, _c, _d, _e;
73
- this.trigger = this.findTrigger();
74
- (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-haspopup', 'true');
75
- (_b = this.trigger) === null || _b === void 0 ? void 0 : _b.setAttribute('aria-expanded', 'false');
76
- (_c = this.trigger) === null || _c === void 0 ? void 0 : _c.setAttribute('aria-controls', this.contentId);
77
- (_d = this.content) === null || _d === void 0 ? void 0 : _d.setAttribute('id', this.contentId);
78
- if (this.trigger && this.content) {
79
- (_e = this.trigger) === null || _e === void 0 ? void 0 : _e.addEventListener('click', () => {
80
- var _a;
81
- ((_a = this.trap) === null || _a === void 0 ? void 0 : _a.active) ? this.close() : this.show();
82
- });
83
- autoUpdate(this.trigger, this.content, () => this.update());
84
- }
85
- }
86
- show() {
87
- var _a;
88
- if (this.content) {
89
- this.content.style.display = 'block';
90
- (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'true');
91
- this.catOpen.emit();
92
- this.trap = this.trap
93
- ? this.trap.updateContainerElements(this.content)
94
- : createFocusTrap(this.content, {
95
- tabbableOptions: {
96
- getShadowRoot: true
97
- },
98
- allowOutsideClick: true,
99
- clickOutsideDeactivates: event => !this.noAutoClose &&
100
- (!this.content || !event.composedPath().includes(this.content)) &&
101
- (!this.trigger || !event.composedPath().includes(this.trigger)),
102
- onPostDeactivate: () => this.close()
103
- });
104
- this.trap.activate();
105
- }
106
- }
107
- hide() {
108
- var _a;
109
- if (this.content) {
110
- this.content.style.display = '';
111
- (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'false');
112
- this.catClose.emit();
113
- }
114
- }
115
- update() {
116
- if (this.trigger && this.content) {
117
- computePosition(this.trigger, this.content, {
118
- placement: this.placement,
119
- middleware: [offset(CatMenu$1.OFFSET), flip()]
120
- }).then(({ x, y }) => {
121
- if (this.content) {
122
- Object.assign(this.content.style, {
123
- left: `${x}px`,
124
- top: `${y}px`
125
- });
126
- }
127
- });
128
- }
129
- }
130
- findTrigger() {
131
- var _a, _b;
132
- let trigger;
133
- const elems = ((_a = this.triggerSlot) === null || _a === void 0 ? void 0 : _a.assignedElements()) || [];
134
- while (!trigger && elems.length) {
135
- const elem = elems.shift();
136
- trigger = (elem === null || elem === void 0 ? void 0 : elem.hasAttribute('data-trigger'))
137
- ? elem
138
- : (_b = elem === null || elem === void 0 ? void 0 : elem.querySelector('[data-trigger]')) !== null && _b !== void 0 ? _b : undefined;
139
- }
140
- if (!trigger) {
141
- trigger = firstTabbable(this.triggerSlot);
142
- }
143
- if (!trigger) {
144
- loglevel.error('Cannot find tabbable element. Use [data-trigger] to set the trigger.');
145
- }
146
- return trigger;
147
- }
148
- static get style() { return catMenuCss; }
149
- }, [1, "cat-menu", {
150
- "placement": [1],
151
- "noAutoClose": [4, "no-auto-close"],
152
- "close": [64]
153
- }, [[0, "catClick", "clickHandler"]]]);
154
- CatMenu$1.OFFSET = 4;
155
- function defineCustomElement$1() {
156
- if (typeof customElements === "undefined") {
157
- return;
158
- }
159
- const components = ["cat-menu"];
160
- components.forEach(tagName => { switch (tagName) {
161
- case "cat-menu":
162
- if (!customElements.get(tagName)) {
163
- customElements.define(tagName, CatMenu$1);
164
- }
165
- break;
166
- } });
167
- }
168
-
169
- const CatMenu = CatMenu$1;
170
- const defineCustomElement = defineCustomElement$1;
171
-
172
- export { CatMenu, defineCustomElement };
173
-
174
- //# sourceMappingURL=cat-menu.js.map
@@ -1 +0,0 @@
1
- {"file":"cat-menu.js","mappings":"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","names":["CatMenu","focusTrap.createFocusTrap","log"],"sources":["./src/components/cat-menu/cat-menu.scss?tag=cat-menu&encapsulation=shadow","./src/components/cat-menu/cat-menu.tsx"],"sourcesContent":["@import 'variables';\n@import 'mixins';\n\n$-min-width: 8rem;\n$-max-width: 16rem;\n$-min-height: 2rem;\n$-max-height: calc(100vh - 48px);\n\n:host {\n display: contents;\n}\n\n:host([hidden]) {\n display: none;\n}\n\n::slotted(nav) {\n padding-top: $cat-body-margin-bottom * 0.5;\n padding-bottom: $cat-body-margin-bottom * 0.5;\n min-width: $-min-width;\n max-width: $-max-width;\n}\n\n.content {\n position: absolute;\n background: cat-token('color.ui.background.body');\n display: none;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n min-height: $-min-height;\n max-height: $-max-height;\n @include cat-elevation(1);\n border-radius: cat-border-radius('m');\n z-index: $cat-menu-z-index;\n}\n","import { autoUpdate, computePosition, flip, offset, Placement } from '@floating-ui/dom';\nimport { Component, Event, EventEmitter, h, Host, Listen, Method, Prop } from '@stencil/core';\nimport * as focusTrap from 'focus-trap';\nimport log from 'loglevel';\nimport { FocusableElement, tabbable } from 'tabbable';\nimport firstTabbable from '../../utils/first-tabbable';\n\nlet nextUniqueId = 0;\n\n@Component({\n tag: 'cat-menu',\n styleUrl: 'cat-menu.scss',\n shadow: true\n})\nexport class CatMenu {\n private static readonly OFFSET = 4;\n private readonly id = nextUniqueId++;\n private triggerSlot?: HTMLSlotElement;\n private trigger?: FocusableElement;\n private content?: HTMLElement;\n private trap?: focusTrap.FocusTrap;\n private keyListener?: (event: KeyboardEvent) => void;\n\n /**\n * The placement of the menu.\n */\n @Prop() placement: Placement = 'bottom-start';\n\n /**\n * Do not close the menu on outside clicks.\n */\n @Prop() noAutoClose = false;\n\n /**\n * Emitted when the menu is opened.\n */\n @Event() catOpen!: EventEmitter<FocusEvent>;\n\n /**\n * Emitted when the menu is closed.\n */\n @Event() catClose!: EventEmitter<FocusEvent>;\n\n @Listen('catClick')\n clickHandler(event: CustomEvent<MouseEvent>) {\n if (!this.trigger) {\n this.initTrigger();\n this.show();\n }\n\n // hide menu on button click\n if (!this.noAutoClose && this.content && event.composedPath().includes(this.content)) {\n this.close();\n }\n }\n\n /**\n * Closes the menu.\n */\n @Method()\n async close(): Promise<void> {\n this.trap?.deactivate();\n this.hide();\n }\n\n componentDidLoad(): void {\n this.initTrigger();\n this.keyListener = event => {\n if (this.content && ['ArrowDown', 'ArrowUp'].includes(event.key)) {\n const targetElements = tabbable(this.content, { includeContainer: false, getShadowRoot: true });\n const activeElement = firstTabbable(document.activeElement);\n const activeIdx = activeElement ? targetElements.indexOf(activeElement) : -1;\n const activeOff = event.key === 'ArrowDown' ? 1 : -1;\n const targetIdx = activeIdx < 0 ? 0 : (activeIdx + activeOff + targetElements.length) % targetElements.length;\n targetElements[targetIdx].focus();\n event.preventDefault();\n }\n };\n document.addEventListener('keydown', this.keyListener);\n }\n\n disconnectedCallback(): void {\n if (this.keyListener) {\n document.removeEventListener('keydown', this.keyListener);\n }\n }\n\n render() {\n return (\n <Host>\n <slot name=\"trigger\" ref={el => (this.triggerSlot = el as HTMLSlotElement)}></slot>\n <div class=\"content\" ref={el => (this.content = el)}>\n <slot name=\"content\"></slot>\n </div>\n </Host>\n );\n }\n\n private get contentId() {\n return `cat-menu-${this.id}`;\n }\n\n private initTrigger() {\n this.trigger = this.findTrigger();\n this.trigger?.setAttribute('aria-haspopup', 'true');\n this.trigger?.setAttribute('aria-expanded', 'false');\n this.trigger?.setAttribute('aria-controls', this.contentId);\n this.content?.setAttribute('id', this.contentId);\n if (this.trigger && this.content) {\n this.trigger?.addEventListener('click', () => {\n this.trap?.active ? this.close() : this.show();\n });\n autoUpdate(this.trigger, this.content, () => this.update());\n }\n }\n\n private show() {\n if (this.content) {\n this.content.style.display = 'block';\n this.trigger?.setAttribute('aria-expanded', 'true');\n this.catOpen.emit();\n this.trap = this.trap\n ? this.trap.updateContainerElements(this.content)\n : focusTrap.createFocusTrap(this.content, {\n tabbableOptions: {\n getShadowRoot: true\n },\n allowOutsideClick: true,\n clickOutsideDeactivates: event =>\n !this.noAutoClose &&\n (!this.content || !event.composedPath().includes(this.content)) &&\n (!this.trigger || !event.composedPath().includes(this.trigger)),\n onPostDeactivate: () => this.close()\n });\n this.trap.activate();\n }\n }\n\n private hide() {\n if (this.content) {\n this.content.style.display = '';\n this.trigger?.setAttribute('aria-expanded', 'false');\n this.catClose.emit();\n }\n }\n\n private update() {\n if (this.trigger && this.content) {\n computePosition(this.trigger, this.content, {\n placement: this.placement,\n middleware: [offset(CatMenu.OFFSET), flip()]\n }).then(({ x, y }) => {\n if (this.content) {\n Object.assign(this.content.style, {\n left: `${x}px`,\n top: `${y}px`\n });\n }\n });\n }\n }\n\n private findTrigger(): FocusableElement | undefined {\n let trigger: FocusableElement | undefined;\n const elems = this.triggerSlot?.assignedElements() || [];\n while (!trigger && elems.length) {\n const elem = elems.shift();\n trigger = elem?.hasAttribute('data-trigger')\n ? (elem as HTMLElement)\n : elem?.querySelector('[data-trigger]') ?? undefined;\n }\n if (!trigger) {\n trigger = firstTabbable(this.triggerSlot);\n }\n if (!trigger) {\n log.error('Cannot find tabbable element. Use [data-trigger] to set the trigger.');\n }\n return trigger;\n }\n}\n"],"version":3}