@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
@@ -2,8 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const index = require('./index-5d72f0e4.js');
5
+ const index = require('./index-499bad41.js');
6
6
  const loglevel = require('./loglevel-c9b2d01f.js');
7
+ const catFormHint = require('./cat-form-hint-93a6936b.js');
7
8
  const catIconRegistry = require('./cat-icon-registry-49b11b51.js');
8
9
  const catNotification = require('./cat-notification-156f4cf5.js');
9
10
 
@@ -35,7 +36,92 @@ const CatAlert = class {
35
36
  };
36
37
  CatAlert.style = catAlertCss;
37
38
 
38
- 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)}}";
39
+ /**
40
+ * Loads an image and wraps the result in a promise.
41
+ *
42
+ * @param src the image URL
43
+ * @returns a promise
44
+ */
45
+ const loadImg = (src) => {
46
+ return new Promise((resolve, reject) => {
47
+ const image = new Image();
48
+ image.addEventListener('load', resolve);
49
+ image.addEventListener('error', reject);
50
+ image.src = src;
51
+ });
52
+ };
53
+
54
+ 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)}";
55
+
56
+ const CatAvatar = class {
57
+ constructor(hostRef) {
58
+ index.registerInstance(this, hostRef);
59
+ /**
60
+ * The size of the avatar.
61
+ */
62
+ this.size = 'm';
63
+ /**
64
+ * Use round avatar edges.
65
+ */
66
+ this.round = false;
67
+ /**
68
+ * The label of the avatar.
69
+ */
70
+ this.label = '';
71
+ }
72
+ onSrcChanged(value) {
73
+ if (value) {
74
+ loadImg(value).then(() => (this.backgroundImage = `url(${value})`), () => (this.backgroundImage = undefined));
75
+ }
76
+ else {
77
+ this.backgroundImage = undefined;
78
+ }
79
+ }
80
+ componentWillLoad() {
81
+ this.onSrcChanged(this.src);
82
+ }
83
+ componentWillRender() {
84
+ if (!this.label) {
85
+ loglevel.loglevel.warn('[A11y] Missing ARIA label on avatar', this);
86
+ }
87
+ }
88
+ render() {
89
+ if (this.url) {
90
+ return (index.h("a", { href: this.url, target: this.urlTarget, style: this.cssStyle, class: this.cssClass, "aria-label": this.label }, this.content));
91
+ }
92
+ else {
93
+ return (index.h("span", { style: this.cssStyle, class: this.cssClass, "aria-label": this.label }, this.content));
94
+ }
95
+ }
96
+ get content() {
97
+ return !this.backgroundImage
98
+ ? [this.icon ? index.h("cat-icon", { icon: this.icon, size: this.size }) : this.getInitials()]
99
+ : [];
100
+ }
101
+ get cssStyle() {
102
+ return { 'background-image': this.backgroundImage };
103
+ }
104
+ get cssClass() {
105
+ return {
106
+ avatar: true,
107
+ 'avatar-round': this.round,
108
+ [`avatar-${this.size}`]: Boolean(this.size)
109
+ };
110
+ }
111
+ getInitials() {
112
+ var _a;
113
+ return ((_a = this.initials) !== null && _a !== void 0 ? _a : this.label
114
+ .split(' ')
115
+ .map(n => n[0])
116
+ .join(''));
117
+ }
118
+ static get watchers() { return {
119
+ "src": ["onSrcChanged"]
120
+ }; }
121
+ };
122
+ CatAvatar.style = catAvatarCss;
123
+
124
+ 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)}}";
39
125
 
