@haiilo/catalyst 0.2.3 → 0.3.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 (138) hide show
  1. package/dist/catalyst/catalyst.css +1 -1959
  2. package/dist/catalyst/catalyst.esm.js +1 -131
  3. package/dist/catalyst/catalyst.esm.js.map +1 -1
  4. package/dist/catalyst/index.esm.js +1 -2
  5. package/dist/catalyst/index.esm.js.map +1 -1
  6. package/dist/catalyst/p-31b500c7.entry.js +10 -0
  7. package/dist/catalyst/p-31b500c7.entry.js.map +1 -0
  8. package/dist/catalyst/p-ed826597.js +2 -0
  9. package/dist/catalyst/p-ed826597.js.map +1 -0
  10. package/dist/catalyst/p-ef0a8ae9.js +2 -0
  11. package/dist/catalyst/p-ef0a8ae9.js.map +1 -0
  12. package/dist/catalyst/p-f151cb13.js +2 -0
  13. package/dist/catalyst/p-f151cb13.js.map +1 -0
  14. package/dist/cjs/app-globals-7f2b1f8e.js +173 -0
  15. package/dist/cjs/app-globals-7f2b1f8e.js.map +1 -0
  16. package/dist/cjs/cat-alert_8.cjs.entry.js +4450 -0
  17. package/dist/cjs/cat-alert_8.cjs.entry.js.map +1 -0
  18. package/dist/cjs/cat-icon-registry-850c538c.js +47 -0
  19. package/dist/cjs/cat-icon-registry-850c538c.js.map +1 -0
  20. package/dist/cjs/catalyst.cjs.js +24 -0
  21. package/dist/cjs/catalyst.cjs.js.map +1 -0
  22. package/dist/cjs/index-c0881ae0.js +1348 -0
  23. package/dist/cjs/index-c0881ae0.js.map +1 -0
  24. package/dist/cjs/index.cjs.js +11 -0
  25. package/dist/cjs/index.cjs.js.map +1 -0
  26. package/dist/cjs/loader.cjs.js +26 -0
  27. package/dist/cjs/loader.cjs.js.map +1 -0
  28. package/dist/collection/collection-manifest.json +20 -0
  29. package/dist/collection/components/cat-alert/cat-alert.css +57 -0
  30. package/dist/collection/components/cat-alert/cat-alert.js +50 -0
  31. package/dist/collection/components/cat-alert/cat-alert.js.map +1 -0
  32. package/dist/collection/components/cat-badge/cat-badge.css +154 -0
  33. package/dist/collection/components/cat-badge/cat-badge.js +142 -0
  34. package/dist/collection/components/cat-badge/cat-badge.js.map +1 -0
  35. package/dist/collection/components/cat-button/cat-button.css +323 -0
  36. package/dist/collection/components/cat-button/cat-button.js +591 -0
  37. package/dist/collection/components/cat-button/cat-button.js.map +1 -0
  38. package/dist/collection/components/cat-icon/cat-icon-registry.js +42 -0
  39. package/dist/collection/components/cat-icon/cat-icon-registry.js.map +1 -0
  40. package/dist/collection/components/cat-icon/cat-icon.css +50 -0
  41. package/dist/collection/components/cat-icon/cat-icon.js +90 -0
  42. package/dist/collection/components/cat-icon/cat-icon.js.map +1 -0
  43. package/dist/collection/components/cat-menu/cat-menu.css +33 -0
  44. package/dist/collection/components/cat-menu/cat-menu.js +186 -0
  45. package/dist/collection/components/cat-menu/cat-menu.js.map +1 -0
  46. package/dist/collection/components/cat-scrollable/cat-scrollable.css +69 -0
  47. package/dist/collection/components/cat-scrollable/cat-scrollable.js +309 -0
  48. package/dist/collection/components/cat-scrollable/cat-scrollable.js.map +1 -0
  49. package/dist/collection/components/cat-skeleton/cat-skeleton.css +177 -0
  50. package/dist/collection/components/cat-skeleton/cat-skeleton.js +131 -0
  51. package/dist/collection/components/cat-skeleton/cat-skeleton.js.map +1 -0
  52. package/dist/collection/components/cat-spinner/cat-spinner.css +63 -0
  53. package/dist/collection/components/cat-spinner/cat-spinner.js +65 -0
  54. package/dist/collection/components/cat-spinner/cat-spinner.js.map +1 -0
  55. package/dist/collection/index.cdn.js +21 -0
  56. package/dist/collection/index.js +2 -0
  57. package/dist/collection/index.js.map +1 -0
  58. package/dist/collection/init.js +9 -0
  59. package/dist/collection/init.js.map +1 -0
  60. package/dist/collection/utils/breakpoints.js +12 -0
  61. package/dist/collection/utils/breakpoints.js.map +1 -0
  62. package/dist/collection/utils/media-matcher.js +55 -0
  63. package/dist/collection/utils/media-matcher.js.map +1 -0
  64. package/dist/collection/utils/platform.js +50 -0
  65. package/dist/collection/utils/platform.js.map +1 -0
  66. package/dist/collection/utils/utils.js +4 -0
  67. package/dist/collection/utils/utils.js.map +1 -0
  68. package/dist/{catalyst/cat-alert.entry.js → components/cat-alert.js} +28 -8
  69. package/dist/components/cat-alert.js.map +1 -0
  70. package/dist/{catalyst/cat-badge.entry.js → components/cat-badge.js} +32 -8
  71. package/dist/components/cat-badge.js.map +1 -0
  72. package/dist/{catalyst/cat-button.entry.js → components/cat-button.js} +60 -41
  73. package/dist/components/cat-button.js.map +1 -0
  74. package/dist/components/cat-icon-registry.js +45 -0
  75. package/dist/components/cat-icon-registry.js.map +1 -0
  76. package/dist/components/cat-icon.js +8 -0
  77. package/dist/components/cat-icon.js.map +1 -0
  78. package/dist/{catalyst/cat-icon.entry.js → components/cat-icon2.js} +28 -9
  79. package/dist/components/cat-icon2.js.map +1 -0
  80. package/dist/{catalyst/cat-menu.entry.js → components/cat-menu.js} +34 -642
  81. package/dist/components/cat-menu.js.map +1 -0
  82. package/dist/components/cat-scrollable.js +1363 -0
  83. package/dist/components/cat-scrollable.js.map +1 -0
  84. package/dist/{catalyst/cat-skeleton.entry.js → components/cat-skeleton.js} +31 -8
  85. package/dist/components/cat-skeleton.js.map +1 -0
  86. package/dist/components/cat-spinner.js +8 -0
  87. package/dist/components/cat-spinner.js.map +1 -0
  88. package/dist/{catalyst/cat-spinner.entry.js → components/cat-spinner2.js} +26 -8
  89. package/dist/components/cat-spinner2.js.map +1 -0
  90. package/dist/components/index.js +173 -0
  91. package/dist/components/index.js.map +1 -0
  92. package/dist/esm/app-globals-8af9b2cf.js +171 -0
  93. package/dist/esm/app-globals-8af9b2cf.js.map +1 -0
  94. package/dist/esm/cat-alert_8.entry.js +4439 -0
  95. package/dist/esm/cat-alert_8.entry.js.map +1 -0
  96. package/dist/{catalyst → esm}/cat-icon-registry-59da2e37.js +0 -0
  97. package/dist/{catalyst → esm}/cat-icon-registry-59da2e37.js.map +0 -0
  98. package/dist/esm/catalyst.js +22 -0
  99. package/dist/esm/catalyst.js.map +1 -0
  100. package/dist/esm/index-0ff35bca.js +1320 -0
  101. package/dist/esm/index-0ff35bca.js.map +1 -0
  102. package/dist/esm/index.js +3 -0
  103. package/dist/esm/index.js.map +1 -0
  104. package/dist/esm/loader.js +22 -0
  105. package/dist/esm/loader.js.map +1 -0
  106. package/dist/esm/polyfills/core-js.js +11 -0
  107. package/dist/esm/polyfills/css-shim.js +1 -0
  108. package/dist/esm/polyfills/dom.js +79 -0
  109. package/dist/esm/polyfills/es5-html-element.js +1 -0
  110. package/dist/esm/polyfills/index.js +34 -0
  111. package/dist/esm/polyfills/system.js +6 -0
  112. package/dist/index.cjs.js +1 -0
  113. package/dist/index.js +1 -0
  114. package/dist/types/index.d.ts +1 -0
  115. package/package.json +10 -17
  116. package/dist/catalyst/app-globals-54573336.js +0 -718
  117. package/dist/catalyst/app-globals-54573336.js.map +0 -1
  118. package/dist/catalyst/cat-alert.entry.js.map +0 -1
  119. package/dist/catalyst/cat-badge.entry.js.map +0 -1
  120. package/dist/catalyst/cat-button.entry.js.map +0 -1
  121. package/dist/catalyst/cat-icon.entry.js.map +0 -1
  122. package/dist/catalyst/cat-input.entry.js +0 -55
  123. package/dist/catalyst/cat-input.entry.js.map +0 -1
  124. package/dist/catalyst/cat-menu.entry.js.map +0 -1
  125. package/dist/catalyst/cat-scrollable.entry.js +0 -4523
  126. package/dist/catalyst/cat-scrollable.entry.js.map +0 -1
  127. package/dist/catalyst/cat-skeleton.entry.js.map +0 -1
  128. package/dist/catalyst/cat-spinner.entry.js.map +0 -1
  129. package/dist/catalyst/css-shim-e6dd2538.js +0 -6
  130. package/dist/catalyst/css-shim-e6dd2538.js.map +0 -1
  131. package/dist/catalyst/dom-7fc649b0.js +0 -75
  132. package/dist/catalyst/dom-7fc649b0.js.map +0 -1
  133. package/dist/catalyst/index-2df805aa.js +0 -3059
  134. package/dist/catalyst/index-2df805aa.js.map +0 -1
  135. package/dist/catalyst/shadow-css-4d56fa31.js +0 -390
  136. package/dist/catalyst/shadow-css-4d56fa31.js.map +0 -1
  137. package/dist/components/cat-input.d.ts +0 -11
  138. package/dist/types/components/cat-input/cat-input.d.ts +0 -70
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Auto-generated file. Do not edit directly.
3
+ */
4
+ /* stylelint-disable value-keyword-case */
5
+ /* stylelint-enable value-keyword-case */
6
+ :host {
7
+ display: inline-flex;
8
+ vertical-align: middle;
9
+ /* stylelint-disable property-no-vendor-prefix */
10
+ -webkit-user-select: none;
11
+ -ms-user-select: none;
12
+ user-select: none;
13
+ /* stylelint-enable property-no-vendor-prefix */
14
+ }
15
+
16
+ :host([hidden]) {
17
+ display: none;
18
+ }
19
+
20
+ span {
21
+ display: inline-flex;
22
+ }
23
+
24
+ svg {
25
+ fill: currentColor;
26
+ stroke: none;
27
+ transform-origin: center center;
28
+ width: 1em;
29
+ height: 1em;
30
+ }
31
+
32
+ .cat-icon-xs svg {
33
+ font-size: 0.75rem;
34
+ }
35
+
36
+ .cat-icon-s svg {
37
+ font-size: 1rem;
38
+ }
39
+
40
+ .cat-icon-m svg {
41
+ font-size: 1.25rem;
42
+ }
43
+
44
+ .cat-icon-l svg {
45
+ font-size: 1.5rem;
46
+ }
47
+
48
+ .cat-icon-xl svg {
49
+ font-size: 1.75rem;
50
+ }
@@ -0,0 +1,90 @@
1
+ import { Component, h, Prop } from '@stencil/core';
2
+ import { CatIconRegistry } from './cat-icon-registry';
3
+ /**
4
+ * Icons are used to provide additional meaning or in places where text label
5
+ * doesn't fit.
6
+ *
7
+ * @part icon - The native span element wrapping the SVG icon.
8
+ */
9
+ export class CatIcon {
10
+ constructor() {
11
+ this.iconRegistry = CatIconRegistry.getInstance();
12
+ /**
13
+ * The name of the icon.
14
+ */
15
+ this.icon = '';
16
+ /**
17
+ * The size of the icon.
18
+ */
19
+ this.size = 'm';
20
+ }
21
+ render() {
22
+ return (h("span", { innerHTML: this.iconRegistry.getIcon(this.icon), "aria-label": this.a11yLabel, "aria-hidden": this.a11yLabel ? null : 'true', part: "icon", class: {
23
+ [`cat-icon-${this.size}`]: this.size !== 'inline'
24
+ } }));
25
+ }
26
+ static get is() { return "cat-icon"; }
27
+ static get encapsulation() { return "shadow"; }
28
+ static get originalStyleUrls() { return {
29
+ "$": ["cat-icon.scss"]
30
+ }; }
31
+ static get styleUrls() { return {
32
+ "$": ["cat-icon.css"]
33
+ }; }
34
+ static get properties() { return {
35
+ "icon": {
36
+ "type": "string",
37
+ "mutable": false,
38
+ "complexType": {
39
+ "original": "string",
40
+ "resolved": "string",
41
+ "references": {}
42
+ },
43
+ "required": false,
44
+ "optional": false,
45
+ "docs": {
46
+ "tags": [],
47
+ "text": "The name of the icon."
48
+ },
49
+ "attribute": "icon",
50
+ "reflect": false,
51
+ "defaultValue": "''"
52
+ },
53
+ "size": {
54
+ "type": "string",
55
+ "mutable": false,
56
+ "complexType": {
57
+ "original": "'xs' | 's' | 'm' | 'l' | 'xl' | 'inline'",
58
+ "resolved": "\"inline\" | \"l\" | \"m\" | \"s\" | \"xl\" | \"xs\"",
59
+ "references": {}
60
+ },
61
+ "required": false,
62
+ "optional": false,
63
+ "docs": {
64
+ "tags": [],
65
+ "text": "The size of the icon."
66
+ },
67
+ "attribute": "size",
68
+ "reflect": false,
69
+ "defaultValue": "'m'"
70
+ },
71
+ "a11yLabel": {
72
+ "type": "string",
73
+ "mutable": false,
74
+ "complexType": {
75
+ "original": "string",
76
+ "resolved": "string | undefined",
77
+ "references": {}
78
+ },
79
+ "required": false,
80
+ "optional": true,
81
+ "docs": {
82
+ "tags": [],
83
+ "text": "Adds accessible label for the icon that is only shown for screen\nreaders. The `aria-hidden` attribute will be set if no label is present."
84
+ },
85
+ "attribute": "a11y-label",
86
+ "reflect": false
87
+ }
88
+ }; }
89
+ }
90
+ //# sourceMappingURL=cat-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cat-icon.js","sourceRoot":"","sources":["../../../src/components/cat-icon/cat-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;GAKG;AAMH,MAAM,OAAO,OAAO;EALpB;IAMmB,iBAAY,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAE9D;;OAEG;IACK,SAAI,GAAG,EAAE,CAAC;IAElB;;OAEG;IACK,SAAI,GAA6C,GAAG,CAAC;GAqB9D;EAbC,MAAM;IACJ,OAAO,CACL,YACE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,gBACnC,IAAI,CAAC,SAAS,iBACb,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAC3C,IAAI,EAAC,MAAM,EACX,KAAK,EAAE;QACL,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ;OAClD,GACK,CACT,CAAC;EACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, h, Prop } from '@stencil/core';\nimport { CatIconRegistry } from './cat-icon-registry';\n\n/**\n * Icons are used to provide additional meaning or in places where text label\n * doesn't fit.\n *\n * @part icon - The native span element wrapping the SVG icon.\n */\n@Component({\n tag: 'cat-icon',\n styleUrl: 'cat-icon.scss',\n shadow: true\n})\nexport class CatIcon {\n private readonly iconRegistry = CatIconRegistry.getInstance();\n\n /**\n * The name of the icon.\n */\n @Prop() icon = '';\n\n /**\n * The size of the icon.\n */\n @Prop() size: 'xs' | 's' | 'm' | 'l' | 'xl' | 'inline' = 'm';\n\n /**\n * Adds accessible label for the icon that is only shown for screen\n * readers. The `aria-hidden` attribute will be set if no label is present.\n */\n @Prop({ attribute: 'a11y-label' }) a11yLabel?: string;\n\n render() {\n return (\n <span\n innerHTML={this.iconRegistry.getIcon(this.icon)}\n aria-label={this.a11yLabel}\n aria-hidden={this.a11yLabel ? null : 'true'}\n part=\"icon\"\n class={{\n [`cat-icon-${this.size}`]: this.size !== 'inline'\n }}\n ></span>\n );\n }\n}\n"]}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Auto-generated file. Do not edit directly.
3
+ */
4
+ /* stylelint-disable value-keyword-case */
5
+ /* stylelint-enable value-keyword-case */
6
+ /**
7
+ * Auto-generated file. Do not edit directly.
8
+ */
9
+ /* stylelint-disable value-keyword-case */
10
+ /* stylelint-enable value-keyword-case */
11
+ :host {
12
+ display: inline-block;
13
+ }
14
+
15
+ :host([hidden]) {
16
+ display: none;
17
+ }
18
+
19
+ .content {
20
+ padding-top: 0.5rem;
21
+ padding-bottom: 0.5rem;
22
+ position: absolute;
23
+ background: white;
24
+ display: none;
25
+ overflow: auto;
26
+ -webkit-overflow-scrolling: touch;
27
+ min-width: 8rem;
28
+ max-width: 16rem;
29
+ min-height: 2rem;
30
+ max-height: calc(100vh - 48px);
31
+ box-shadow: 0 1px 4px 0 rgba(16, 29, 48, 0.2);
32
+ border-radius: 0.25rem;
33
+ }
@@ -0,0 +1,186 @@
1
+ import { autoUpdate, computePosition, flip, offset } from '@floating-ui/dom';
2
+ import { Component, Event, h, Host, Listen, Prop } from '@stencil/core';
3
+ import * as focusTrap from 'focus-trap';
4
+ import { tabbable } from 'tabbable';
5
+ let nextUniqueId = 0;
6
+ export class CatMenu {
7
+ constructor() {
8
+ this.id = nextUniqueId++;
9
+ /**
10
+ * The placement of the menu.
11
+ */
12
+ this.placement = 'bottom-start';
13
+ }
14
+ clickHandler(event) {
15
+ var _a;
16
+ // hide menu on button click
17
+ if (this.content && event.composedPath().includes(this.content)) {
18
+ (_a = this.trap) === null || _a === void 0 ? void 0 : _a.deactivate();
19
+ this.hide();
20
+ }
21
+ }
22
+ componentDidLoad() {
23
+ var _a, _b, _c, _d, _e;
24
+ this.trigger = this.firstTabbable(this.triggerSlot);
25
+ (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-haspopup', 'true');
26
+ (_b = this.trigger) === null || _b === void 0 ? void 0 : _b.setAttribute('aria-expanded', 'false');
27
+ (_c = this.trigger) === null || _c === void 0 ? void 0 : _c.setAttribute('aria-controls', this.contentId);
28
+ (_d = this.content) === null || _d === void 0 ? void 0 : _d.setAttribute('id', this.contentId);
29
+ if (this.trigger && this.content) {
30
+ (_e = this.trigger) === null || _e === void 0 ? void 0 : _e.addEventListener('click', () => this.show());
31
+ autoUpdate(this.trigger, this.content, () => this.update());
32
+ }
33
+ this.keyListener = event => {
34
+ if (this.content && ['ArrowDown', 'ArrowUp'].includes(event.key)) {
35
+ const targetElements = tabbable(this.content, { includeContainer: false, getShadowRoot: true });
36
+ const activeElement = this.firstTabbable(document.activeElement);
37
+ const activeIdx = activeElement ? targetElements.indexOf(activeElement) : -1;
38
+ const activeOff = event.key === 'ArrowDown' ? 1 : -1;
39
+ const targetIdx = activeIdx < 0 ? 0 : (activeIdx + activeOff + targetElements.length) % targetElements.length;
40
+ targetElements[targetIdx].focus();
41
+ event.preventDefault();
42
+ }
43
+ };
44
+ document.addEventListener('keydown', this.keyListener);
45
+ }
46
+ disconnectedCallback() {
47
+ if (this.keyListener) {
48
+ document.removeEventListener('keydown', this.keyListener);
49
+ }
50
+ }
51
+ render() {
52
+ return (h(Host, null,
53
+ h("slot", { name: "trigger", ref: el => (this.triggerSlot = el) }),
54
+ h("div", { class: "content", ref: el => (this.content = el) },
55
+ h("slot", { name: "content" }))));
56
+ }
57
+ get contentId() {
58
+ return `cat-menu-${this.id}`;
59
+ }
60
+ show() {
61
+ var _a;
62
+ if (this.content) {
63
+ this.content.style.display = 'block';
64
+ (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'true');
65
+ this.catOpen.emit();
66
+ this.trap = this.trap
67
+ ? this.trap.updateContainerElements(this.content)
68
+ : focusTrap.createFocusTrap(this.content, {
69
+ tabbableOptions: {
70
+ getShadowRoot: true
71
+ },
72
+ allowOutsideClick: true,
73
+ clickOutsideDeactivates: event => !this.content || !event.composedPath().includes(this.content),
74
+ onPostDeactivate: () => this.hide()
75
+ });
76
+ this.trap.activate();
77
+ }
78
+ }
79
+ hide() {
80
+ var _a;
81
+ if (this.content) {
82
+ this.content.style.display = '';
83
+ (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'false');
84
+ this.catClose.emit();
85
+ }
86
+ }
87
+ update() {
88
+ if (this.trigger && this.content) {
89
+ computePosition(this.trigger, this.content, {
90
+ placement: this.placement,
91
+ middleware: [offset(CatMenu.OFFSET), flip()]
92
+ }).then(({ x, y }) => {
93
+ if (this.content) {
94
+ Object.assign(this.content.style, {
95
+ left: `${x}px`,
96
+ top: `${y}px`
97
+ });
98
+ }
99
+ });
100
+ }
101
+ }
102
+ firstTabbable(container) {
103
+ return (container ? tabbable(container, { includeContainer: true, getShadowRoot: true }) : []).shift();
104
+ }
105
+ static get is() { return "cat-menu"; }
106
+ static get encapsulation() { return "shadow"; }
107
+ static get originalStyleUrls() { return {
108
+ "$": ["cat-menu.scss"]
109
+ }; }
110
+ static get styleUrls() { return {
111
+ "$": ["cat-menu.css"]
112
+ }; }
113
+ static get properties() { return {
114
+ "placement": {
115
+ "type": "string",
116
+ "mutable": false,
117
+ "complexType": {
118
+ "original": "Placement",
119
+ "resolved": "\"bottom\" | \"bottom-end\" | \"bottom-start\" | \"left\" | \"left-end\" | \"left-start\" | \"right\" | \"right-end\" | \"right-start\" | \"top\" | \"top-end\" | \"top-start\"",
120
+ "references": {
121
+ "Placement": {
122
+ "location": "import",
123
+ "path": "@floating-ui/dom"
124
+ }
125
+ }
126
+ },
127
+ "required": false,
128
+ "optional": false,
129
+ "docs": {
130
+ "tags": [],
131
+ "text": "The placement of the menu."
132
+ },
133
+ "attribute": "placement",
134
+ "reflect": false,
135
+ "defaultValue": "'bottom-start'"
136
+ }
137
+ }; }
138
+ static get events() { return [{
139
+ "method": "catOpen",
140
+ "name": "catOpen",
141
+ "bubbles": true,
142
+ "cancelable": true,
143
+ "composed": true,
144
+ "docs": {
145
+ "tags": [],
146
+ "text": "Emitted when the menu is opened."
147
+ },
148
+ "complexType": {
149
+ "original": "FocusEvent",
150
+ "resolved": "FocusEvent",
151
+ "references": {
152
+ "FocusEvent": {
153
+ "location": "global"
154
+ }
155
+ }
156
+ }
157
+ }, {
158
+ "method": "catClose",
159
+ "name": "catClose",
160
+ "bubbles": true,
161
+ "cancelable": true,
162
+ "composed": true,
163
+ "docs": {
164
+ "tags": [],
165
+ "text": "Emitted when the menu is closed."
166
+ },
167
+ "complexType": {
168
+ "original": "FocusEvent",
169
+ "resolved": "FocusEvent",
170
+ "references": {
171
+ "FocusEvent": {
172
+ "location": "global"
173
+ }
174
+ }
175
+ }
176
+ }]; }
177
+ static get listeners() { return [{
178
+ "name": "catClick",
179
+ "method": "clickHandler",
180
+ "target": undefined,
181
+ "capture": false,
182
+ "passive": false
183
+ }]; }
184
+ }
185
+ CatMenu.OFFSET = 4;
186
+ //# sourceMappingURL=cat-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cat-menu.js","sourceRoot":"","sources":["../../../src/components/cat-menu/cat-menu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { autoUpdate, computePosition, flip, offset, Placement } from '@floating-ui/dom';\nimport { Component, Event, EventEmitter, h, Host, Listen, Prop } from '@stencil/core';\nimport * as focusTrap from 'focus-trap';\nimport { FocusableElement, tabbable } from '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?: Element;\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 * 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 // hide menu on button click\n if (this.content && event.composedPath().includes(this.content)) {\n this.trap?.deactivate();\n this.hide();\n }\n }\n\n componentDidLoad(): void {\n this.trigger = this.firstTabbable(this.triggerSlot);\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', () => this.show());\n autoUpdate(this.trigger, this.content, () => this.update());\n }\n\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 = this.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)}></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 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 => !this.content || !event.composedPath().includes(this.content),\n onPostDeactivate: () => this.hide()\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 firstTabbable(container?: Element | null) {\n return (container ? tabbable(container, { includeContainer: true, getShadowRoot: true }) : []).shift();\n }\n}\n"]}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Auto-generated file. Do not edit directly.
3
+ */
4
+ /* stylelint-disable value-keyword-case */
5
+ /* stylelint-enable value-keyword-case */
6
+ :host {
7
+ overflow: hidden;
8
+ position: relative;
9
+ display: flex;
10
+ }
11
+
12
+ :host([hidden]) {
13
+ display: none;
14
+ }
15
+
16
+ .shadow-bottom, .shadow-right, .shadow-left, .shadow-top {
17
+ position: absolute;
18
+ transition: box-shadow 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
19
+ }
20
+
21
+ .shadow-top {
22
+ z-index: 2;
23
+ width: 100%;
24
+ top: 0;
25
+ }
26
+
27
+ .shadow-left {
28
+ z-index: 4;
29
+ height: 100%;
30
+ left: 0;
31
+ }
32
+
33
+ .shadow-right {
34
+ z-index: 4;
35
+ height: 100%;
36
+ right: 0;
37
+ }
38
+
39
+ .shadow-bottom {
40
+ z-index: 2;
41
+ width: 100%;
42
+ bottom: 0;
43
+ }
44
+
45
+ .scrollable-wrapper {
46
+ position: absolute;
47
+ top: 0;
48
+ left: 0;
49
+ right: 0;
50
+ bottom: 0;
51
+ pointer-events: none;
52
+ }
53
+ .scrollable-wrapper.cat-scrollable-top .shadow-top, .scrollable-wrapper.cat-scrollable-bottom .shadow-bottom, .scrollable-wrapper.cat-scrollable-left .shadow-left, .scrollable-wrapper.cat-scrollable-right .shadow-right {
54
+ box-shadow: 0 0 4px 1px rgba(16, 29, 48, 0.2);
55
+ }
56
+
57
+ .scrollable-content {
58
+ overflow: hidden;
59
+ white-space: nowrap;
60
+ }
61
+ .scrollable-content.scroll-x {
62
+ overflow-x: auto;
63
+ }
64
+ .scrollable-content.scroll-y {
65
+ overflow-y: auto;
66
+ }
67
+ .scrollable-content.no-overscroll {
68
+ overscroll-behavior: contain;
69
+ }