@haiilo/catalyst 0.5.13 → 0.7.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 (125) 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/p-12486027.js.map +1 -1
  5. package/dist/catalyst/p-12b96af6.js +2 -0
  6. package/dist/catalyst/p-12b96af6.js.map +1 -0
  7. package/dist/catalyst/p-4c9cd203.entry.js +2 -0
  8. package/dist/catalyst/p-4c9cd203.entry.js.map +1 -0
  9. package/dist/catalyst/p-5616e2cd.js +2 -0
  10. package/dist/catalyst/p-5616e2cd.js.map +1 -0
  11. package/dist/catalyst/p-9d2eab4f.entry.js +10 -0
  12. package/dist/catalyst/p-9d2eab4f.entry.js.map +1 -0
  13. package/dist/cjs/app-globals-aa29ad72.js.map +1 -1
  14. package/dist/cjs/{cat-alert_15.cjs.entry.js → cat-alert_18.cjs.entry.js} +277 -65
  15. package/dist/cjs/cat-alert_18.cjs.entry.js.map +1 -0
  16. package/dist/cjs/cat-form-hint-93a6936b.js +22 -0
  17. package/dist/cjs/cat-form-hint-93a6936b.js.map +1 -0
  18. package/dist/cjs/cat-textarea.cjs.entry.js +12 -12
  19. package/dist/cjs/cat-textarea.cjs.entry.js.map +1 -1
  20. package/dist/cjs/catalyst.cjs.js +2 -2
  21. package/dist/cjs/{index-5d72f0e4.js → index-499bad41.js} +44 -1
  22. package/dist/cjs/index-499bad41.js.map +1 -0
  23. package/dist/cjs/loader.cjs.js +2 -2
  24. package/dist/collection/collection-manifest.json +3 -0
  25. package/dist/collection/components/cat-avatar/cat-avatar.css +81 -0
  26. package/dist/collection/components/cat-avatar/cat-avatar.js +225 -0
  27. package/dist/collection/components/cat-avatar/cat-avatar.js.map +1 -0
  28. package/dist/collection/components/cat-badge/cat-badge.css +5 -5
  29. package/dist/collection/components/cat-button/cat-button.js +8 -8
  30. package/dist/collection/components/cat-button/cat-button.js.map +1 -1
  31. package/dist/collection/components/cat-checkbox/cat-checkbox.css +14 -0
  32. package/dist/collection/components/cat-checkbox/cat-checkbox.js +43 -11
  33. package/dist/collection/components/cat-checkbox/cat-checkbox.js.map +1 -1
  34. package/dist/collection/components/cat-form-hint/cat-form-hint.js +16 -0
  35. package/dist/collection/components/cat-form-hint/cat-form-hint.js.map +1 -0
  36. package/dist/collection/components/cat-input/cat-input.css +12 -6
  37. package/dist/collection/components/cat-input/cat-input.js +23 -25
  38. package/dist/collection/components/cat-input/cat-input.js.map +1 -1
  39. package/dist/collection/components/cat-radio/cat-radio.css +14 -0
  40. package/dist/collection/components/cat-radio/cat-radio.js +40 -8
  41. package/dist/collection/components/cat-radio/cat-radio.js.map +1 -1
  42. package/dist/collection/components/cat-scrollable/cat-scrollable.js +44 -44
  43. package/dist/collection/components/cat-scrollable/cat-scrollable.js.map +1 -1
  44. package/dist/collection/components/cat-tab/cat-tab.css +12 -0
  45. package/dist/collection/components/cat-tab/cat-tab.js +203 -0
  46. package/dist/collection/components/cat-tab/cat-tab.js.map +1 -0
  47. package/dist/collection/components/cat-tabs/cat-tabs.css +33 -0
  48. package/dist/collection/components/cat-tabs/cat-tabs.js +122 -0
  49. package/dist/collection/components/cat-tabs/cat-tabs.js.map +1 -0
  50. package/dist/collection/components/cat-textarea/cat-textarea.css +12 -6
  51. package/dist/collection/components/cat-textarea/cat-textarea.js +23 -18
  52. package/dist/collection/components/cat-textarea/cat-textarea.js.map +1 -1
  53. package/dist/collection/components/cat-toggle/cat-toggle.css +14 -0
  54. package/dist/collection/components/cat-toggle/cat-toggle.js +39 -7
  55. package/dist/collection/components/cat-toggle/cat-toggle.js.map +1 -1
  56. package/dist/collection/components/cat-tooltip/cat-tooltip.js +13 -8
  57. package/dist/collection/components/cat-tooltip/cat-tooltip.js.map +1 -1
  58. package/dist/collection/utils/load-img.js +16 -0
  59. package/dist/collection/utils/load-img.js.map +1 -0
  60. package/dist/components/cat-avatar.d.ts +11 -0
  61. package/dist/components/cat-avatar.js +125 -0
  62. package/dist/components/cat-avatar.js.map +1 -0
  63. package/dist/components/cat-badge.js +1 -1
  64. package/dist/components/cat-badge.js.map +1 -1
  65. package/dist/components/cat-button2.js +5 -5
  66. package/dist/components/cat-button2.js.map +1 -1
  67. package/dist/components/cat-checkbox.js +15 -5
  68. package/dist/components/cat-checkbox.js.map +1 -1
  69. package/dist/components/cat-form-hint.js +20 -0
  70. package/dist/components/cat-form-hint.js.map +1 -0
  71. package/dist/components/cat-input.js +15 -18
  72. package/dist/components/cat-input.js.map +1 -1
  73. package/dist/components/cat-radio.js +15 -5
  74. package/dist/components/cat-radio.js.map +1 -1
  75. package/dist/components/cat-scrollable.js +23 -23
  76. package/dist/components/cat-scrollable.js.map +1 -1
  77. package/dist/components/cat-tab.d.ts +11 -0
  78. package/dist/components/cat-tab.js +70 -0
  79. package/dist/components/cat-tab.js.map +1 -0
  80. package/dist/components/cat-tabs.d.ts +11 -0
  81. package/dist/components/cat-tabs.js +107 -0
  82. package/dist/components/cat-tabs.js.map +1 -0
  83. package/dist/components/cat-textarea.js +13 -12
  84. package/dist/components/cat-textarea.js.map +1 -1
  85. package/dist/components/cat-toggle.js +15 -5
  86. package/dist/components/cat-toggle.js.map +1 -1
  87. package/dist/components/cat-tooltip.js +13 -8
  88. package/dist/components/cat-tooltip.js.map +1 -1
  89. package/dist/components/index.js.map +1 -1
  90. package/dist/esm/app-globals-cf55f7f5.js.map +1 -1
  91. package/dist/esm/{cat-alert_15.entry.js → cat-alert_18.entry.js} +275 -66
  92. package/dist/esm/cat-alert_18.entry.js.map +1 -0
  93. package/dist/esm/cat-form-hint-dc443c7c.js +20 -0
  94. package/dist/esm/cat-form-hint-dc443c7c.js.map +1 -0
  95. package/dist/esm/cat-textarea.entry.js +12 -12
  96. package/dist/esm/cat-textarea.entry.js.map +1 -1
  97. package/dist/esm/catalyst.js +2 -2
  98. package/dist/esm/{index-fd12be19.js → index-039e6f5f.js} +44 -2
  99. package/dist/esm/index-039e6f5f.js.map +1 -0
  100. package/dist/esm/loader.js +2 -2
  101. package/dist/types/components/cat-avatar/cat-avatar.d.ts +46 -0
  102. package/dist/types/components/cat-button/cat-button.d.ts +2 -2
  103. package/dist/types/components/cat-checkbox/cat-checkbox.d.ts +9 -0
  104. package/dist/types/components/cat-form-hint/cat-form-hint.d.ts +19 -0
  105. package/dist/types/components/cat-input/cat-input.d.ts +7 -5
  106. package/dist/types/components/cat-radio/cat-radio.d.ts +9 -0
  107. package/dist/types/components/cat-scrollable/cat-scrollable.d.ts +12 -12
  108. package/dist/types/components/cat-tab/cat-tab.d.ts +43 -0
  109. package/dist/types/components/cat-tabs/cat-tabs.d.ts +25 -0
  110. package/dist/types/components/cat-textarea/cat-textarea.d.ts +7 -2
  111. package/dist/types/components/cat-toggle/cat-toggle.d.ts +9 -0
  112. package/dist/types/components/cat-tooltip/cat-tooltip.d.ts +1 -0
  113. package/dist/types/components.d.ts +255 -52
  114. package/dist/types/utils/load-img.d.ts +8 -0
  115. package/package.json +2 -2
  116. package/dist/catalyst/p-a8629c54.entry.js +0 -2
  117. package/dist/catalyst/p-a8629c54.entry.js.map +0 -1
  118. package/dist/catalyst/p-bfc656ca.js +0 -2
  119. package/dist/catalyst/p-bfc656ca.js.map +0 -1
  120. package/dist/catalyst/p-e6491f33.entry.js +0 -10
  121. package/dist/catalyst/p-e6491f33.entry.js.map +0 -1
  122. package/dist/cjs/cat-alert_15.cjs.entry.js.map +0 -1
  123. package/dist/cjs/index-5d72f0e4.js.map +0 -1
  124. package/dist/esm/cat-alert_15.entry.js.map +0 -1
  125. package/dist/esm/index-fd12be19.js.map +0 -1