40
126
  const CatBadge = class {
41
127
  constructor(hostRef) {
@@ -230,9 +316,9 @@ const CatButton = class {
230
316
  */
231
317
  this.submit = false;
232
318
  /**
233
- * Ellipse overflowing button content.
319
+ * Disables ellipse overflowing button content.
234
320
  */
235
- this.ellipsed = true;
321
+ this.noEllipsis = false;
236
322
  /**
237
323
  * Use round button edges.
238
324
  */
@@ -297,7 +383,7 @@ const CatButton = class {
297
383
  'cat-button-round': this.round,
298
384
  'cat-button-loading': this.loading,
299
385
  'cat-button-disabled': this.disabled,
300
- 'cat-button-ellipsed': this.ellipsed && !this.isIconButton,
386
+ 'cat-button-ellipsed': !this.noEllipsis && !this.isIconButton,
301
387
  [`cat-button-${this.variant}`]: Boolean(this.variant),
302
388
  [`cat-button-${this.color}`]: Boolean(this.color),
303
389
  [`cat-button-${this.size}`]: Boolean(this.size)
@@ -311,7 +397,7 @@ const CatButton = class {
311
397
  'cat-button-round': (_a = this.round) !== null && _a !== void 0 ? _a : this.isIconButton,
312
398
  'cat-button-loading': this.loading,
313
399
  'cat-button-disabled': this.disabled,
314
- 'cat-button-ellipsed': this.ellipsed && !this.isIconButton,
400
+ 'cat-button-ellipsed': !this.noEllipsis && !this.isIconButton,
315
401
  [`cat-button-${this.variant}`]: Boolean(this.variant),
316
402
  [`cat-button-${this.color}`]: Boolean(this.color),
317
403
  [`cat-button-${this.size}`]: Boolean(this.size)
@@ -378,16 +464,17 @@ const CatCard = class {
378
464
  };
379
465
  CatCard.style = catCardCss;
380
466
 
381
- 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))}";
467
+ 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))}";
382
468
 
383
- let nextUniqueId$5 = 0;
469
+ let nextUniqueId$6 = 0;
384
470
  const CatCheckbox = class {
385
471
  constructor(hostRef) {
386
472
  index.registerInstance(this, hostRef);
387
473
  this.catChange = index.createEvent(this, "catChange", 7);
388
474
  this.catFocus = index.createEvent(this, "catFocus", 7);
389
475
  this.catBlur = index.createEvent(this, "catBlur", 7);
390
- this.id = `cat-checkbox-${nextUniqueId$5++}`;
476
+ this.id = `cat-checkbox-${nextUniqueId$6++}`;
477
+ this.hasSlottedLabel = false;
391
478
  /**
392
479
  * Checked state of the checkbox
393
480
  */
@@ -419,7 +506,7 @@ const CatCheckbox = class {
419
506
  }
420
507
  }
421
508
  componentWillRender() {
422
- if (!this.label) {
509
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
423
510
  loglevel.loglevel.error('[A11y] Missing ARIA label on checkbox', this);
424
511
  }
425
512
  }
@@ -433,9 +520,14 @@ const CatCheckbox = class {
433
520
  this.input.focus(options);
434
521
  }
435
522
  render() {
436
- return (index.h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, index.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) }), index.h("span", { class: "box", "aria-hidden": "true", part: "checkbox" }, index.h("svg", { class: "check", viewBox: "0 0 12 10" }, index.h("polyline", { points: "1.5 6 4.5 9 10.5 1" })), index.h("svg", { class: "dash", viewBox: "0 0 12 10" }, index.h("polyline", { points: "1.5 5 10.5 5" }))), index.h("span", { class: "label", part: "label" }, this.label)));
523
+ return (index.h(index.Host, null, index.h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, index.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) }), index.h("span", { class: "box", "aria-hidden": "true", part: "checkbox" }, index.h("svg", { class: "check", viewBox: "0 0 12 10" }, index.h("polyline", { points: "1.5 6 4.5 9 10.5 1" })), index.h("svg", { class: "dash", viewBox: "0 0 12 10" }, index.h("polyline", { points: "1.5 5 10.5 5" }))), index.h("span", { class: "label", part: "label" }, (this.hasSlottedLabel && index.h("slot", { name: "label" })) || this.label)), this.hintSection));
524
+ }
525
+ get hintSection() {
526
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
527
+ return ((this.hint || hasSlottedHint) && (index.h(catFormHint.CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && index.h("slot", { name: "hint" }) })));
437
528
  }
438
529
  onInput(event) {
530
+ this.value = this.input.value;
439
531
  this.catChange.emit(event);
440
532
  }
441
533
  onFocus(event) {
@@ -444,6 +536,7 @@ const CatCheckbox = class {
444
536
  onBlur(event) {
445
537
  this.catBlur.emit(event);
446
538
  }
539
+ get hostElement() { return index.getElement(this); }
447
540
  };
448
541
  CatCheckbox.style = catCheckboxCss;
449
542
 
@@ -471,9 +564,9 @@ const CatIcon = class {
471
564
  };
472
565
  CatIcon.style = catIconCss;
473
566
 
474
- 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}";
567
+ 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}";
475
568
 
476
- let nextUniqueId$4 = 0;
569
+ let nextUniqueId$5 = 0;
477
570
  const CatInput = class {
478
571
  constructor(hostRef) {
479
572
  index.registerInstance(this, hostRef);
@@ -481,8 +574,8 @@ const CatInput = class {
481
574
  this.catFocus = index.createEvent(this, "catFocus", 7);
482
575
  this.catBlur = index.createEvent(this, "catBlur", 7);
483
576
  this.i18n = catIconRegistry.CatI18nRegistry.getInstance();
484
- this.id = `cat-input-${nextUniqueId$4++}`;
485
- this.inputValue = '';
577
+ this.id = `cat-input-${nextUniqueId$5++}`;
578
+ this.hasSlottedLabel = false;
486
579
  /**
487
580
  * Whether the input should show a clear button.
488
581
  */
@@ -524,14 +617,8 @@ const CatInput = class {
524
617
  */
525
618
  this.type = 'text';
526
619
  }
527
- onValueChange(value) {
528
- this.inputValue = '' + (value !== null && value !== void 0 ? value : '');
529
- }
530
- componentWillLoad() {
531
- this.onValueChange(this.value);
532
- }
533
620
  componentWillRender() {
534
- if (!this.label) {
621
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
535
622
  loglevel.loglevel.error('[A11y] Missing ARIA label on input', this);
536
623
  }
537
624
  }
@@ -548,19 +635,23 @@ const CatInput = class {
548
635
  * Clear the input.
549
636
  */
550
637
  async clear() {
551
- this.inputValue = '';
638
+ this.value = '';
552
639
  }
553
640
  render() {
554
- return (index.h(index.Host, null, this.label && (index.h("label", { htmlFor: this.id, class: { hidden: this.labelHidden } }, index.h("span", { part: "label" }, this.label, !this.required && (index.h("span", { class: "input-optional", "aria-hidden": "true" }, "(", this.i18n.getMessage('input.optional'), ")"))))), index.h("div", { class: {
641
+ return (index.h(index.Host, null, (this.hasSlottedLabel || this.label) && (index.h("label", { htmlFor: this.id, class: { hidden: this.labelHidden } }, index.h("span", { part: "label" }, (this.hasSlottedLabel && index.h("slot", { name: "label" })) || this.label, !this.required && (index.h("span", { class: "input-optional", "aria-hidden": "true" }, "(", this.i18n.getMessage('input.optional'), ")"))))), index.h("div", { class: {
555
642
  'input-wrapper': true,
556
643
  'input-round': this.round,
557
644
  'input-disabled': this.disabled
558
645
  }, onClick: () => this.input.focus() }, this.textPrefix && (index.h("span", { class: "text-prefix", part: "prefix" }, this.textPrefix)), this.icon && !this.iconRight && index.h("cat-icon", { icon: this.icon, class: "icon-prefix", size: "l" }), index.h("div", { class: "input-inner-wrapper" }, index.h("input", { ref: el => (this.input = el), id: this.id, class: {
559
646
  'has-clearable': this.clearable && !this.disabled
560
- }, 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 && (index.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 && index.h("cat-icon", { icon: this.icon, class: "icon-suffix", size: "l" }), this.textSuffix && (index.h("span", { class: "text-suffix", part: "suffix" }, this.textSuffix))), this.hint && index.h("p", { class: "input-hint" }, this.hint)));
647
+ }, 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 && (index.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 && index.h("cat-icon", { icon: this.icon, class: "icon-suffix", size: "l" }), this.textSuffix && (index.h("span", { class: "text-suffix", part: "suffix" }, this.textSuffix))), this.hintSection));
648
+ }
649
+ get hintSection() {
650
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
651
+ return ((this.hint || hasSlottedHint) && (index.h(catFormHint.CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && index.h("slot", { name: "hint" }) })));
561
652
  }
562
653
  onInput(event) {
563
- this.inputValue = this.input.value;
654
+ this.value = this.input.value;
564
655
  this.catChange.emit(event);
565
656
  }
566
657
  onFocus(event) {
@@ -569,9 +660,7 @@ const CatInput = class {
569
660
  onBlur(event) {
570
661
  this.catBlur.emit(event);
571
662
  }
572
- static get watchers() { return {
573
- "value": ["onValueChange"]
574
- }; }
663
+ get hostElement() { return index.getElement(this); }
575
664
  };
576
665
  CatInput.style = catInputCss;
577
666
 
@@ -2810,13 +2899,13 @@ const firstTabbable = (container) => {
2810
2899
 
2811
2900
  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}";
2812
2901
 
2813
- let nextUniqueId$3 = 0;
2902
+ let nextUniqueId$4 = 0;
2814
2903
  const CatMenu = class {
2815
2904
  constructor(hostRef) {
2816
2905
  index.registerInstance(this, hostRef);
2817
2906
  this.catOpen = index.createEvent(this, "catOpen", 7);
2818
2907
  this.catClose = index.createEvent(this, "catClose", 7);
2819
- this.id = nextUniqueId$3++;
2908
+ this.id = nextUniqueId$4++;
2820
2909
  /**
2821
2910
  * The placement of the menu.
2822
2911
  */
@@ -2911,16 +3000,17 @@ const CatMenu = class {
2911
3000
  CatMenu.OFFSET = 4;
2912
3001
  CatMenu.style = catMenuCss;
2913
3002
 
2914
- 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}";
3003
+ 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}";
2915
3004
 
2916
- let nextUniqueId$2 = 0;
3005
+ let nextUniqueId$3 = 0;
2917
3006
  const CatRadio = class {
2918
3007
  constructor(hostRef) {
2919
3008
  index.registerInstance(this, hostRef);
2920
3009
  this.catChange = index.createEvent(this, "catChange", 7);
2921
3010
  this.catFocus = index.createEvent(this, "catFocus", 7);
2922
3011
  this.catBlur = index.createEvent(this, "catBlur", 7);
2923
- this.id = `cat-radio-${++nextUniqueId$2}`;
3012
+ this.id = `cat-radio-${++nextUniqueId$3}`;
3013
+ this.hasSlottedLabel = false;
2924
3014
  /**
2925
3015
  * Whether this radio is checked.
2926
3016
  */
@@ -2943,7 +3033,7 @@ const CatRadio = class {
2943
3033
  this.required = false;
2944
3034
  }
2945
3035
  componentWillRender() {
2946
- if (!this.label) {
3036
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
2947
3037
  loglevel.loglevel.error('[A11y] Missing ARIA label on radio', this);
2948
3038
  }
2949
3039
  }
@@ -2957,9 +3047,14 @@ const CatRadio = class {
2957
3047
  this.input.focus(options);
2958
3048
  }
2959
3049
  render() {
2960
- return (index.h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, index.h("span", { class: "radio" }, index.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) }), index.h("span", { class: "circle" })), index.h("span", { class: "label", part: "label" }, this.label)));
3050
+ return (index.h(index.Host, null, index.h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, index.h("span", { class: "radio" }, index.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) }), index.h("span", { class: "circle" })), index.h("span", { class: "label", part: "label" }, (this.hasSlottedLabel && index.h("slot", { name: "label" })) || this.label)), this.hintSection));
3051
+ }
3052
+ get hintSection() {
3053
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
3054
+ return ((this.hint || hasSlottedHint) && (index.h(catFormHint.CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && index.h("slot", { name: "hint" }) })));
2961
3055
  }
2962
3056
  onChange(event) {
3057
+ this.value = this.input.value;
2963
3058
  this.catChange.emit(event);
2964
3059
  }
2965
3060
  onFocus(event) {
@@ -2968,6 +3063,7 @@ const CatRadio = class {
2968
3063
  onBlur(event) {
2969
3064
  this.catBlur.emit(event);
2970
3065
  }
3066
+ get hostElement() { return index.getElement(this); }
2971
3067
  };
2972
3068
  CatRadio.style = catRadioCss;
2973
3069
 
@@ -4202,20 +4298,20 @@ const CatScrollable = class {
4202
4298
  this.scrolledBottom = index.createEvent(this, "scrolledBottom", 7);
4203
4299
  this.init = new Subject();
4204
4300
  this.destroyed = new Subject();
4205
- /** Flags to enable/disable scroll shadowX. */
4206
- this.shadowX = true;
4207
- /** Flags to enable/disable scroll shadowY. */
4208
- this.shadowY = true;
4209
- /** Flags to enable/disable overflowX. */
4210
- this.overflowX = true;
4211
- /** Flags to enable/disable overflowY. */
4212
- this.overflowY = true;
4213
- /** Flag to enable/disable overscroll behavior. */
4214
- this.overscroll = true;
4301
+ /** Flags to disable/enable scroll shadowX. */
4302
+ this.noShadowX = false;
4303
+ /** Flags to disable/enable scroll shadowY. */
4304
+ this.noShadowY = false;
4305
+ /** Flags to disable/enable overflowX. */
4306
+ this.noOverflowX = false;
4307
+ /** Flags to disable/enable overflowY. */
4308
+ this.noOverflowY = false;
4309
+ /** Flag to disable/enable overscroll behavior. */
4310
+ this.noOverscroll = false;
4215
4311
  /**
4216
- * Flag to fire an initial event after content initialization.
4312
+ * Flag to not fire an initial event after content initialization.
4217
4313
  */
4218
- this.scrolledInit = true;
4314
+ this.noScrolledInit = false;
4219
4315
  /**
4220
4316
  * Buffer to be used to calculate the scroll distance.
4221
4317
  */
@@ -4244,7 +4340,7 @@ const CatScrollable = class {
4244
4340
  });
4245
4341
  }
4246
4342
  componentDidLoad() {
4247
- if (this.scrolledInit) {
4343
+ if (!this.noScrolledInit) {
4248
4344
  this.init.next();
4249
4345
  }
4250
4346
  }
@@ -4255,12 +4351,12 @@ const CatScrollable = class {
4255
4351
  }
4256
4352
  render() {
4257
4353
  return [
4258
- index.h("div", { class: "scrollable-wrapper", ref: el => (this.scrollWrapperElement = el) }, this.shadowY && index.h("div", { class: "shadow-top" }), this.shadowX && index.h("div", { class: "shadow-left" }), this.shadowX && index.h("div", { class: "shadow-right" }), this.shadowY && index.h("div", { class: "shadow-bottom" })),
4354
+ index.h("div", { class: "scrollable-wrapper", ref: el => (this.scrollWrapperElement = el) }, !this.noShadowY && index.h("div", { class: "shadow-top" }), !this.noShadowX && index.h("div", { class: "shadow-left" }), !this.noShadowX && index.h("div", { class: "shadow-right" }), !this.noShadowY && index.h("div", { class: "shadow-bottom" })),
4259
4355
  index.h("div", { ref: el => (this.scrollElement = el), class: {
4260
4356
  'scrollable-content': true,
4261
- 'scroll-x': this.overflowX,
4262
- 'scroll-y': this.overflowY,
4263
- 'no-overscroll': !this.overscroll
4357
+ 'scroll-x': !this.noOverflowX,
4358
+ 'scroll-y': !this.noOverflowY,
4359
+ 'no-overscroll': this.noOverscroll
4264
4360
  } }, index.h("slot", null))
4265
4361
  ];
4266
4362
  }
@@ -4370,6 +4466,107 @@ const CatSpinner = class {
4370
4466
  };
4371
4467
  CatSpinner.style = catSpinnerCss;
4372
4468
 
4469
+ const catTabCss = ":host{display:block}:host([hidden]){display:none}";
4470
+
4471
+ let nextUniqueId$2 = 0;
4472
+ const CatTab = class {
4473
+ constructor(hostRef) {
4474
+ index.registerInstance(this, hostRef);
4475
+ this.tabClick = index.createEvent(this, "tabClick", 7);
4476
+ /**
4477
+ * The label of the tab.
4478
+ */
4479
+ this.label = '';
4480
+ /**
4481
+ * Hide the actual button content and only display the tab.
4482
+ */
4483
+ this.iconOnly = false;
4484
+ /**
4485
+ * Display the icon on the right.
4486
+ */
4487
+ this.iconRight = false;
4488
+ /**
4489
+ * Specifies that the tab should be deactivated.
4490
+ */
4491
+ this.deactivated = false;
4492
+ }
4493
+ connectedCallback() {
4494
+ if (!this.hostElement.id) {
4495
+ this.hostElement.id = `cat-tab-${nextUniqueId$2++}`;
4496
+ }
4497
+ }
4498
+ onClick(event) {
4499
+ this.tabClick.emit(event);
4500
+ }
4501
+ render() {
4502
+ return index.h(index.Host, null);
4503
+ }
4504
+ get hostElement() { return index.getElement(this); }
4505
+ };
4506
+ CatTab.style = catTabCss;
4507
+
4508
+ 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}";
4509
+
4510
+ const CatTabs = class {
4511
+ constructor(hostRef) {
4512
+ index.registerInstance(this, hostRef);
4513
+ this.tabs = [];
4514
+ this.buttons = [];
4515
+ /**
4516
+ * The ID of the active tab.
4517
+ */
4518
+ this.activeTab = '';
4519
+ /**
4520
+ * The alignment of the tabs.
4521
+ */
4522
+ this.tabsAlign = 'left';
4523
+ }
4524
+ onActiveTabChanged(newActiveTab) {
4525
+ const activeTab = this.tabs.find(value => value.id === newActiveTab);
4526
+ activeTab === null || activeTab === void 0 ? void 0 : activeTab.click();
4527
+ }
4528
+ componentWillLoad() {
4529
+ this.tabs = Array.from(this.hostElement.querySelectorAll('cat-tab'));
4530
+ if (this.tabs.length) {
4531
+ this.activeTabId = this.activeTab;
4532
+ }
4533
+ }
4534
+ onKeydown(event) {
4535
+ var _a;
4536
+ if (['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft'].includes(event.key)) {
4537
+ const targetElements = this.buttons.filter(button => !button.disabled);
4538
+ const activeElement = (_a = this.hostElement.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement;
4539
+ const activeIdx = activeElement ? targetElements.indexOf(activeElement) : -1;
4540
+ const activeOff = ['ArrowDown', 'ArrowRight'].includes(event.key) ? 1 : -1;
4541
+ const targetIdx = activeIdx < 0 ? 0 : (activeIdx + activeOff + targetElements.length) % targetElements.length;
4542
+ targetElements[targetIdx].setFocus();
4543
+ event.preventDefault();
4544
+ }
4545
+ }
4546
+ render() {
4547
+ return (index.h(index.Host, null, this.tabs.map((tab) => {
4548
+ return (index.h("cat-button", { ref: el => el && this.updateButtonsRef(el), buttonId: tab.id, role: "tab", part: "tab", class: {
4549
+ tab: true,
4550
+ 'tab-active': Boolean(this.activeTabId && tab.id === this.activeTabId)
4551
+ }, 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));
4552
+ })));
4553
+ }
4554
+ updateButtonsRef(button) {
4555
+ const indexOf = this.buttons.indexOf(button);
4556
+ if (indexOf >= 0) {
4557
+ this.buttons[indexOf] = button;
4558
+ }
4559
+ else {
4560
+ this.buttons.push(button);
4561
+ }
4562
+ }
4563
+ get hostElement() { return index.getElement(this); }
4564
+ static get watchers() { return {
4565
+ "activeTabId": ["onActiveTabChanged"]
4566
+ }; }
4567
+ };
4568
+ CatTabs.style = catTabsCss;
4569
+
4373
4570
  const catToastDemoCss = ":host{display:block}";
4374
4571
 
4375
4572
  const CatToastDemo = class {
@@ -4413,7 +4610,7 @@ const CatToastDemo = class {
4413
4610
  };
4414
4611
  CatToastDemo.style = catToastDemoCss;
4415
4612
 
4416
- 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))}";
4613
+ 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))}";
4417
4614
 
4418
4615
  let nextUniqueId$1 = 0;
4419
4616
  const CatToggle = class {
@@ -4423,6 +4620,7 @@ const CatToggle = class {
4423
4620
  this.catFocus = index.createEvent(this, "catFocus", 7);
4424
4621
  this.catBlur = index.createEvent(this, "catBlur", 7);
4425
4622
  this.id = `cat-toggle-${nextUniqueId$1++}`;
4623
+ this.hasSlottedLabel = false;
4426
4624
  /**
4427
4625
  * Checked state of the toggle.
4428
4626
  */
@@ -4445,7 +4643,7 @@ const CatToggle = class {
4445
4643
  this.required = false;
4446
4644
  }
4447
4645
  componentWillRender() {
4448
- if (!this.label) {
4646
+ if (!this.label && !this.hostElement.querySelector('[slot="label"]')) {
4449
4647
  loglevel.loglevel.error('[A11y] Missing ARIA label on toggle', this);
4450
4648
  }
4451
4649
  }
@@ -4459,9 +4657,14 @@ const CatToggle = class {
4459
4657
  this.input.focus(options);
4460
4658
  }
4461
4659
  render() {
4462
- return (index.h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, index.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) }), index.h("span", { class: "toggle", part: "toggle" }), index.h("span", { class: "label", part: "label" }, this.label)));
4660
+ return (index.h(index.Host, null, index.h("label", { htmlFor: this.id, class: { 'is-hidden': this.labelHidden, 'is-disabled': this.disabled } }, index.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) }), index.h("span", { class: "toggle", part: "toggle" }), index.h("span", { class: "label", part: "label" }, (this.hasSlottedLabel && index.h("slot", { name: "label" })) || this.label)), this.hintSection));
4661
+ }
4662
+ get hintSection() {
4663
+ const hasSlottedHint = !!this.hostElement.querySelector('[slot="hint"]');
4664
+ return ((this.hint || hasSlottedHint) && (index.h(catFormHint.CatFormHint, { hint: this.hint, slottedHint: hasSlottedHint && index.h("slot", { name: "hint" }) })));
4463
4665
  }