@@ -1,5 +1,6 @@
1
- import { r as registerInstance, h, H as Host, c as createEvent } from './index-fd12be19.js';
1
+ import { r as registerInstance, h, H as Host, c as createEvent, g as getElement } from './index-039e6f5f.js';
2
2
  import { l as loglevel } from './loglevel-39a9e3f9.js';
3
+ import { C as CatFormHint } from './cat-form-hint-dc443c7c.js';
3
4
  import { C as CatIconRegistry, a as CatI18nRegistry } from './cat-icon-registry-3ea75755.js';
4
5
  import { N as NotificationsService } from './cat-notification-cd98c266.js';
5
6
 
@@ -31,7 +32,92 @@ const CatAlert = class {
31
32
  };
32
33
  CatAlert.style = catAlertCss;
33
34
 
34
- const catBadgeCss = ":host{display:inline-flex;max-width:100%;vertical-align:baseline}:host([hidden]){display:none}.badge{font:inherit;flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;border-radius:0.125rem;text-decoration:none;width:100%;box-sizing:border-box;line-height:1;white-space:nowrap}.badge slot{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.badge-round{border-radius:10rem}.badge-filled{background-color:rgb(var(--bg));color:rgb(var(--fill));font-weight:600;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:greyscale}.badge-outlined{background-color:white;box-shadow:inset 0 0 0 1px rgba(var(--border), 0.2);color:rgb(var(--text))}.badge-primary{--bg:var(--cat-primary-bg, 32, 127, 138);--fill:var(--cat-primary-fill, 255, 255, 255);--text:var(--cat-primary-text, 32, 127, 138);--border:var(--cat-primary-text, 32, 127, 138)}.badge-secondary{--bg:105, 118, 135;--fill:255, 255, 255;--text:0, 0, 0;--border:105, 118, 135}.badge-success{--bg:0, 132, 88;--fill:255, 255, 255;--text:0, 132, 88;--border:0, 132, 88}.badge-warning{--bg:255, 206, 128;--fill:0, 0, 0;--text:159, 97, 0;--border:159, 97, 0}.badge-danger{--bg:217, 52, 13;--fill:255, 255, 255;--text:217, 52, 13;--border:217, 52, 13}.badge-xs{height:0.75rem;min-width:0.75rem;font-size:0.75rem;padding:0 0.1875rem}.badge-s{height:1rem;min-width:1rem;font-size:0.75rem;padding:0 0.25rem}.badge-m{height:1.25rem;min-width:1.25rem;font-size:0.75rem;padding:0 0.3125rem}.badge-l{height:1.5rem;min-width:1.5rem;font-size:0.875rem;padding:0 0.375rem}.badge-xl{height:1.75rem;min-width:1.75rem;font-size:0.9375rem;padding:0 0.4375rem}.badge-pulse.badge-filled{animation:1.5s ease 0s infinite normal none running pulse}.badge-pulse.badge-outlined{animation:1.5s ease 0s infinite normal none running pulse-outlined}@keyframes pulse{0%{box-shadow:0 0 0 0 rgb(var(--bg))}70%{box-shadow:transparent 0 0 0 0.5rem}100%{box-shadow:transparent 0 0 0 0}}@keyframes pulse-outlined{0%{box-shadow:0 0 0 0 rgb(var(--bg)), inset 0 0 0 1px rgba(var(--border), 0.2)}70%{box-shadow:transparent 0 0 0 0.5rem, inset 0 0 0 1px rgba(var(--border), 0.2)}100%{box-shadow:transparent 0 0 0 0, inset 0 0 0 1px rgba(var(--border), 0.2)}}";
35
+ /**
36
+ * Loads an image and wraps the result in a promise.
37
+ *
38
+ * @param src the image URL
39
+ * @returns a promise
40
+ */
41
+ const loadImg = (src) => {
42
+ return new Promise((resolve, reject) => {
43
+ const image = new Image();
44
+ image.addEventListener('load', resolve);
45
+ image.addEventListener('error', reject);
46
+ image.src = src;
47
+ });
48
+ };
49
+
50
+ const catAvatarCss = ":host{display:inline-block;vertical-align:middle;-webkit-user-select:none;-ms-user-select:none;user-select:none;}:host([hidden]){display:none}.avatar{display:flex;align-items:center;justify-content:center;border-radius:0.25rem;text-decoration:inherit;color:var(--cat-avatar-fill, white);background-color:var(--cat-avatar-bg, #697687);background-size:cover;background-position:center;white-space:nowrap;overflow:hidden}.avatar:focus-visible{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255));outline-offset:1px}.avatar-round{border-radius:50%}.avatar-xs{width:var(--cat-avatar-size, 1.5rem);height:var(--cat-avatar-size, 1.5rem);line-height:var(--cat-avatar-size, 1.5rem);font-size:var(--cat-avatar-font-size, 0.75rem)}.avatar-s{width:var(--cat-avatar-size, 2rem);height:var(--cat-avatar-size, 2rem);line-height:var(--cat-avatar-size, 2rem);font-size:var(--cat-avatar-font-size, 0.875rem)}.avatar-m{width:var(--cat-avatar-size, 2.5rem);height:var(--cat-avatar-size, 2.5rem);line-height:var(--cat-avatar-size, 2.5rem);font-size:var(--cat-avatar-font-size, 0.9375rem)}.avatar-l{width:var(--cat-avatar-size, 3rem);height:var(--cat-avatar-size, 3rem);line-height:var(--cat-avatar-size, 3rem);font-size:var(--cat-avatar-font-size, 1.125rem)}.avatar-xl{width:var(--cat-avatar-size, 3.5rem);height:var(--cat-avatar-size, 3.5rem);line-height:var(--cat-avatar-size, 3.5rem);font-size:var(--cat-avatar-font-size, 1.25rem)}";
51
+
52
+ const CatAvatar = class {
53
+ constructor(hostRef) {
54
+ registerInstance(this, hostRef);
55
+ /**
56
+ * The size of the avatar.
57
+ */
58
+ this.size = 'm';
59
+ /**
60
+ * Use round avatar edges.
61
+ */
62
+ this.round = false;
63
+ /**
64
+ * The label of the avatar.
65
+ */
66
+ this.label = '';
67
+ }
68
+ onSrcChanged(value) {
69
+ if (value) {
70
+ loadImg(value).then(() => (this.backgroundImage = `url(${value})`), () => (this.backgroundImage = undefined));
71
+ }
72
+ else {
73
+ this.backgroundImage = undefined;
74
+ }
75
+ }
76
+ componentWillLoad() {
77
+ this.onSrcChanged(this.src);
78
+ }
79
+ componentWillRender() {
80
+ if (!this.label) {
81
+ loglevel.warn('[A11y] Missing ARIA label on avatar', this);
82
+ }
83
+ }
84
+ render() {
85
+ if (this.url) {
86
+ return (h("a", { href: this.url, target: this.urlTarget, style: this.cssStyle, class: this.cssClass, "aria-label": this.label }, this.content));
87
+ }
88
+ else {
89
+ return (h("span", { style: this.cssStyle, class: this.cssClass, "aria-label": this.label }, this.content));
90
+ }
91
+ }
92
+ get content() {
93
+ return !this.backgroundImage
94
+ ? [this.icon ? h("cat-icon", { icon: this.icon, size: this.size }) : this.getInitials()]
95
+ : [];
96
+ }
97
+ get cssStyle() {
98
+ return { 'background-image': this.backgroundImage };
99
+ }
100
+ get cssClass() {
101
+ return {
102
+ avatar: true,
103
+ 'avatar-round': this.round,
104
+ [`avatar-${this.size}`]: Boolean(this.size)
105
+ };
106
+ }
107
+ getInitials() {
108
+ var _a;
109
+ return ((_a = this.initials) !== null && _a !== void 0 ? _a : this.label
110
+ .split(' ')
111
+ .map(n => n[0])
112
+ .join(''));
113
+ }
114
+ static get watchers() { return {
115
+ "src": ["onSrcChanged"]
116
+ }; }
117
+ };
118
+ CatAvatar.style = catAvatarCss;
119
+
120
+ const catBadgeCss = ":host{display:inline-flex;max-width:100%;vertical-align:baseline}:host([hidden]){display:none}.badge{font:inherit;flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;border-radius:0.125rem;text-decoration:none;width:100%;box-sizing:border-box;line-height:1;white-space:nowrap}.badge slot{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.badge-round{border-radius:10rem}.badge-filled{background-color:rgb(var(--bg));color:rgb(var(--fill));font-weight:600;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:greyscale}.badge-outlined{background-color:white;box-shadow:inset 0 0 0 1px rgba(var(--border), 0.2);color:rgb(var(--text))}.badge-primary{--bg:var(--cat-primary-bg, 32, 127, 138);--fill:var(--cat-primary-fill, 255, 255, 255);--text:var(--cat-primary-text, 32, 127, 138);--border:var(--cat-primary-text, 32, 127, 138)}.badge-secondary{--bg:105, 118, 135;--fill:255, 255, 255;--text:0, 0, 0;--border:105, 118, 135}.badge-success{--bg:0, 132, 88;--fill:255, 255, 255;--text:0, 132, 88;--border:0, 132, 88}.badge-warning{--bg:255, 206, 128;--fill:0, 0, 0;--text:159, 97, 0;--border:159, 97, 0}.badge-danger{--bg:217, 52, 13;--fill:255, 255, 255;--text:217, 52, 13;--border:217, 52, 13}.badge-xs{height:0.75rem;min-width:0.75rem;font-size:0.75rem;padding:0rem 0.25rem}.badge-s{height:1rem;min-width:1rem;font-size:0.75rem;padding:0.25rem 0.5rem}.badge-m{height:1.25rem;min-width:1.25rem;font-size:0.75rem;padding:0.5rem 0.75rem}.badge-l{height:1.5rem;min-width:1.5rem;font-size:0.875rem;padding:0.75rem 1rem}.badge-xl{height:1.75rem;min-width:1.75rem;font-size:0.9375rem;padding:1rem 1.25rem}.badge-pulse.badge-filled{animation:1.5s ease 0s infinite normal none running pulse}.badge-pulse.badge-outlined{animation:1.5s ease 0s infinite normal none running pulse-outlined}@keyframes pulse{0%{box-shadow:0 0 0 0 rgb(var(--bg))}70%{box-shadow:transparent 0 0 0 0.5rem}100%{box-shadow:transparent 0 0 0 0}}@keyframes pulse-outlined{0%{box-shadow:0 0 0 0 rgb(var(--bg)), inset 0 0 0 1px rgba(var(--border), 0.2)}70%{box-shadow:transparent 0 0 0 0.5rem, inset 0 0 0 1px rgba(var(--border), 0.2)}100%{box-shadow:transparent 0 0 0 0, inset 0 0 0 1px rgba(var(--border), 0.2)}}";
35
121
 