4464
4666
  onInput(event) {
4667
+ this.value = this.input.value;
4465
4668
  this.catChange.emit(event);
4466
4669
  }
4467
4670
  onFocus(event) {
@@ -4470,6 +4673,7 @@ const CatToggle = class {
4470
4673
  onBlur(event) {
4471
4674
  this.catBlur.emit(event);
4472
4675
  }
4676
+ get hostElement() { return index.getElement(this); }
4473
4677
  };
4474
4678
  CatToggle.style = catToggleCss;
4475
4679
 
@@ -4521,6 +4725,7 @@ const CatTooltip = class {
4521
4725
  autoUpdate(this.trigger, this.tooltip, () => this.update());
4522
4726
  }
4523
4727
  if (isTouchDevice) {
4728
+ window.addEventListener('touchstart', this.windowTouchStartListener.bind(this));
4524
4729
  (_b = this.trigger) === null || _b === void 0 ? void 0 : _b.addEventListener('touchstart', this.touchStartListener.bind(this));
4525
4730
  (_c = this.trigger) === null || _c === void 0 ? void 0 : _c.addEventListener('touchend', this.touchEndListener.bind(this));
4526
4731
  }
@@ -4534,6 +4739,7 @@ const CatTooltip = class {
4534
4739
  disconnectedCallback() {
4535
4740
  var _a, _b, _c, _d, _e, _f;
4536
4741
  if (isTouchDevice) {
4742
+ window.removeEventListener('touchstart', this.windowTouchStartListener.bind(this));
4537
4743
  (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.removeEventListener('touchstart', this.touchStartListener.bind(this));
4538
4744
  (_b = this.trigger) === null || _b === void 0 ? void 0 : _b.removeEventListener('touchend', this.touchEndListener.bind(this));
4539
4745
  }
@@ -4568,28 +4774,31 @@ const CatTooltip = class {
4568
4774
  showListener() {
4569
4775
  window.clearTimeout(this.hideTimeout);
4570
4776
  this.showTimeout = window.setTimeout(() => {
4571
- var _a, _b;
4572
- (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.focus();
4573
- (_b = this.tooltip) === null || _b === void 0 ? void 0 : _b.classList.add('tooltip-show');
4777
+ var _a;
4778
+ (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.add('tooltip-show');
4574
4779
  }, this.showDelay);
4575
4780
  }
4576
4781
  hideListener() {
4577
4782
  window.clearTimeout(this.showTimeout);
4578
4783
  this.hideTimeout = window.setTimeout(() => {
4579
- var _a, _b;
4580
- (_a = this.trigger) === null || _a === void 0 ? void 0 : _a.blur();
4581
- (_b = this.tooltip) === null || _b === void 0 ? void 0 : _b.classList.remove('tooltip-show');
4784
+ var _a;
4785
+ (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.remove('tooltip-show');
4582
4786
  }, this.hideDelay);
4583
4787
  }
4584
- touchStartListener() {
4788
+ touchStartListener(event) {
4789
+ event.stopPropagation();
4585
4790
  this.touchTimeout = window.setTimeout(() => {
4586
4791
  var _a;
4587
4792
  (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.add('tooltip-show');
4588
4793
  }, this.longTouchDuration);
4589
4794
  }
4590
4795
  touchEndListener() {
4796
+ if (this.touchTimeout) {
4797
+ window.clearTimeout(this.touchTimeout);
4798
+ }
4799
+ }
4800
+ windowTouchStartListener() {
4591
4801
  var _a;
4592
- window.clearTimeout(this.touchTimeout);
4593
4802
  (_a = this.tooltip) === null || _a === void 0 ? void 0 : _a.classList.remove('tooltip-show');
4594
4803
  }
4595
4804
  };
@@ -4597,6 +4806,7 @@ CatTooltip.OFFSET = 4;
4597
4806
  CatTooltip.style = catTooltipCss;
4598
4807
 
4599
4808
  exports.cat_alert = CatAlert;
4809
+ exports.cat_avatar = CatAvatar;
4600
4810
  exports.cat_badge = CatBadge;
4601
4811
  exports.cat_button = CatButton;
4602
4812
  exports.cat_card = CatCard;
@@ -4608,8 +4818,10 @@ exports.cat_radio = CatRadio;
4608
4818
  exports.cat_scrollable = CatScrollable;
4609
4819
  exports.cat_skeleton = CatSkeleton;
4610
4820
  exports.cat_spinner = CatSpinner;
4821
+ exports.cat_tab = CatTab;
4822
+ exports.cat_tabs = CatTabs;
4611
4823
  exports.cat_toast_demo = CatToastDemo;
4612
4824
  exports.cat_toggle = CatToggle;
4613
4825
  exports.cat_tooltip = CatTooltip;
4614
4826
 
4615
- //# sourceMappingURL=cat-alert_15.cjs.entry.js.map
4827
+ //# sourceMappingURL=cat-alert_18.cjs.entry.js.map