36
122
  const CatBadge = class {
37
123
  constructor(hostRef) {
@@ -226,9 +312,9 @@ const CatButton = class {
226
312
  */
227
313
  this.submit = false;
228
314
  /**
229
- * Ellipse overflowing button content.
315
+ * Disables ellipse overflowing button content.
230
316
  */
231
- this.ellipsed = true;
317
+ this.noEllipsis = false;
232
318
  /**
233
319
  * Use round button edges.
234
320
  */
@@ -293,7 +379,7 @@ const CatButton = class {
293
379
  'cat-button-round': this.round,
294
380
  'cat-button-loading': this.loading,
295
381
  'cat-button-disabled': this.disabled,
296
- 'cat-button-ellipsed': this.ellipsed && !this.isIconButton,
382
+ 'cat-button-ellipsed': !this.noEllipsis && !this.isIconButton,
297
383
  [`cat-button-${this.variant}`]: Boolean(this.variant),
298
384
  [`cat-button-${this.color}`]: Boolean(this.color),
299
385
  [`cat-button-${this.size}`]: Boolean(this.size)
@@ -307,7 +393,7 @@ const CatButton = class {
307
393
  'cat-button-round': (_a = this.round) !== null && _a !== void 0 ? _a : this.isIconButton,
308
394
  'cat-button-loading': this.loading,
309
395
  'cat-button-disabled': this.disabled,
310
- 'cat-button-ellipsed': this.ellipsed && !this.isIconButton,
396
+ 'cat-button-ellipsed': !this.noEllipsis && !this.isIconButton,
311
397
  [`cat-button-${this.variant}`]: Boolean(this.variant),
312
398
  [`cat-button-${this.color}`]: Boolean(this.color),
313
399
  [`cat-button-${this.size}`]: Boolean(this.size)
@@ -374,16 +460,17 @@ const CatCard = class {
374
460
  };
375
461
  CatCard.style = catCardCss;
376
462
 
377
- const catCheckboxCss = ":host{display:flex;margin-bottom:1rem}:host([hidden]){display:none}label{flex:0 1 auto;display:flex;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;-webkit-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}input{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.box{flex:0 0 auto;display:flex;position:relative;height:1.25rem;width:1.25rem;background-color:white;border:1px solid #d7dbe0;border-radius:0.125rem;transition:background-color 0.13s ease, border-color 0.13s ease}.box svg{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:16px;stroke-dashoffset:16px;transition:all 0.13s ease;width:70%;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%) scale(0.99)}:checked+.box{background-color:rgb(var(--cat-primary-bg, 32, 127, 138));border-color:rgb(var(--cat-primary-bg, 32, 127, 138));stroke:rgb(var(--cat-primary-fill, 255, 255, 255))}:checked+.box .check{stroke-dashoffset:0}:indeterminate+.box{background-color:rgb(var(--cat-primary-bg, 32, 127, 138));border-color:rgb(var(--cat-primary-bg, 32, 127, 138));stroke:rgb(var(--cat-primary-fill, 255, 255, 255))}:indeterminate+.box .dash{stroke-dashoffset:0}:focus-visible+.box{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255));outline-offset:1px}.label{flex:1 1 auto}.is-hidden .label{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.is-disabled{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}";
463
+ const catCheckboxCss = ".hint-section{display:flex;gap:0.5rem;flex-direction:column}.hint-section .input-hint,.hint-section ::slotted([slot=hint]){font-size:0.875rem;line-height:1rem;margin:0}:host{display:flex;flex-direction:column;gap:0.5rem;margin-bottom:1rem}:host([hidden]){display:none}label{flex:0 1 auto;display:flex;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;-webkit-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}input{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.box{flex:0 0 auto;display:flex;position:relative;height:1.25rem;width:1.25rem;background-color:white;border:1px solid #d7dbe0;border-radius:0.125rem;transition:background-color 0.13s ease, border-color 0.13s ease}.box svg{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:16px;stroke-dashoffset:16px;transition:all 0.13s ease;width:70%;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%) scale(0.99)}:checked+.box{background-color:rgb(var(--cat-primary-bg, 32, 127, 138));border-color:rgb(var(--cat-primary-bg, 32, 127, 138));stroke:rgb(var(--cat-primary-fill, 255, 255, 255))}:checked+.box .check{stroke-dashoffset:0}:indeterminate+.box{background-color:rgb(var(--cat-primary-bg, 32, 127, 138));border-color:rgb(var(--cat-primary-bg, 32, 127, 138));stroke:rgb(var(--cat-primary-fill, 255, 255, 255))}:indeterminate+.box .dash{stroke-dashoffset:0}:focus-visible+.box{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255));outline-offset:1px}.label{flex:1 1 auto}.is-hidden .label{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.is-disabled{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}";
378
464
 
379
- let nextUniqueId$5 = 0;
465
+ let nextUniqueId$6 = 0;
380
466
  const CatCheckbox = class {
381
467
  constructor(hostRef) {
382
468
  registerInstance(this, hostRef);
383
469
  this.catChange = createEvent(this, "catChange", 7);
384
470
  this.catFocus = createEvent(this, "catFocus", 7);
385
471
  this.catBlur = createEvent(this, "catBlur", 7);
386
- this.id = `cat-checkbox-${nextUniqueId$5++}`;
472
+ this.id = `cat-checkbox-${nextUniqueId$6++}`;
473
+ this.hasSlottedLabel = false;
387
474
  /**
388
475
  * Checked state of the checkbox
389
476
  */
@@ -415,7 +502,7 @@ const CatCheckbox = class {
415
502
  }
416
503
  }
417
504
  componentWillRender() {
418
- if (!this.label) {
505
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
419
506
  loglevel.error('[A11y] Missing ARIA label on checkbox', this);
420
507
  }
421
508
  }
@@ -429,9 +516,14 @@ const CatCheckbox = class {
429
516
  this.input.focus(options);
430
517
  }
431
518
  render() {
432
- return (h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, h("input", { ref: el => (this.input = el), id: this.id, type: "checkbox", name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onInput: this.onInput.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), h("span", { class: "box", "aria-hidden": "true", part: "checkbox" }, h("svg", { class: "check", viewBox: "0 0 12 10" }, h("polyline", { points: "1.5 6 4.5 9 10.5 1" })), h("svg", { class: "dash", viewBox: "0 0 12 10" }, h("polyline", { points: "1.5 5 10.5 5" }))), h("span", { class: "label", part: "label" }, this.label)));
519
+ return (h(Host, null, h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, h("input", { ref: el => (this.input = el), id: this.id, type: "checkbox", name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onInput: this.onInput.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), h("span", { class: "box", "aria-hidden": "true", part: "checkbox" }, h("svg", { class: "check", viewBox: "0 0 12 10" }, h("polyline", { points: "1.5 6 4.5 9 10.5 1" })), h("svg", { class: "dash", viewBox: "0 0 12 10" }, h("polyline", { points: "1.5 5 10.5 5" }))), h("span", { class: "label", part: "label" }, (this.hasSlottedLabel && h("slot", { name: "label" })) || this.label)), this.hintSection));
520
+ }
521
+ get hintSection() {
522
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
523
+ return ((this.hint || hasSlottedHint) && (h(CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && h("slot", { name: "hint" }) })));
433
524
  }
434
525
  onInput(event) {
526
+ this.value = this.input.value;
435
527
  this.catChange.emit(event);
436
528
  }
437
529
  onFocus(event) {
@@ -440,6 +532,7 @@ const CatCheckbox = class {
440
532
  onBlur(event) {
441
533
  this.catBlur.emit(event);
442
534
  }
535
+ get hostElement() { return getElement(this); }
443
536
  };
444
537
  CatCheckbox.style = catCheckboxCss;
445
538
 
@@ -467,9 +560,9 @@ const CatIcon = class {
467
560
  };
468
561
  CatIcon.style = catIconCss;
469
562
 
470
- const catInputCss = ":host{display:flex;flex-direction:column;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;margin-bottom:1rem}:host([hidden]){display:none}.input-wrapper{display:flex;align-items:stretch;gap:0.75rem;padding:0 0.75rem;height:2.5rem;overflow:hidden;background:white;border-radius:0.25rem;box-shadow:0 0 0 1px #d7dbe0;transition:box-shadow 0.13s linear}.input-wrapper.input-round{border-radius:10rem}.input-wrapper.input-disabled{background:#f8f8fb;cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.input-wrapper:not(.input-disabled):hover{box-shadow:0 0 0 2px #d7dbe0}.input-wrapper:not(.input-disabled):focus-within{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255))}label{align-self:flex-start}label.hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.input-optional{margin-left:0.25rem;font-size:0.75rem;line-height:1rem;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.text-prefix,.text-suffix{display:inline-flex;align-items:center;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.text-prefix{border-right:1px solid #d7dbe0;padding-right:0.75rem}.text-suffix{border-left:1px solid #d7dbe0;padding-left:0.75rem}.icon-prefix,.icon-suffix{align-self:center}.input-inner-wrapper{display:flex;position:relative;flex:1 1 auto}input{font:inherit;margin:0;padding:0;width:100%;min-width:0;border:none;outline:none;background:none}.input-disabled input{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}input.has-clearable{padding-right:1.5rem}input::placeholder{color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.clearable{position:absolute;top:calc(50% - 1rem);right:-0.5rem}.input-hint{font-size:0.875rem;line-height:1rem;margin:0}";
563
+ const catInputCss = ".hint-section{display:flex;gap:0.5rem;flex-direction:column}.hint-section .input-hint,.hint-section ::slotted([slot=hint]){font-size:0.875rem;line-height:1rem;margin:0}:host{display:flex;flex-direction:column;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;margin-bottom:1rem}:host([hidden]){display:none}.input-wrapper{display:flex;align-items:stretch;gap:0.75rem;padding:0 0.75rem;height:2.5rem;overflow:hidden;background:white;border-radius:0.25rem;box-shadow:0 0 0 1px #d7dbe0;transition:box-shadow 0.13s linear}.input-wrapper.input-round{border-radius:10rem}.input-wrapper.input-disabled{background:#f8f8fb;cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.input-wrapper:not(.input-disabled):hover{box-shadow:0 0 0 2px #d7dbe0}.input-wrapper:not(.input-disabled):focus-within{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255))}label{align-self:flex-start}label.hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.input-optional{margin-left:0.25rem;font-size:0.75rem;line-height:1rem;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.text-prefix,.text-suffix{display:inline-flex;align-items:center;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.text-prefix{border-right:1px solid #d7dbe0;padding-right:0.75rem}.text-suffix{border-left:1px solid #d7dbe0;padding-left:0.75rem}.icon-prefix,.icon-suffix{align-self:center}.input-inner-wrapper{display:flex;position:relative;flex:1 1 auto}input{font:inherit;margin:0;padding:0;width:100%;min-width:0;border:none;outline:none;background:none}.input-disabled input{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}input.has-clearable{padding-right:1.5rem}input::placeholder{color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.clearable{position:absolute;top:calc(50% - 1rem);right:-0.5rem}";
471
564
 
472
- let nextUniqueId$4 = 0;
565
+ let nextUniqueId$5 = 0;
473
566
  const CatInput = class {
474
567
  constructor(hostRef) {
475
568
  registerInstance(this, hostRef);
@@ -477,8 +570,8 @@ const CatInput = class {
477
570
  this.catFocus = createEvent(this, "catFocus", 7);
478
571
  this.catBlur = createEvent(this, "catBlur", 7);
479
572
  this.i18n = CatI18nRegistry.getInstance();
480
- this.id = `cat-input-${nextUniqueId$4++}`;
481
- this.inputValue = '';
573
+ this.id = `cat-input-${nextUniqueId$5++}`;
574
+ this.hasSlottedLabel = false;
482
575
  /**
483
576
  * Whether the input should show a clear button.
484
577
  */
@@ -520,14 +613,8 @@ const CatInput = class {
520
613
  */
521
614
  this.type = 'text';
522
615
  }
523
- onValueChange(value) {
524
- this.inputValue = '' + (value !== null && value !== void 0 ? value : '');
525
- }
526
- componentWillLoad() {
527
- this.onValueChange(this.value);
528
- }
529
616
  componentWillRender() {
530
- if (!this.label) {
617
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
531
618
  loglevel.error('[A11y] Missing ARIA label on input', this);
532
619
  }
533
620
  }
@@ -544,19 +631,23 @@ const CatInput = class {
544
631
  * Clear the input.
545
632
  */
546
633
  async clear() {
547
- this.inputValue = '';
634
+ this.value = '';
548
635
  }
549
636
  render() {
550
- return (h(Host, null, this.label && (h("label", { htmlFor: this.id, class: { hidden: this.labelHidden } }, h("span", { part: "label" }, this.label, !this.required && (h("span", { class: "input-optional", "aria-hidden": "true" }, "(", this.i18n.getMessage('input.optional'), ")"))))), h("div", { class: {
637
+ return (h(Host, null, (this.hasSlottedLabel || this.label) && (h("label", { htmlFor: this.id, class: { hidden: this.labelHidden } }, h("span", { part: "label" }, (this.hasSlottedLabel && h("slot", { name: "label" })) || this.label, !this.required && (h("span", { class: "input-optional", "aria-hidden": "true" }, "(", this.i18n.getMessage('input.optional'), ")"))))), h("div", { class: {
551
638
  'input-wrapper': true,
552
639
  'input-round': this.round,
553
640
  'input-disabled': this.disabled
554
641
  }, onClick: () => this.input.focus() }, this.textPrefix && (h("span", { class: "text-prefix", part: "prefix" }, this.textPrefix)), this.icon && !this.iconRight && h("cat-icon", { icon: this.icon, class: "icon-prefix", size: "l" }), h("div", { class: "input-inner-wrapper" }, h("input", { ref: el => (this.input = el), id: this.id, class: {
555
642
  'has-clearable': this.clearable && !this.disabled
556
- }, autocomplete: this.autoComplete, disabled: this.disabled, max: this.max, maxlength: this.maxLength, min: this.max, minlength: this.minLength, name: this.name, placeholder: this.placeholder, readonly: this.readonly, required: this.required, type: this.type, value: this.inputValue, onInput: this.onInput.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), this.clearable && !this.disabled && this.inputValue && (h("cat-button", { class: "clearable", icon: "cross-circle-outlined", "icon-only": "true", size: "s", variant: "text", "a11y-label": this.i18n.getMessage('input.clear'), onClick: this.clear.bind(this) }))), this.icon && this.iconRight && h("cat-icon", { icon: this.icon, class: "icon-suffix", size: "l" }), this.textSuffix && (h("span", { class: "text-suffix", part: "suffix" }, this.textSuffix))), this.hint && h("p", { class: "input-hint" }, this.hint)));
643
+ }, autocomplete: this.autoComplete, disabled: this.disabled, max: this.max, maxlength: this.maxLength, min: this.max, minlength: this.minLength, name: this.name, placeholder: this.placeholder, readonly: this.readonly, required: this.required, type: this.type, value: this.value, onInput: this.onInput.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), this.clearable && !this.disabled && this.value && (h("cat-button", { class: "clearable", icon: "cross-circle-outlined", "icon-only": "true", size: "s", variant: "text", "a11y-label": this.i18n.getMessage('input.clear'), onClick: this.clear.bind(this) }))), this.icon && this.iconRight && h("cat-icon", { icon: this.icon, class: "icon-suffix", size: "l" }), this.textSuffix && (h("span", { class: "text-suffix", part: "suffix" }, this.textSuffix))), this.hintSection));
644
+ }
645
+ get hintSection() {
646
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
647
+ return ((this.hint || hasSlottedHint) && (h(CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && h("slot", { name: "hint" }) })));
557
648
  }
558
649
  onInput(event) {
559
- this.inputValue = this.input.value;
650
+ this.value = this.input.value;
560
651
  this.catChange.emit(event);
561
652
  }
562
653
  onFocus(event) {
@@ -565,9 +656,7 @@ const CatInput = class {
565
656
  onBlur(event) {
566
657
  this.catBlur.emit(event);
567
658
  }
568
- static get watchers() { return {
569
- "value": ["onValueChange"]
570
- }; }
659
+ get hostElement() { return getElement(this); }
571
660
  };
572
661
  CatInput.style = catInputCss;
573
662
 
@@ -2806,13 +2895,13 @@ const firstTabbable = (container) => {
2806
2895
 
2807
2896
  const catMenuCss = ":host{display:contents}:host([hidden]){display:none}.content{padding-top:0.5rem;padding-bottom:0.5rem;position:absolute;background:white;display:none;overflow:auto;-webkit-overflow-scrolling:touch;min-width:8rem;max-width:16rem;min-height:2rem;max-height:calc(100vh - 48px);box-shadow:0 1px 4px 0 rgba(16, 29, 48, 0.2);border-radius:0.25rem;z-index:100}";
2808
2897
 
2809
- let nextUniqueId$3 = 0;
2898
+ let nextUniqueId$4 = 0;
2810
2899
  const CatMenu = class {
2811
2900
  constructor(hostRef) {
2812
2901
  registerInstance(this, hostRef);
2813
2902
  this.catOpen = createEvent(this, "catOpen", 7);
2814
2903
  this.catClose = createEvent(this, "catClose", 7);
2815
- this.id = nextUniqueId$3++;
2904
+ this.id = nextUniqueId$4++;
2816
2905
  /**
2817
2906
  * The placement of the menu.
2818
2907
  */
@@ -2907,16 +2996,17 @@ const CatMenu = class {
2907
2996
  CatMenu.OFFSET = 4;
2908
2997
  CatMenu.style = catMenuCss;
2909
2998
 
2910
- const catRadioCss = ":host{display:flex;margin-bottom:1rem}:host([hidden]){display:none}label{display:flex;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;cursor:pointer}.radio{display:flex;position:relative}.circle{position:absolute;width:0.75rem;height:0.75rem;background-color:rgb(var(--cat-primary-bg, 32, 127, 138));border-radius:10rem;top:calc(50% - 0.375rem);left:calc(50% - 0.375rem);visibility:hidden}input{margin:0;width:1.25rem;height:1.25rem;appearance:none;background-color:white;border:1px solid #d7dbe0;border-radius:10rem;cursor:inherit}input:checked{border-color:rgb(var(--cat-primary-bg, 32, 127, 138))}input:checked+.circle{visibility:visible}input:focus-visible{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255));outline-offset:1px}.is-hidden .label{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.is-disabled{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.is-disabled input{background-color:#f8f8fb}.is-disabled input:checked{border-color:#d7dbe0}.is-disabled .circle{background-color:#d7dbe0}";
2999
+ const catRadioCss = ".hint-section{display:flex;gap:0.5rem;flex-direction:column}.hint-section .input-hint,.hint-section ::slotted([slot=hint]){font-size:0.875rem;line-height:1rem;margin:0}:host{display:flex;flex-direction:column;gap:0.5rem;margin-bottom:1rem}:host([hidden]){display:none}label{display:flex;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;cursor:pointer}.radio{display:flex;position:relative}.circle{position:absolute;width:0.75rem;height:0.75rem;background-color:rgb(var(--cat-primary-bg, 32, 127, 138));border-radius:10rem;top:calc(50% - 0.375rem);left:calc(50% - 0.375rem);visibility:hidden}input{margin:0;width:1.25rem;height:1.25rem;appearance:none;background-color:white;border:1px solid #d7dbe0;border-radius:10rem;cursor:inherit}input:checked{border-color:rgb(var(--cat-primary-bg, 32, 127, 138))}input:checked+.circle{visibility:visible}input:focus-visible{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255));outline-offset:1px}.is-hidden .label{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.is-disabled{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}.is-disabled input{background-color:#f8f8fb}.is-disabled input:checked{border-color:#d7dbe0}.is-disabled .circle{background-color:#d7dbe0}";
2911
3000
 
2912
- let nextUniqueId$2 = 0;
3001
+ let nextUniqueId$3 = 0;
2913
3002
  const CatRadio = class {
2914
3003
  constructor(hostRef) {
2915
3004
  registerInstance(this, hostRef);
2916
3005
  this.catChange = createEvent(this, "catChange", 7);
2917
3006
  this.catFocus = createEvent(this, "catFocus", 7);
2918
3007
  this.catBlur = createEvent(this, "catBlur", 7);
2919
- this.id = `cat-radio-${++nextUniqueId$2}`;
3008
+ this.id = `cat-radio-${++nextUniqueId$3}`;
3009
+ this.hasSlottedLabel = false;
2920
3010
  /**
2921
3011
  * Whether this radio is checked.
2922
3012
  */
@@ -2939,7 +3029,7 @@ const CatRadio = class {
2939
3029
  this.required = false;
2940
3030
  }
2941
3031
  componentWillRender() {
2942
- if (!this.label) {
3032
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
2943
3033
  loglevel.error('[A11y] Missing ARIA label on radio', this);
2944
3034
  }
2945
3035
  }
@@ -2953,9 +3043,14 @@ const CatRadio = class {
2953
3043
  this.input.focus(options);
2954
3044
  }
2955
3045
  render() {
2956
- return (h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, h("span", { class: "radio" }, h("input", { ref: el => (this.input = el), id: this.id, type: "radio", name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onInput: this.onChange.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), h("span", { class: "circle" })), h("span", { class: "label", part: "label" }, this.label)));
3046
+ return (h(Host, null, h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, h("span", { class: "radio" }, h("input", { ref: el => (this.input = el), id: this.id, type: "radio", name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, onInput: this.onChange.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), h("span", { class: "circle" })), h("span", { class: "label", part: "label" }, (this.hasSlottedLabel && h("slot", { name: "label" })) || this.label)), this.hintSection));
3047
+ }
3048
+ get hintSection() {
3049
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
3050
+ return ((this.hint || hasSlottedHint) && (h(CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && h("slot", { name: "hint" }) })));
2957
3051
  }
2958
3052
  onChange(event) {
3053
+ this.value = this.input.value;
2959
3054
  this.catChange.emit(event);
2960
3055
  }
2961
3056
  onFocus(event) {
@@ -2964,6 +3059,7 @@ const CatRadio = class {
2964
3059
  onBlur(event) {
2965
3060
  this.catBlur.emit(event);
2966
3061
  }
3062
+ get hostElement() { return getElement(this); }
2967
3063
  };
2968
3064
  CatRadio.style = catRadioCss;
2969
3065
 
@@ -4198,20 +4294,20 @@ const CatScrollable = class {
4198
4294
  this.scrolledBottom = createEvent(this, "scrolledBottom", 7);
4199
4295
  this.init = new Subject();
4200
4296
  this.destroyed = new Subject();
4201
- /** Flags to enable/disable scroll shadowX. */
4202
- this.shadowX = true;
4203
- /** Flags to enable/disable scroll shadowY. */
4204
- this.shadowY = true;
4205
- /** Flags to enable/disable overflowX. */
4206
- this.overflowX = true;
4207
- /** Flags to enable/disable overflowY. */
4208
- this.overflowY = true;
4209
- /** Flag to enable/disable overscroll behavior. */
4210
- this.overscroll = true;
4297
+ /** Flags to disable/enable scroll shadowX. */
4298
+ this.noShadowX = false;
4299
+ /** Flags to disable/enable scroll shadowY. */
4300
+ this.noShadowY = false;
4301
+ /** Flags to disable/enable overflowX. */
4302
+ this.noOverflowX = false;
4303
+ /** Flags to disable/enable overflowY. */
4304
+ this.noOverflowY = false;
4305
+ /** Flag to disable/enable overscroll behavior. */
4306
+ this.noOverscroll = false;
4211
4307
  /**
4212
- * Flag to fire an initial event after content initialization.
4308
+ * Flag to not fire an initial event after content initialization.
4213
4309
  */
4214
- this.scrolledInit = true;
4310
+ this.noScrolledInit = false;
4215
4311
  /**
4216
4312
  * Buffer to be used to calculate the scroll distance.
4217
4313
  */
@@ -4240,7 +4336,7 @@ const CatScrollable = class {
4240
4336
  });
4241
4337
  }
4242
4338
  componentDidLoad() {
4243
- if (this.scrolledInit) {
4339
+ if (!this.noScrolledInit) {
4244
4340
  this.init.next();
4245
4341
  }
4246
4342
  }
@@ -4251,12 +4347,12 @@ const CatScrollable = class {
4251
4347
  }
4252
4348
  render() {
4253
4349
  return [
4254
- h("div", { class: "scrollable-wrapper", ref: el => (this.scrollWrapperElement = el) }, this.shadowY && h("div", { class: "shadow-top" }), this.shadowX && h("div", { class: "shadow-left" }), this.shadowX && h("div", { class: "shadow-right" }), this.shadowY && h("div", { class: "shadow-bottom" })),
4350
+ h("div", { class: "scrollable-wrapper", ref: el => (this.scrollWrapperElement = el) }, !this.noShadowY && h("div", { class: "shadow-top" }), !this.noShadowX && h("div", { class: "shadow-left" }), !this.noShadowX && h("div", { class: "shadow-right" }), !this.noShadowY && h("div", { class: "shadow-bottom" })),
4255
4351
  h("div", { ref: el => (this.scrollElement = el), class: {
4256
4352
  'scrollable-content': true,
4257
- 'scroll-x': this.overflowX,
4258
- 'scroll-y': this.overflowY,
4259
- 'no-overscroll': !this.overscroll
4353
+ 'scroll-x': !this.noOverflowX,
4354
+ 'scroll-y': !this.noOverflowY,
4355
+ 'no-overscroll': this.noOverscroll
4260
4356
  } }, h("slot", null))
4261
4357
  ];
4262
4358
  }
@@ -4366,6 +4462,107 @@ const CatSpinner = class {
4366
4462
  };
4367
4463
  CatSpinner.style = catSpinnerCss;
4368
4464
 
4465
+ const catTabCss = ":host{display:block}:host([hidden]){display:none}";
4466
+
4467
+ let nextUniqueId$2 = 0;
4468
+ const CatTab = class {
4469
+ constructor(hostRef) {
4470
+ registerInstance(this, hostRef);
4471
+ this.tabClick = createEvent(this, "tabClick", 7);
4472
+ /**
4473
+ * The label of the tab.
4474
+ */
4475
+ this.label = '';
4476
+ /**
4477
+ * Hide the actual button content and only display the tab.
4478
+ */
4479
+ this.iconOnly = false;
4480
+ /**
4481
+ * Display the icon on the right.
4482
+ */
4483
+ this.iconRight = false;
4484
+ /**
4485
+ * Specifies that the tab should be deactivated.
4486
+ */
4487
+ this.deactivated = false;
4488
+ }
4489
+ connectedCallback() {
4490
+ if (!this.hostElement.id) {
4491
+ this.hostElement.id = `cat-tab-${nextUniqueId$2++}`;
4492
+ }
4493
+ }
4494
+ onClick(event) {
4495
+ this.tabClick.emit(event);
4496
+ }
4497
+ render() {
4498
+ return h(Host, null);
4499
+ }
4500
+ get hostElement() { return getElement(this); }
4501
+ };
4502
+ CatTab.style = catTabCss;
4503
+
4504
+ const catTabsCss = ":host{display:flex;flex-direction:row;box-shadow:inset 0 -1px 0 0 #d7dbe0}:host([hidden]){display:none}:host([tabs-align=center]){justify-content:center}:host([tabs-align=right]){justify-content:end}:host([tabs-align=justify]) cat-button{flex:1 0 auto}.tab{padding:0.5rem}.tab.tab-active{box-shadow:inset 0 -3px 0 0 #207f8a}";
4505
+
4506
+ const CatTabs = class {
4507
+ constructor(hostRef) {
4508
+ registerInstance(this, hostRef);
4509
+ this.tabs = [];
4510
+ this.buttons = [];
4511
+ /**
4512
+ * The ID of the active tab.
4513
+ */
4514
+ this.activeTab = '';
4515
+ /**
4516
+ * The alignment of the tabs.
4517
+ */
4518
+ this.tabsAlign = 'left';
4519
+ }
4520
+ onActiveTabChanged(newActiveTab) {
4521
+ const activeTab = this.tabs.find(value => value.id === newActiveTab);
4522
+ activeTab === null || activeTab === void 0 ? void 0 : activeTab.click();
4523
+ }
4524
+ componentWillLoad() {
4525
+ this.tabs = Array.from(this.hostElement.querySelectorAll('cat-tab'));
4526
+ if (this.tabs.length) {
4527
+ this.activeTabId = this.activeTab;
4528
+ }
4529
+ }
4530
+ onKeydown(event) {
4531
+ var _a;
4532
+ if (['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft'].includes(event.key)) {
4533
+ const targetElements = this.buttons.filter(button => !button.disabled);
4534
+ const activeElement = (_a = this.hostElement.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement;
4535
+ const activeIdx = activeElement ? targetElements.indexOf(activeElement) : -1;
4536
+ const activeOff = ['ArrowDown', 'ArrowRight'].includes(event.key) ? 1 : -1;
4537
+ const targetIdx = activeIdx < 0 ? 0 : (activeIdx + activeOff + targetElements.length) % targetElements.length;
4538
+ targetElements[targetIdx].setFocus();
4539
+ event.preventDefault();
4540
+ }
4541
+ }
4542
+ render() {
4543
+ return (h(Host, null, this.tabs.map((tab) => {
4544
+ return (h("cat-button", { ref: el => el && this.updateButtonsRef(el), buttonId: tab.id, role: "tab", part: "tab", class: {
4545
+ tab: true,
4546
+ 'tab-active': Boolean(this.activeTabId && tab.id === this.activeTabId)
4547
+ }, color: this.activeTabId && tab.id === this.activeTabId ? 'primary' : 'secondary', variant: "text", icon: tab.icon, iconOnly: tab.iconOnly, iconRight: tab.iconRight, url: tab.url, disabled: tab.deactivated, urlTarget: tab.urlTarget, onCatClick: () => (this.activeTabId = tab.id) }, tab.label));
4548
+ })));
4549
+ }
4550
+ updateButtonsRef(button) {
4551
+ const indexOf = this.buttons.indexOf(button);
4552
+ if (indexOf >= 0) {
4553
+ this.buttons[indexOf] = button;
4554
+ }
4555
+ else {
4556
+ this.buttons.push(button);
4557
+ }
4558
+ }
4559
+ get hostElement() { return getElement(this); }
4560
+ static get watchers() { return {
4561
+ "activeTabId": ["onActiveTabChanged"]
4562
+ }; }
4563
+ };
4564
+ CatTabs.style = catTabsCss;
4565
+
4369
4566
  const catToastDemoCss = ":host{display:block}";
4370
4567
 
4371
4568
  const CatToastDemo = class {
@@ -4409,7 +4606,7 @@ const CatToastDemo = class {
4409
4606
  };
4410
4607
  CatToastDemo.style = catToastDemoCss;
4411
4608
 
4412
- const catToggleCss = ":host{display:flex;margin-bottom:1rem}:host([hidden]){display:none}label{flex:0 1 auto;display:flex;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;-webkit-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}input{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.toggle{flex:0 0 auto;display:flex;align-items:center;justify-content:center;position:relative;width:2rem;height:1.25rem;border-radius:10rem;background-color:#d7dbe0;transition:background-color 0.13s ease}:checked+.toggle{background-color:rgb(var(--cat-primary-bg, 32, 127, 138))}:focus-visible+.toggle{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255));outline-offset:1px}.toggle::after{content:\"\";position:absolute;width:1rem;height:1rem;background:#fff;border-radius:10rem;transform:translateX(calc(2px - 0.5rem));transition:transform 0.13s linear;box-shadow:0 1px 4px 0 rgba(16, 29, 48, 0.2)}:checked+.toggle::after{transform:translateX(calc(-2px + 0.5rem))}.label{flex:1 1 auto}.is-hidden .label{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.is-disabled{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}";
4609
+ const catToggleCss = ".hint-section{display:flex;gap:0.5rem;flex-direction:column}.hint-section .input-hint,.hint-section ::slotted([slot=hint]){font-size:0.875rem;line-height:1rem;margin:0}:host{display:flex;flex-direction:column;gap:0.5rem;margin-bottom:1rem}:host([hidden]){display:none}label{flex:0 1 auto;display:flex;gap:0.5rem;font-size:0.9375rem;line-height:1.25rem;-webkit-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}input{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.toggle{flex:0 0 auto;display:flex;align-items:center;justify-content:center;position:relative;width:2rem;height:1.25rem;border-radius:10rem;background-color:#d7dbe0;transition:background-color 0.13s ease}:checked+.toggle{background-color:rgb(var(--cat-primary-bg, 32, 127, 138))}:focus-visible+.toggle{outline:2px solid rgb(var(--cat-border-color-focus, 0, 113, 255));outline-offset:1px}.toggle::after{content:\"\";position:absolute;width:1rem;height:1rem;background:#fff;border-radius:10rem;transform:translateX(calc(2px - 0.5rem));transition:transform 0.13s linear;box-shadow:0 1px 4px 0 rgba(16, 29, 48, 0.2)}:checked+.toggle::after{transform:translateX(calc(-2px + 0.5rem))}.label{flex:1 1 auto}.is-hidden .label{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.is-disabled{cursor:not-allowed;color:rgb(var(--cat-font-color-muted, 105, 118, 135))}";
4413
4610
 
4414
4611
  let nextUniqueId$1 = 0;
4415
4612
  const CatToggle = class {
@@ -4419,6 +4616,7 @@ const CatToggle = class {
4419
4616
  this.catFocus = createEvent(this, "catFocus", 7);
4420
4617
  this.catBlur = createEvent(this, "catBlur", 7);
4421
4618
  this.id = `cat-toggle-${nextUniqueId$1++}`;
4619
+ this.hasSlottedLabel = false;
4422
4620
  /**
4423
4621
  * Checked state of the toggle.
4424
4622
  */
@@ -4441,7 +4639,7 @@ const CatToggle = class {
4441
4639
  this.required = false;
4442
4640
  }
4443
4641
  componentWillRender() {
4444
- if (!this.label) {
4642
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
4445
4643
  loglevel.error('[A11y] Missing ARIA label on toggle', this);
4446
4644
  }
4447
4645
  }
@@ -4455,9 +4653,14 @@ const CatToggle = class {
4455
4653
  this.input.focus(options);
4456
4654
  }
4457
4655
  render() {
4458
- return (h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, h("input", { ref: el => (this.input = el), id: this.id, type: "checkbox", name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, class: "form-check-input", role: "switch", onInput: this.onInput.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), h("span", { class: "toggle", part: "toggle" }), h("span", { class: "label", part: "label" }, this.label)));
4656
+ return (h(Host, null, h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, h("input", { ref: el => (this.input = el), id: this.id, type: "checkbox", name: this.name, value: this.value, checked: this.checked, required: this.required, disabled: this.disabled, class: "form-check-input", role: "switch", onInput: this.onInput.bind(this), onFocus: this.onFocus.bind(this), onBlur: this.onBlur.bind(this) }), h("span", { class: "toggle", part: "toggle" }), h("span", { class: "label", part: "label" }, (this.hasSlottedLabel && h("slot", { name: "label" })) || this.label)), this.hintSection));
4657
+ }
4658
+ get hintSection() {
4659
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
4660
+ return ((this.hint || hasSlottedHint) && (h(CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && h("slot", { name: "hint" }) })));
4459
4661
  }
4460
4662
  onInput(event) {
4663
+ this.value = this.input.value;
4461
4664
  this.catChange.emit(event);
4462
4665
  }
4463
4666
  onFocus(event) {
@@ -4466,6 +4669,7 @@ const CatToggle = class {
4466
4669
  onBlur(event) {
4467
4670
  this.catBlur.emit(event);
4468
4671
  }
4672
+ get hostElement() { return getElement(this); }
4469
4673
  };
4470
4674
  CatToggle.style = catToggleCss;
4471
4675
 
@@ -4517,6 +4721,7 @@ const CatTooltip = class {
4517
4721
  autoUpdate(this.trigger, this.tooltip, () => this.update());
4518
4722
  }
4519
4723
  if (isTouchDevice) {
4724
+ window.addEventListener('touchstart', this.windowTouchStartListener.bind(this));
4520
4725
  (_b = this.trigger) === null || _b === void 0 ? void 0 : _b.addEventListener('touchstart', this.touchStartListener.bind(this));
4521
4726
  (_c = this.trigger) === null || _c === void 0 ? void 0 : _c.addEventListener('touchend', this.touchEndListener.bind(this));
4522
4727
  }
@@ -4530,6 +4735,7 @@ const CatTooltip = class {
4530
4735
  disconnectedCallback() {
4531
4736
  var _a, _b, _c, _d, _e, _f;
4532
4737
  if (isTouchDevice) {
4738
+ window.removeEventListener('touchstart', this.windowTouchStartListener.bind(this));
4533
4739
  (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.removeEventListener('touchstart', this.touchStartListener.bind(this));
4534
4740
  (_b = this.trigger) === null || _b === void 0 ? void 0 : _b.removeEventListener('touchend', this.touchEndListener.bind(this));
4535
4741
  }
@@ -4564,34 +4770,37 @@ const CatTooltip = class {
4564
4770
  showListener() {
4565
4771
  window.clearTimeout(this.hideTimeout);
4566
4772
  this.showTimeout = window.setTimeout(() => {
4567
- var _a, _b;
4568
- (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.focus();
4569
- (_b = this.tooltip) === null || _b === void 0 ? void 0 : _b.classList.add('tooltip-show');
4773
+ var _a;
4774
+ (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.add('tooltip-show');
4570
4775
  }, this.showDelay);
4571
4776
  }
4572
4777
  hideListener() {
4573
4778
  window.clearTimeout(this.showTimeout);
4574
4779
  this.hideTimeout = window.setTimeout(() => {
4575
- var _a, _b;
4576
- (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.blur();
4577
- (_b = this.tooltip) === null || _b === void 0 ? void 0 : _b.classList.remove('tooltip-show');
4780
+ var _a;
4781
+ (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.remove('tooltip-show');
4578
4782
  }, this.hideDelay);
4579
4783
  }
4580
- touchStartListener() {
4784
+ touchStartListener(event) {
4785
+ event.stopPropagation();
4581
4786
  this.touchTimeout = window.setTimeout(() => {
4582
4787
  var _a;
4583
4788
  (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.add('tooltip-show');
4584
4789
  }, this.longTouchDuration);
4585
4790
  }
4586
4791
  touchEndListener() {
4792
+ if (this.touchTimeout) {
4793
+ window.clearTimeout(this.touchTimeout);
4794
+ }
4795
+ }
4796
+ windowTouchStartListener() {
4587
4797
  var _a;
4588
- window.clearTimeout(this.touchTimeout);
4589
4798
  (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.remove('tooltip-show');
4590
4799
  }
4591
4800
  };
4592
4801
  CatTooltip.OFFSET = 4;
4593
4802
  CatTooltip.style = catTooltipCss;
4594
4803
 
4595
- export { CatAlert as cat_alert, CatBadge as cat_badge, CatButton as cat_button, CatCard as cat_card, CatCheckbox as cat_checkbox, CatIcon as cat_icon, CatInput as cat_input, CatMenu as cat_menu, CatRadio as cat_radio, CatScrollable as cat_scrollable, CatSkeleton as cat_skeleton, CatSpinner as cat_spinner, CatToastDemo as cat_toast_demo, CatToggle as cat_toggle, CatTooltip as cat_tooltip };
4804
+ export { CatAlert as cat_alert, CatAvatar as cat_avatar, CatBadge as cat_badge, CatButton as cat_button, CatCard as cat_card, CatCheckbox as cat_checkbox, CatIcon as cat_icon, CatInput as cat_input, CatMenu as cat_menu, CatRadio as cat_radio, CatScrollable as cat_scrollable, CatSkeleton as cat_skeleton, CatSpinner as cat_spinner, CatTab as cat_tab, CatTabs as cat_tabs, CatToastDemo as cat_toast_demo, CatToggle as cat_toggle, CatTooltip as cat_tooltip };
4596
4805
 
4597
- //# sourceMappingURL=cat-alert_15.entry.js.map
4806
+ //# sourceMappingURL=cat-alert_18.entry.js.map