@besaitech/ng-design-system 0.0.56 → 0.0.57

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, input, computed, ChangeDetectionStrategy, Component, booleanAttribute, isDevMode, effect, numberAttribute, output, signal, forwardRef, viewChild, viewChildren, afterRenderEffect, model, ElementRef, Directive, Injector, contentChild, untracked, afterNextRender, TemplateRef, linkedSignal, DestroyRef, Injectable, contentChildren } from '@angular/core';
2
+ import { inject, input, booleanAttribute, computed, ChangeDetectionStrategy, Component, isDevMode, effect, numberAttribute, output, signal, forwardRef, viewChild, viewChildren, afterRenderEffect, model, ElementRef, Directive, Injector, contentChild, untracked, afterNextRender, TemplateRef, linkedSignal, DestroyRef, Injectable, contentChildren } from '@angular/core';
3
3
  import { DomSanitizer } from '@angular/platform-browser';
4
4
  import * as i1 from '@angular/forms';
5
5
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule } from '@angular/forms';
@@ -81,6 +81,13 @@ const SDS_ICONS = {
81
81
  'arrow-up': '<path d="m5 12 7-7 7 7"/><path d="M12 19V5"/>',
82
82
  'arrow-down': '<path d="M12 5v14"/><path d="m19 12-7 7-7-7"/>',
83
83
  'chevrons-up-down': '<path d="m7 15 5 5 5-5"/><path d="m7 9 5-5 5 5"/>',
84
+ // Move to top / bottom (reorder menus).
85
+ 'chevrons-up': '<path d="m17 11-5-5-5 5"/><path d="m17 18-5-5-5 5"/>',
86
+ 'chevrons-down': '<path d="m7 6 5 5 5-5"/><path d="m7 13 5 5 5-5"/>',
87
+ // Ratings and reviews. A filled star: <sds-icon name="star" filled /> (the path is closed).
88
+ star: '<path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/>',
89
+ // Comments, messages to a customer.
90
+ 'message-square': '<path d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"/>',
84
91
  filter: '<polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"/>',
85
92
  table: '<path d="M12 3v18"/><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M3 9h18"/><path d="M3 15h18"/>',
86
93
  // Contactless ordering: every restaurant table gets its own QR code (Belvigo merchant nav).
@@ -165,6 +172,7 @@ function toIconPx(value) {
165
172
  * @example
166
173
  * <sds-icon name="search" />
167
174
  * <sds-icon name="home" [size]="18" />
175
+ * <sds-icon name="star" filled class="text-accent-amber" />
168
176
  */
169
177
  class SdsIcon {
170
178
  sanitizer = inject(DomSanitizer);
@@ -174,16 +182,21 @@ class SdsIcon {
174
182
  size = input(20, ...(ngDevMode ? [{ debugName: "size", transform: toIconPx }] : [{ transform: toIconPx }]));
175
183
  /** Stroke width of the line icon. */
176
184
  strokeWidth = input(2, ...(ngDevMode ? [{ debugName: "strokeWidth" }] : []));
185
+ /**
186
+ * Fill the shape with the current colour as well as stroking it — a filled rating star, a solid dot.
187
+ * Only closed shapes (star, circle…) read as filled; open line icons are unchanged.
188
+ */
189
+ filled = input(false, ...(ngDevMode ? [{ debugName: "filled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
177
190
  svg = computed(() => {
178
191
  const inner = SDS_ICONS[this.name()] ?? '';
179
192
  const markup = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" ` +
180
- `width="100%" height="100%" fill="none" stroke="currentColor" ` +
193
+ `width="100%" height="100%" fill="${this.filled() ? 'currentColor' : 'none'}" stroke="currentColor" ` +
181
194
  `stroke-width="${this.strokeWidth()}" stroke-linecap="round" ` +
182
195
  `stroke-linejoin="round">${inner}</svg>`;
183
196
  return this.sanitizer.bypassSecurityTrustHtml(markup);
184
197
  }, ...(ngDevMode ? [{ debugName: "svg" }] : []));
185
198
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
186
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.25", type: SdsIcon, isStandalone: true, selector: "sds-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.width.px": "size()", "style.height.px": "size()", "innerHTML": "svg()", "attr.aria-hidden": "\"true\"" }, classAttribute: "sds-icon inline-flex shrink-0 items-center justify-center" }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
199
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.25", type: SdsIcon, isStandalone: true, selector: "sds-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, filled: { classPropertyName: "filled", publicName: "filled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.width.px": "size()", "style.height.px": "size()", "innerHTML": "svg()", "attr.aria-hidden": "\"true\"" }, classAttribute: "sds-icon inline-flex shrink-0 items-center justify-center" }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
187
200
  }
188
201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsIcon, decorators: [{
189
202
  type: Component,
@@ -199,7 +212,57 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
199
212
  '[attr.aria-hidden]': '"true"',
200
213
  },
201
214
  }]
202
- }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }] } });
215
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], filled: [{ type: i0.Input, args: [{ isSignal: true, alias: "filled", required: false }] }] } });
216
+
217
+ /**
218
+ * Dark-mode fills a brand preset can take over. Internal to the library (not in public-api.ts).
219
+ *
220
+ * The monochrome presets (saitech.css, belvigo.css) have a dark 600 step that is a mid-dark grey: as a
221
+ * solid fill under white text it reads as disabled. So in dark mode the library's solid "primary" fills
222
+ * (primary button, toggle "on", tri-state "contains", the count badges) invert to `ink` on `surface`,
223
+ * and its selected tints (chip, tertiary button, drop zone) go neutral. A coloured brand does not need
224
+ * that: with the emerald preset every primary button turned WHITE in dark mode, next to green checkboxes
225
+ * and tabs.
226
+ *
227
+ * Each class below reads a `--sds-dark-*` custom property and falls back to the inverted/neutral value,
228
+ * so the monochrome presets keep their look and a preset opts in by setting the properties under
229
+ * `html.dark` (belvigo-emerald.css does):
230
+ *
231
+ * --sds-dark-primary solid fill (fallback: ink)
232
+ * --sds-dark-primary-hover solid fill, hover (fallback: ink 90 %)
233
+ * --sds-dark-primary-active solid fill, pressed (fallback: ink 80 %)
234
+ * --sds-dark-on-primary text / marks on the solid fill (fallback: surface)
235
+ * --sds-dark-tint selected tint background (fallback: muted, or white 10 % on buttons)
236
+ * --sds-dark-tint-hover tint, hover
237
+ * --sds-dark-tint-active tint, pressed
238
+ * --sds-dark-tint-border border of a selected tint (fallback: ink-soft)
239
+ * --sds-dark-on-tint text on the tint (fallback: ink)
240
+ *
241
+ * The strings are whole class literals on purpose: Tailwind finds them by scanning the published bundle.
242
+ */
243
+ /** Solid primary fill in dark mode. */
244
+ const DARK_PRIMARY_BG = 'dark:bg-[color:var(--sds-dark-primary,var(--color-ink))]';
245
+ const DARK_PRIMARY_BORDER = 'dark:border-[color:var(--sds-dark-primary,var(--color-ink))]';
246
+ const DARK_PRIMARY_RING = 'dark:ring-[color:var(--sds-dark-primary,var(--color-ink))]';
247
+ /** The solid fill's colour used as a foreground (an icon inside a light knob). */
248
+ const DARK_PRIMARY_TEXT = 'dark:text-[color:var(--sds-dark-primary,var(--color-ink))]';
249
+ const DARK_PRIMARY_HOVER = 'dark:hover:bg-[color:var(--sds-dark-primary-hover,color-mix(in_oklab,var(--color-ink)_90%,transparent))]';
250
+ const DARK_PRIMARY_ACTIVE = 'dark:active:bg-[color:var(--sds-dark-primary-active,color-mix(in_oklab,var(--color-ink)_80%,transparent))]';
251
+ /** Text and marks on the solid fill. */
252
+ const DARK_ON_PRIMARY = 'dark:text-[color:var(--sds-dark-on-primary,var(--color-surface))]';
253
+ /** A light element sitting on the solid fill (the toggle's knob). */
254
+ const DARK_ON_PRIMARY_BG = 'dark:bg-[color:var(--sds-dark-on-primary,var(--color-surface))]';
255
+ /** Secondary text on the solid fill (a caption at 85 %). */
256
+ const DARK_ON_PRIMARY_SOFT = 'dark:text-[color:color-mix(in_oklab,var(--sds-dark-on-primary,var(--color-surface))_85%,transparent)]';
257
+ /**
258
+ * Hover of a fill that keeps `bg-brand-600` in dark mode (selected day, current page). Falls back to the
259
+ * light hover step; a coloured preset whose dark 700 is a light TEXT green points it at its fill hover.
260
+ */
261
+ const DARK_BRAND_FILL_HOVER = 'dark:hover:bg-[color:var(--sds-dark-primary-hover,var(--color-brand-700))]';
262
+ /** Selected tint in dark mode (chip, drop zone). */
263
+ const DARK_TINT_BG = 'dark:bg-[color:var(--sds-dark-tint,var(--color-muted))]';
264
+ const DARK_TINT_BORDER = 'dark:border-[color:var(--sds-dark-tint-border,var(--color-ink-soft))]';
265
+ const DARK_ON_TINT = 'dark:text-[color:var(--sds-dark-on-tint,var(--color-ink))]';
203
266
 
204
267
  const BASE = 'inline-flex items-center justify-center gap-2 font-medium ' +
205
268
  'transition-colors duration-150 select-none whitespace-nowrap cursor-pointer ' +
@@ -208,16 +271,22 @@ const BASE = 'inline-flex items-center justify-center gap-2 font-medium ' +
208
271
  'disabled:opacity-50 disabled:pointer-events-none';
209
272
  /**
210
273
  * Dark mode has its own fills. A monochrome brand's dark 600 step is a mid-dark grey: as a primary fill
211
- * it read as disabled, and at `disabled:opacity-50` the real disabled state looked the same. So the dark
212
- * primary is the inverted light fill (`ink` on `surface`); tertiary and ghost swap their black/brand-50
213
- * tints for white ones, which show on a dark surface.
274
+ * it read as disabled, and at `disabled:opacity-50` the real disabled state looked the same. So by default
275
+ * the dark primary is the inverted light fill (`ink` on `surface`); tertiary and ghost swap their
276
+ * black/brand-50 tints for white ones, which show on a dark surface.
277
+ *
278
+ * A coloured brand keeps its colour: the preset sets `--sds-dark-primary*` / `--sds-dark-tint*` under
279
+ * `html.dark` (belvigo-emerald.css does) and the dark primary and tertiary take them. See theme/dark-fills.ts.
214
280
  */
215
281
  const VARIANTS$2 = {
216
282
  primary: 'bg-brand-600 text-white shadow-sm hover:bg-brand-700 active:bg-brand-800 ' +
217
- 'dark:bg-ink dark:text-surface dark:hover:bg-ink/90 dark:active:bg-ink/80',
283
+ `${DARK_PRIMARY_BG} ${DARK_ON_PRIMARY} ${DARK_PRIMARY_HOVER} ${DARK_PRIMARY_ACTIVE}`,
218
284
  secondary: 'bg-surface text-ink border border-border shadow-sm hover:bg-muted active:bg-brand-50',
219
285
  tertiary: 'bg-brand-50 text-brand-700 hover:bg-brand-100 active:bg-brand-200/70 ' +
220
- 'dark:bg-white/10 dark:text-ink dark:hover:bg-white/15 dark:active:bg-white/20',
286
+ 'dark:bg-[color:var(--sds-dark-tint,rgb(255_255_255/0.1))] ' +
287
+ 'dark:text-[color:var(--sds-dark-on-tint,var(--color-ink))] ' +
288
+ 'dark:hover:bg-[color:var(--sds-dark-tint-hover,rgb(255_255_255/0.15))] ' +
289
+ 'dark:active:bg-[color:var(--sds-dark-tint-active,rgb(255_255_255/0.2))]',
221
290
  ghost: 'bg-transparent text-ink-soft hover:bg-black/5 active:bg-black/10 ' +
222
291
  'dark:hover:bg-white/10 dark:active:bg-white/15',
223
292
  danger: 'bg-danger text-white shadow-sm hover:brightness-95 active:brightness-90',
@@ -347,13 +416,32 @@ const SIZES$b = {
347
416
  * sidebar search field).
348
417
  */
349
418
  class SdsInput {
350
- inputId = `sds-input-${nextId$n++}`;
419
+ autoId = `sds-input-${nextId$n++}`;
420
+ /**
421
+ * `id` of the native `<input>` — for a `<label for>` outside the component, or to focus the field with
422
+ * `document.getElementById(id).focus()` (after adding a row, say). Empty (default) generates one. Set it
423
+ * here rather than as an `id` on the host: the host is not the focusable element.
424
+ */
425
+ inputId = input('', ...(ngDevMode ? [{ debugName: "inputId" }] : []));
426
+ /** The native field's id: {@link inputId} or the generated one. */
427
+ fieldId = computed(() => this.inputId() || this.autoId, ...(ngDevMode ? [{ debugName: "fieldId" }] : []));
351
428
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
352
429
  /** Accessible name used when no visible [label] is provided. */
353
430
  ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
354
431
  placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
355
432
  hint = input('', ...(ngDevMode ? [{ debugName: "hint" }] : []));
356
433
  error = input('', ...(ngDevMode ? [{ debugName: "error" }] : []));
434
+ /**
435
+ * Mark the field invalid (danger frame + `aria-invalid`) without showing an [error] message — for a
436
+ * form that reports its problems once, in a summary or a single message under a group of fields.
437
+ */
438
+ invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
439
+ /**
440
+ * Mark the field required: an asterisk after the [label] (hidden from screen readers) and
441
+ * `aria-required` on the field. It does not validate — keep `Validators.required` (or your own check)
442
+ * for that; this is the visible and announced half.
443
+ */
444
+ required = input(false, ...(ngDevMode ? [{ debugName: "required", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
357
445
  /**
358
446
  * `search` is the semantically right type for a search field, and the template strips the WebKit
359
447
  * search decorations that come with it. Without that, a `search` field with {@link clearable} draws
@@ -414,9 +502,9 @@ class SdsInput {
414
502
  isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
415
503
  describedBy = computed(() => {
416
504
  if (this.error())
417
- return `${this.inputId}-err`;
505
+ return `${this.fieldId()}-err`;
418
506
  if (this.hint())
419
- return `${this.inputId}-hint`;
507
+ return `${this.fieldId()}-hint`;
420
508
  return null;
421
509
  }, ...(ngDevMode ? [{ debugName: "describedBy" }] : []));
422
510
  fieldPadding = computed(() => {
@@ -431,6 +519,7 @@ class SdsInput {
431
519
  return `${left} ${right}`;
432
520
  }, ...(ngDevMode ? [{ debugName: "fieldPadding" }] : []));
433
521
  wrapperClasses = computed(() => {
522
+ const danger = !!this.error() || this.invalid();
434
523
  const parts = [SIZES$b[this.size()], this.pill() ? 'rounded-full' : 'rounded-control'];
435
524
  if (this.isDisabled())
436
525
  parts.push('opacity-60 cursor-not-allowed');
@@ -438,19 +527,19 @@ class SdsInput {
438
527
  // border-transparent, not border-0: the border box is what keeps a filled field the same height
439
528
  // as a bordered one, so the two sit level when a toolbar mixes them.
440
529
  parts.push('border-transparent bg-muted text-ink');
441
- parts.push(this.error()
530
+ parts.push(danger
442
531
  ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'
443
532
  : 'focus-within:ring-2 focus-within:ring-brand-500/25');
444
533
  }
445
534
  else if (this.onBrand()) {
446
535
  parts.push('bg-white/10 text-white');
447
- parts.push(this.error()
536
+ parts.push(danger
448
537
  ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'
449
538
  : 'border-white/15 focus-within:border-white/40 focus-within:ring-2 focus-within:ring-white/20');
450
539
  }
451
540
  else {
452
541
  parts.push('bg-surface text-ink');
453
- parts.push(this.error()
542
+ parts.push(danger
454
543
  ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'
455
544
  : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25');
456
545
  }
@@ -482,7 +571,7 @@ class SdsInput {
482
571
  this.onTouched();
483
572
  }
484
573
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
485
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsInput, isStandalone: true, selector: "sds-input", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingAction: { classPropertyName: "trailingAction", publicName: "trailingAction", isSignal: true, isRequired: false, transformFunction: null }, trailingActionLabel: { classPropertyName: "trailingActionLabel", publicName: "trailingActionLabel", isSignal: true, isRequired: false, transformFunction: null }, trailingActionPressed: { classPropertyName: "trailingActionPressed", publicName: "trailingActionPressed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { trailingActionClick: "trailingActionClick" }, host: { classAttribute: "block" }, providers: [
574
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsInput, isStandalone: true, selector: "sds-input", inputs: { inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingAction: { classPropertyName: "trailingAction", publicName: "trailingAction", isSignal: true, isRequired: false, transformFunction: null }, trailingActionLabel: { classPropertyName: "trailingActionLabel", publicName: "trailingActionLabel", isSignal: true, isRequired: false, transformFunction: null }, trailingActionPressed: { classPropertyName: "trailingActionPressed", publicName: "trailingActionPressed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { trailingActionClick: "trailingActionClick" }, host: { classAttribute: "block" }, providers: [
486
575
  {
487
576
  provide: NG_VALUE_ACCESSOR,
488
577
  useExisting: forwardRef(() => SdsInput),
@@ -491,11 +580,14 @@ class SdsInput {
491
580
  ], ngImport: i0, template: `
492
581
  @if (label()) {
493
582
  <label
494
- [for]="inputId"
583
+ [for]="fieldId()"
495
584
  class="mb-1.5 block text-sm font-medium"
496
585
  [class]="onBrand() ? 'text-white/90' : 'text-ink'"
497
586
  >
498
587
  {{ label() }}
588
+ @if (required()) {
589
+ <span class="ml-0.5" [class]="onBrand() ? 'text-white/70' : 'text-danger'" aria-hidden="true">*</span>
590
+ }
499
591
  </label>
500
592
  }
501
593
 
@@ -515,7 +607,7 @@ class SdsInput {
515
607
  }
516
608
 
517
609
  <input
518
- [id]="inputId"
610
+ [id]="fieldId()"
519
611
  [type]="type()"
520
612
  [placeholder]="placeholder()"
521
613
  [disabled]="isDisabled()"
@@ -523,7 +615,8 @@ class SdsInput {
523
615
  [attr.autocomplete]="autocomplete() || null"
524
616
  [attr.maxlength]="maxLength() || null"
525
617
  [attr.aria-label]="!label() && ariaLabel() ? ariaLabel() : null"
526
- [attr.aria-invalid]="error() ? 'true' : null"
618
+ [attr.aria-invalid]="error() || invalid() ? 'true' : null"
619
+ [attr.aria-required]="required() ? 'true' : null"
527
620
  [attr.aria-describedby]="describedBy()"
528
621
  class="w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed
529
622
  [&::-webkit-search-cancel-button]:appearance-none
@@ -548,7 +641,7 @@ class SdsInput {
548
641
  type="button"
549
642
  [attr.aria-label]="trailingActionLabel() || null"
550
643
  [attr.aria-pressed]="trailingActionPressed()"
551
- [attr.aria-controls]="inputId"
644
+ [attr.aria-controls]="fieldId()"
552
645
  class="absolute right-2.5 inline-flex h-7 w-7 items-center justify-center rounded-full
553
646
  opacity-70 hover:opacity-100 hover:bg-black/5"
554
647
  (click)="trailingActionClick.emit()"
@@ -565,19 +658,19 @@ class SdsInput {
565
658
  </div>
566
659
 
567
660
  @if (error()) {
568
- <p [id]="inputId + '-err'" class="mt-1.5 text-xs font-medium text-danger">
661
+ <p [id]="fieldId() + '-err'" class="mt-1.5 text-xs font-medium text-danger">
569
662
  {{ error() }}
570
663
  </p>
571
664
  } @else if (hint()) {
572
665
  <p
573
- [id]="inputId + '-hint'"
666
+ [id]="fieldId() + '-hint'"
574
667
  class="mt-1.5 text-xs"
575
668
  [class]="onBrand() ? 'text-white/60' : 'text-ink-faint'"
576
669
  >
577
670
  {{ hint() }}
578
671
  </p>
579
672
  }
580
- `, isInline: true, styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 100000s ease-in-out 0s;-webkit-text-fill-color:currentColor;caret-color:currentColor}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
673
+ `, isInline: true, styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 100000s ease-in-out 0s;-webkit-text-fill-color:currentColor;caret-color:currentColor}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
581
674
  }
582
675
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsInput, decorators: [{
583
676
  type: Component,
@@ -590,11 +683,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
590
683
  ], host: { class: 'block' }, template: `
591
684
  @if (label()) {
592
685
  <label
593
- [for]="inputId"
686
+ [for]="fieldId()"
594
687
  class="mb-1.5 block text-sm font-medium"
595
688
  [class]="onBrand() ? 'text-white/90' : 'text-ink'"
596
689
  >
597
690
  {{ label() }}
691
+ @if (required()) {
692
+ <span class="ml-0.5" [class]="onBrand() ? 'text-white/70' : 'text-danger'" aria-hidden="true">*</span>
693
+ }
598
694
  </label>
599
695
  }
600
696
 
@@ -614,7 +710,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
614
710
  }
615
711
 
616
712
  <input
617
- [id]="inputId"
713
+ [id]="fieldId()"
618
714
  [type]="type()"
619
715
  [placeholder]="placeholder()"
620
716
  [disabled]="isDisabled()"
@@ -622,7 +718,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
622
718
  [attr.autocomplete]="autocomplete() || null"
623
719
  [attr.maxlength]="maxLength() || null"
624
720
  [attr.aria-label]="!label() && ariaLabel() ? ariaLabel() : null"
625
- [attr.aria-invalid]="error() ? 'true' : null"
721
+ [attr.aria-invalid]="error() || invalid() ? 'true' : null"
722
+ [attr.aria-required]="required() ? 'true' : null"
626
723
  [attr.aria-describedby]="describedBy()"
627
724
  class="w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed
628
725
  [&::-webkit-search-cancel-button]:appearance-none
@@ -647,7 +744,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
647
744
  type="button"
648
745
  [attr.aria-label]="trailingActionLabel() || null"
649
746
  [attr.aria-pressed]="trailingActionPressed()"
650
- [attr.aria-controls]="inputId"
747
+ [attr.aria-controls]="fieldId()"
651
748
  class="absolute right-2.5 inline-flex h-7 w-7 items-center justify-center rounded-full
652
749
  opacity-70 hover:opacity-100 hover:bg-black/5"
653
750
  (click)="trailingActionClick.emit()"
@@ -664,12 +761,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
664
761
  </div>
665
762
 
666
763
  @if (error()) {
667
- <p [id]="inputId + '-err'" class="mt-1.5 text-xs font-medium text-danger">
764
+ <p [id]="fieldId() + '-err'" class="mt-1.5 text-xs font-medium text-danger">
668
765
  {{ error() }}
669
766
  </p>
670
767
  } @else if (hint()) {
671
768
  <p
672
- [id]="inputId + '-hint'"
769
+ [id]="fieldId() + '-hint'"
673
770
  class="mt-1.5 text-xs"
674
771
  [class]="onBrand() ? 'text-white/60' : 'text-ink-faint'"
675
772
  >
@@ -677,7 +774,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
677
774
  </p>
678
775
  }
679
776
  `, styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 100000s ease-in-out 0s;-webkit-text-fill-color:currentColor;caret-color:currentColor}\n"] }]
680
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], trailingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingIcon", required: false }] }], trailingAction: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingAction", required: false }] }], trailingActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingActionLabel", required: false }] }], trailingActionPressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingActionPressed", required: false }] }], trailingActionClick: [{ type: i0.Output, args: ["trailingActionClick"] }] } });
777
+ }], propDecorators: { inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], trailingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingIcon", required: false }] }], trailingAction: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingAction", required: false }] }], trailingActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingActionLabel", required: false }] }], trailingActionPressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingActionPressed", required: false }] }], trailingActionClick: [{ type: i0.Output, args: ["trailingActionClick"] }] } });
681
778
 
682
779
  let nextId$m = 0;
683
780
  const HEIGHTS = {
@@ -720,6 +817,11 @@ class SdsInputNumber {
720
817
  * host that renders the message itself, e.g. an editable table cell.
721
818
  */
722
819
  invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
820
+ /**
821
+ * Mark the field required: an asterisk after the [label] (hidden from screen readers) and
822
+ * `aria-required` on the field. It does not validate — same contract as sds-input's [required].
823
+ */
824
+ required = input(false, ...(ngDevMode ? [{ debugName: "required", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
723
825
  /** Extra id(s) for the field's `aria-describedby`, added to its own hint/error message id. */
724
826
  ariaDescribedby = input('', ...(ngDevMode ? [{ debugName: "ariaDescribedby" }] : []));
725
827
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
@@ -1170,7 +1272,7 @@ class SdsInputNumber {
1170
1272
  this.cvaDisabled.set(isDisabled);
1171
1273
  }
1172
1274
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsInputNumber, deps: [], target: i0.ɵɵFactoryTarget.Component });
1173
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsInputNumber, isStandalone: true, selector: "sds-input-number", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "ariaDescribedby", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, currencyDisplay: { classPropertyName: "currencyDisplay", publicName: "currencyDisplay", isSignal: true, isRequired: false, transformFunction: null }, useGrouping: { classPropertyName: "useGrouping", publicName: "useGrouping", isSignal: true, isRequired: false, transformFunction: null }, minFractionDigits: { classPropertyName: "minFractionDigits", publicName: "minFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, maxFractionDigits: { classPropertyName: "maxFractionDigits", publicName: "maxFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, showButtons: { classPropertyName: "showButtons", publicName: "showButtons", isSignal: true, isRequired: false, transformFunction: null }, buttonLayout: { classPropertyName: "buttonLayout", publicName: "buttonLayout", isSignal: true, isRequired: false, transformFunction: null }, incrementIcon: { classPropertyName: "incrementIcon", publicName: "incrementIcon", isSignal: true, isRequired: false, transformFunction: null }, decrementIcon: { classPropertyName: "decrementIcon", publicName: "decrementIcon", isSignal: true, isRequired: false, transformFunction: null }, allowEmpty: { classPropertyName: "allowEmpty", publicName: "allowEmpty", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, incrementLabel: { classPropertyName: "incrementLabel", publicName: "incrementLabel", isSignal: true, isRequired: false, transformFunction: null }, decrementLabel: { classPropertyName: "decrementLabel", publicName: "decrementLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, providers: [
1275
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsInputNumber, isStandalone: true, selector: "sds-input-number", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "ariaDescribedby", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, currencyDisplay: { classPropertyName: "currencyDisplay", publicName: "currencyDisplay", isSignal: true, isRequired: false, transformFunction: null }, useGrouping: { classPropertyName: "useGrouping", publicName: "useGrouping", isSignal: true, isRequired: false, transformFunction: null }, minFractionDigits: { classPropertyName: "minFractionDigits", publicName: "minFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, maxFractionDigits: { classPropertyName: "maxFractionDigits", publicName: "maxFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, showButtons: { classPropertyName: "showButtons", publicName: "showButtons", isSignal: true, isRequired: false, transformFunction: null }, buttonLayout: { classPropertyName: "buttonLayout", publicName: "buttonLayout", isSignal: true, isRequired: false, transformFunction: null }, incrementIcon: { classPropertyName: "incrementIcon", publicName: "incrementIcon", isSignal: true, isRequired: false, transformFunction: null }, decrementIcon: { classPropertyName: "decrementIcon", publicName: "decrementIcon", isSignal: true, isRequired: false, transformFunction: null }, allowEmpty: { classPropertyName: "allowEmpty", publicName: "allowEmpty", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, incrementLabel: { classPropertyName: "incrementLabel", publicName: "incrementLabel", isSignal: true, isRequired: false, transformFunction: null }, decrementLabel: { classPropertyName: "decrementLabel", publicName: "decrementLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, providers: [
1174
1276
  {
1175
1277
  provide: NG_VALUE_ACCESSOR,
1176
1278
  useExisting: forwardRef(() => SdsInputNumber),
@@ -1178,7 +1280,12 @@ class SdsInputNumber {
1178
1280
  },
1179
1281
  ], viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true, isSignal: true }], ngImport: i0, template: `
1180
1282
  @if (label()) {
1181
- <label [for]="inputId" class="mb-1.5 block text-sm font-medium text-ink">{{ label() }}</label>
1283
+ <label [for]="inputId" class="mb-1.5 block text-sm font-medium text-ink">
1284
+ {{ label() }}
1285
+ @if (required()) {
1286
+ <span class="ml-0.5 text-danger" aria-hidden="true">*</span>
1287
+ }
1288
+ </label>
1182
1289
  }
1183
1290
 
1184
1291
  <div class="relative border transition-colors" [class]="wrapperClasses()">
@@ -1224,6 +1331,7 @@ class SdsInputNumber {
1224
1331
  [readOnly]="readonly()"
1225
1332
  [attr.aria-label]="!label() && ariaLabel() ? ariaLabel() : null"
1226
1333
  [attr.aria-invalid]="error() || invalid() ? 'true' : null"
1334
+ [attr.aria-required]="required() ? 'true' : null"
1227
1335
  [attr.aria-describedby]="describedBy()"
1228
1336
  [attr.aria-valuenow]="value()"
1229
1337
  [attr.aria-valuemin]="min()"
@@ -1315,7 +1423,7 @@ class SdsInputNumber {
1315
1423
  } @else if (hint()) {
1316
1424
  <p [id]="inputId + '-hint'" class="mt-1.5 text-xs text-ink-faint">{{ hint() }}</p>
1317
1425
  }
1318
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1426
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1319
1427
  }
1320
1428
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsInputNumber, decorators: [{
1321
1429
  type: Component,
@@ -1333,7 +1441,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1333
1441
  host: { class: 'block' },
1334
1442
  template: `
1335
1443
  @if (label()) {
1336
- <label [for]="inputId" class="mb-1.5 block text-sm font-medium text-ink">{{ label() }}</label>
1444
+ <label [for]="inputId" class="mb-1.5 block text-sm font-medium text-ink">
1445
+ {{ label() }}
1446
+ @if (required()) {
1447
+ <span class="ml-0.5 text-danger" aria-hidden="true">*</span>
1448
+ }
1449
+ </label>
1337
1450
  }
1338
1451
 
1339
1452
  <div class="relative border transition-colors" [class]="wrapperClasses()">
@@ -1379,6 +1492,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1379
1492
  [readOnly]="readonly()"
1380
1493
  [attr.aria-label]="!label() && ariaLabel() ? ariaLabel() : null"
1381
1494
  [attr.aria-invalid]="error() || invalid() ? 'true' : null"
1495
+ [attr.aria-required]="required() ? 'true' : null"
1382
1496
  [attr.aria-describedby]="describedBy()"
1383
1497
  [attr.aria-valuenow]="value()"
1384
1498
  [attr.aria-valuemin]="min()"
@@ -1472,7 +1586,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1472
1586
  }
1473
1587
  `,
1474
1588
  }]
1475
- }], ctorParameters: () => [], propDecorators: { fieldRef: [{ type: i0.ViewChild, args: ['field', { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaDescribedby", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], currencyDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencyDisplay", required: false }] }], useGrouping: [{ type: i0.Input, args: [{ isSignal: true, alias: "useGrouping", required: false }] }], minFractionDigits: [{ type: i0.Input, args: [{ isSignal: true, alias: "minFractionDigits", required: false }] }], maxFractionDigits: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFractionDigits", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], suffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffix", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], showButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showButtons", required: false }] }], buttonLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonLayout", required: false }] }], incrementIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "incrementIcon", required: false }] }], decrementIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "decrementIcon", required: false }] }], allowEmpty: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowEmpty", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], incrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "incrementLabel", required: false }] }], decrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "decrementLabel", required: false }] }] } });
1589
+ }], ctorParameters: () => [], propDecorators: { fieldRef: [{ type: i0.ViewChild, args: ['field', { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaDescribedby", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], currencyDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencyDisplay", required: false }] }], useGrouping: [{ type: i0.Input, args: [{ isSignal: true, alias: "useGrouping", required: false }] }], minFractionDigits: [{ type: i0.Input, args: [{ isSignal: true, alias: "minFractionDigits", required: false }] }], maxFractionDigits: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFractionDigits", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], suffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffix", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], showButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showButtons", required: false }] }], buttonLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonLayout", required: false }] }], incrementIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "incrementIcon", required: false }] }], decrementIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "decrementIcon", required: false }] }], allowEmpty: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowEmpty", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], incrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "incrementLabel", required: false }] }], decrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "decrementLabel", required: false }] }] } });
1476
1590
 
1477
1591
  let nextId$l = 0;
1478
1592
  const SIZES$a = {
@@ -1930,7 +2044,7 @@ class SdsTimeInput {
1930
2044
  } @else if (hint()) {
1931
2045
  <p [id]="fieldId + '-hint'" class="mt-1.5 text-xs text-ink-faint">{{ hint() }}</p>
1932
2046
  }
1933
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2047
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1934
2048
  }
1935
2049
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsTimeInput, decorators: [{
1936
2050
  type: Component,
@@ -2665,6 +2779,7 @@ class SdsTextarea {
2665
2779
  appearance = input('default', ...(ngDevMode ? [{ debugName: "appearance" }] : []));
2666
2780
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
2667
2781
  readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
2782
+ /** Asterisk after the [label] (hidden from screen readers) + `aria-required`. It does not validate. */
2668
2783
  required = input(false, ...(ngDevMode ? [{ debugName: "required", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
2669
2784
  /** Minimum visible rows. */
2670
2785
  rows = input(3, ...(ngDevMode ? [{ debugName: "rows", transform: numberAttribute }] : [{ transform: numberAttribute }]));
@@ -2778,6 +2893,9 @@ class SdsTextarea {
2778
2893
  @if (label()) {
2779
2894
  <label [for]="fieldId" class="mb-1.5 block text-sm font-medium text-ink">
2780
2895
  {{ label() }}
2896
+ @if (required()) {
2897
+ <span class="ml-0.5 text-danger" aria-hidden="true">*</span>
2898
+ }
2781
2899
  </label>
2782
2900
  }
2783
2901
 
@@ -2851,6 +2969,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2851
2969
  @if (label()) {
2852
2970
  <label [for]="fieldId" class="mb-1.5 block text-sm font-medium text-ink">
2853
2971
  {{ label() }}
2972
+ @if (required()) {
2973
+ <span class="ml-0.5 text-danger" aria-hidden="true">*</span>
2974
+ }
2854
2975
  </label>
2855
2976
  }
2856
2977
 
@@ -2958,21 +3079,24 @@ class SdsToggleSwitch {
2958
3079
  return `${this.fieldId}-hint`;
2959
3080
  return null;
2960
3081
  }, ...(ngDevMode ? [{ debugName: "describedBy" }] : []));
3082
+ /** The "on" icon takes the track's colour, so it reads as cut out of the knob. */
3083
+ onIconClass = `text-brand-600 ${DARK_PRIMARY_TEXT}`;
2961
3084
  /**
2962
3085
  * On/off must read at a glance in both modes. In light mode the brand track against a pale grey one does
2963
3086
  * it. In dark mode a monochrome brand's 600 step is a mid-dark grey, as dim as the off track, so there
2964
3087
  * "on" flips to a light track with a dark knob and "off" keeps a dim track with a muted knob. `ink` (not
2965
- * black) tints the off track so it stays visible on dark surfaces too.
3088
+ * black) tints the off track so it stays visible on dark surfaces too. A coloured brand preset keeps
3089
+ * its own "on" track in dark via --sds-dark-primary / --sds-dark-on-primary (see theme/dark-fills.ts).
2966
3090
  */
2967
3091
  trackClasses = computed(() => {
2968
3092
  const parts = [this.sizing().track];
2969
- parts.push(this.checked() ? 'bg-brand-600 dark:bg-ink' : 'bg-ink/15');
3093
+ parts.push(this.checked() ? `bg-brand-600 ${DARK_PRIMARY_BG}` : 'bg-ink/15');
2970
3094
  return parts.join(' ');
2971
3095
  }, ...(ngDevMode ? [{ debugName: "trackClasses" }] : []));
2972
3096
  knobClasses = computed(() => {
2973
3097
  const parts = [this.sizing().knob];
2974
3098
  parts.push(this.checked() ? this.sizing().on : 'translate-x-0.5');
2975
- parts.push(this.checked() ? 'bg-white dark:bg-surface' : 'bg-white dark:bg-ink-soft');
3099
+ parts.push(this.checked() ? `bg-white ${DARK_ON_PRIMARY_BG}` : 'bg-white dark:bg-ink-soft');
2976
3100
  return parts.join(' ');
2977
3101
  }, ...(ngDevMode ? [{ debugName: "knobClasses" }] : []));
2978
3102
  constructor() {
@@ -3052,7 +3176,7 @@ class SdsToggleSwitch {
3052
3176
  <sds-icon
3053
3177
  [name]="onIcon()!"
3054
3178
  [size]="sizing().icon"
3055
- class="text-brand-600 dark:text-ink"
3179
+ [class]="onIconClass"
3056
3180
  />
3057
3181
  } @else if (!checked() && offIcon()) {
3058
3182
  <sds-icon
@@ -3086,7 +3210,7 @@ class SdsToggleSwitch {
3086
3210
  {{ hint() }}
3087
3211
  </p>
3088
3212
  }
3089
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3213
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3090
3214
  }
3091
3215
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsToggleSwitch, decorators: [{
3092
3216
  type: Component,
@@ -3128,7 +3252,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3128
3252
  <sds-icon
3129
3253
  [name]="onIcon()!"
3130
3254
  [size]="sizing().icon"
3131
- class="text-brand-600 dark:text-ink"
3255
+ [class]="onIconClass"
3132
3256
  />
3133
3257
  } @else if (!checked() && offIcon()) {
3134
3258
  <sds-icon
@@ -3270,7 +3394,7 @@ class SdsCheckbox {
3270
3394
  }
3271
3395
  </span>
3272
3396
  </ng-template>
3273
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3397
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3274
3398
  }
3275
3399
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsCheckbox, decorators: [{
3276
3400
  type: Component,
@@ -3659,7 +3783,7 @@ class SdsAvatar {
3659
3783
  ></span>
3660
3784
  }
3661
3785
  </div>
3662
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3786
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3663
3787
  }
3664
3788
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsAvatar, decorators: [{
3665
3789
  type: Component,
@@ -3906,7 +4030,7 @@ class SdsAllergenIcon {
3906
4030
  @if (iconName(); as name) {
3907
4031
  <sds-icon [name]="name" [size]="size()" [strokeWidth]="strokeWidth()" />
3908
4032
  }
3909
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4033
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3910
4034
  }
3911
4035
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsAllergenIcon, decorators: [{
3912
4036
  type: Component,
@@ -3986,13 +4110,16 @@ class SdsTriStateChip {
3986
4110
  switch (this.value()) {
3987
4111
  case 'contains':
3988
4112
  // Filled + solid thick border + check. In dark mode a monochrome brand-600 is a dim grey, so the
3989
- // fill inverts to ink/surface (the same rule as sds-toggle-switch and sds-button primary).
3990
- return (`${base} border-brand-600 bg-brand-600 text-white ` +
3991
- 'dark:border-ink dark:bg-ink dark:text-surface hover:bg-brand-700 dark:hover:bg-ink-soft');
4113
+ // fill inverts to ink/surface (the same rule as sds-toggle-switch and sds-button primary) unless
4114
+ // the brand preset supplies its own dark fill (--sds-dark-primary*, see theme/dark-fills.ts).
4115
+ return (`${base} border-brand-600 bg-brand-600 text-white hover:bg-brand-700 ` +
4116
+ `${DARK_PRIMARY_BORDER} ${DARK_PRIMARY_BG} ${DARK_ON_PRIMARY} ` +
4117
+ 'dark:hover:bg-[color:var(--sds-dark-primary-hover,var(--color-ink-soft))]');
3992
4118
  case 'may-contain':
3993
4119
  // Unfilled + DASHED thick border + question mark.
3994
- return (`${base} border-dashed border-brand-600 bg-brand-50 text-ink ` +
3995
- 'dark:border-ink-soft dark:bg-muted hover:bg-brand-100 dark:hover:bg-surface');
4120
+ return (`${base} border-dashed border-brand-600 bg-brand-50 text-ink hover:bg-brand-100 ` +
4121
+ `${DARK_TINT_BORDER} ${DARK_TINT_BG} ` +
4122
+ 'dark:hover:bg-[color:var(--sds-dark-tint-hover,var(--color-surface))]');
3996
4123
  default:
3997
4124
  return `${base} border-border bg-surface text-ink-soft hover:border-ink-faint hover:text-ink`;
3998
4125
  }
@@ -4000,7 +4127,7 @@ class SdsTriStateChip {
4000
4127
  captionClass = computed(() => {
4001
4128
  switch (this.value()) {
4002
4129
  case 'contains':
4003
- return 'text-white/85 dark:text-surface/85';
4130
+ return `text-white/85 ${DARK_ON_PRIMARY_SOFT}`;
4004
4131
  case 'may-contain':
4005
4132
  return 'text-ink-soft';
4006
4133
  default:
@@ -4104,7 +4231,7 @@ class SdsTriStateChip {
4104
4231
  <span [id]="chipId + '-hint'" class="sr-only">{{ hint() }}</span>
4105
4232
  }
4106
4233
  <span class="sr-only" aria-live="polite" aria-atomic="true">{{ announcement() }}</span>
4107
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4234
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4108
4235
  }
4109
4236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsTriStateChip, decorators: [{
4110
4237
  type: Component,
@@ -4321,7 +4448,7 @@ class SdsSegmented {
4321
4448
  </button>
4322
4449
  }
4323
4450
  </div>
4324
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4451
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4325
4452
  }
4326
4453
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSegmented, decorators: [{
4327
4454
  type: Component,
@@ -4374,7 +4501,8 @@ const SIZE = {
4374
4501
  /**
4375
4502
  * Chip look shared by sds-chip and sds-chip-group. Selected is more than a tint — a brand border, bolder
4376
4503
  * text and (by default) a check — so it reads in greyscale too. In dark mode the brand text/tint are
4377
- * swapped for ink/muted (the library's rule for a monochrome brand's dark ramp).
4504
+ * swapped for ink/muted (the library's rule for a monochrome brand's dark ramp), unless the brand preset
4505
+ * supplies its own dark tint (--sds-dark-tint*, see theme/dark-fills.ts).
4378
4506
  */
4379
4507
  function chipClass(size, selected) {
4380
4508
  const base = 'inline-flex shrink-0 select-none items-center whitespace-nowrap rounded-full border font-medium ' +
@@ -4383,7 +4511,7 @@ function chipClass(size, selected) {
4383
4511
  SIZE[size];
4384
4512
  return selected
4385
4513
  ? `${base} cursor-pointer border-brand-600 bg-brand-50 font-semibold text-brand-700 ` +
4386
- 'dark:border-ink-soft dark:bg-muted dark:text-ink'
4514
+ `${DARK_TINT_BORDER} ${DARK_TINT_BG} ${DARK_ON_TINT}`
4387
4515
  : `${base} cursor-pointer border-border bg-surface text-ink-soft hover:border-ink-faint hover:text-ink`;
4388
4516
  }
4389
4517
  const COUNT_CLASS = 'inline-flex min-w-5 items-center justify-center rounded-full bg-ink/5 px-1.5 text-[11px] font-semibold tabular-nums dark:bg-white/10';
@@ -4431,7 +4559,7 @@ class SdsChip {
4431
4559
  <span [class]="countClass">{{ count() }}</span>
4432
4560
  }
4433
4561
  </button>
4434
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4562
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4435
4563
  }
4436
4564
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsChip, decorators: [{
4437
4565
  type: Component,
@@ -4678,7 +4806,7 @@ class SdsChipGroup {
4678
4806
  </button>
4679
4807
  }
4680
4808
  </div>
4681
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4809
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4682
4810
  }
4683
4811
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsChipGroup, decorators: [{
4684
4812
  type: Component,
@@ -4835,7 +4963,7 @@ class SdsChecklistRow {
4835
4963
  }
4836
4964
  </div>
4837
4965
  </div>
4838
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4966
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4839
4967
  }
4840
4968
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsChecklistRow, decorators: [{
4841
4969
  type: Component,
@@ -5037,7 +5165,7 @@ class SdsScore {
5037
5165
  </div>
5038
5166
  }
5039
5167
  </div>
5040
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5168
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5041
5169
  }
5042
5170
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsScore, decorators: [{
5043
5171
  type: Component,
@@ -5216,9 +5344,12 @@ class SdsStatusTile {
5216
5344
  hatch = computed(() => this.state() === 'sold-out'
5217
5345
  ? 'repeating-linear-gradient(135deg, transparent 0 12px, color-mix(in srgb, var(--color-danger) 10%, transparent) 12px 24px)'
5218
5346
  : null, ...(ngDevMode ? [{ debugName: "hatch" }] : []));
5347
+ /** The selected check: brand fill, inverted in dark unless the brand preset supplies a dark fill. */
5348
+ checkBadgeClass = 'absolute right-2 top-2 grid h-7 w-7 place-items-center rounded-full bg-brand-600 text-white shadow ring-2 ring-surface ' +
5349
+ `${DARK_PRIMARY_BG} ${DARK_ON_PRIMARY}`;
5219
5350
  tileClass = computed(() => {
5220
5351
  const ring = this.selected()
5221
- ? ' ring-2 ring-brand-500 ring-offset-2 ring-offset-canvas dark:ring-ink'
5352
+ ? ` ring-2 ring-brand-500 ring-offset-2 ring-offset-canvas ${DARK_PRIMARY_RING}`
5222
5353
  : '';
5223
5354
  return ('relative flex aspect-square w-full min-h-32 cursor-pointer select-none flex-col overflow-hidden ' +
5224
5355
  'rounded-card border-2 text-left shadow-sm transition-[transform,box-shadow] duration-100 ' +
@@ -5285,7 +5416,7 @@ class SdsStatusTile {
5285
5416
 
5286
5417
  @if (selected()) {
5287
5418
  <span
5288
- class="absolute right-2 top-2 grid h-7 w-7 place-items-center rounded-full bg-brand-600 text-white shadow ring-2 ring-surface dark:bg-ink dark:text-surface"
5419
+ [class]="checkBadgeClass"
5289
5420
  aria-hidden="true"
5290
5421
  >
5291
5422
  <sds-icon name="check" [size]="16" [strokeWidth]="3" />
@@ -5303,7 +5434,7 @@ class SdsStatusTile {
5303
5434
  </span>
5304
5435
  }
5305
5436
  </button>
5306
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5437
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5307
5438
  }
5308
5439
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsStatusTile, decorators: [{
5309
5440
  type: Component,
@@ -5366,7 +5497,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
5366
5497
 
5367
5498
  @if (selected()) {
5368
5499
  <span
5369
- class="absolute right-2 top-2 grid h-7 w-7 place-items-center rounded-full bg-brand-600 text-white shadow ring-2 ring-surface dark:bg-ink dark:text-surface"
5500
+ [class]="checkBadgeClass"
5370
5501
  aria-hidden="true"
5371
5502
  >
5372
5503
  <sds-icon name="check" [size]="16" [strokeWidth]="3" />
@@ -5795,7 +5926,7 @@ class SdsMenu {
5795
5926
  }
5796
5927
  </div>
5797
5928
  }
5798
- `, isInline: true, styles: [".animate-sds-menu{animation:sds-menu-pop .12s ease-out}@keyframes sds-menu-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-menu{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5929
+ `, isInline: true, styles: [".animate-sds-menu{animation:sds-menu-pop .12s ease-out}@keyframes sds-menu-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-menu{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5799
5930
  }
5800
5931
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsMenu, decorators: [{
5801
5932
  type: Component,
@@ -5893,6 +6024,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
5893
6024
  * </sds-bulk-bar>
5894
6025
  */
5895
6026
  class SdsBulkBar {
6027
+ /** The selection count: brand fill, inverted in dark unless the preset supplies a dark fill. */
6028
+ countClass = 'inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-brand-600 px-1.5 text-xs font-bold tabular-nums text-white ' +
6029
+ `${DARK_PRIMARY_BG} ${DARK_ON_PRIMARY}`;
5896
6030
  /** Number of selected things. The bar is hidden at 0. */
5897
6031
  count = input(0, ...(ngDevMode ? [{ debugName: "count", transform: numberAttribute }] : [{ transform: numberAttribute }]));
5898
6032
  /** "{count} selected" — `{count}` is replaced. Pass a translated string. */
@@ -5920,7 +6054,7 @@ class SdsBulkBar {
5920
6054
  >
5921
6055
  <span class="inline-flex items-center gap-2 pr-1 text-sm font-semibold text-ink">
5922
6056
  <span
5923
- class="inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-brand-600 px-1.5 text-xs font-bold tabular-nums text-white dark:bg-ink dark:text-surface"
6057
+ [class]="countClass"
5924
6058
  >{{ count() }}</span
5925
6059
  >
5926
6060
  {{ countWords() }}
@@ -5942,7 +6076,7 @@ class SdsBulkBar {
5942
6076
  </button>
5943
6077
  </div>
5944
6078
  }
5945
- `, isInline: true, styles: [".animate-sds-bulk{animation:sds-bulk-in .16s ease-out}@keyframes sds-bulk-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-bulk{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6079
+ `, isInline: true, styles: [".animate-sds-bulk{animation:sds-bulk-in .16s ease-out}@keyframes sds-bulk-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-bulk{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5946
6080
  }
5947
6081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsBulkBar, decorators: [{
5948
6082
  type: Component,
@@ -5964,7 +6098,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
5964
6098
  >
5965
6099
  <span class="inline-flex items-center gap-2 pr-1 text-sm font-semibold text-ink">
5966
6100
  <span
5967
- class="inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-brand-600 px-1.5 text-xs font-bold tabular-nums text-white dark:bg-ink dark:text-surface"
6101
+ [class]="countClass"
5968
6102
  >{{ count() }}</span
5969
6103
  >
5970
6104
  {{ countWords() }}
@@ -6621,7 +6755,7 @@ class SdsSortableList {
6621
6755
 
6622
6756
  <p [id]="instructionsId" class="sr-only">{{ instructions() }}</p>
6623
6757
  <div class="sr-only" aria-live="assertive" aria-atomic="true">{{ liveMessage() }}</div>
6624
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6758
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6625
6759
  }
6626
6760
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSortableList, decorators: [{
6627
6761
  type: Component,
@@ -6734,6 +6868,9 @@ function sdsFileMatchesAccept(file, accept) {
6734
6868
  * affordance); clicking anywhere on the zone opens the picker too. All text is set through inputs with
6735
6869
  * English defaults.
6736
6870
  *
6871
+ * `[loading]` shows a spinner and disables the control while an upload runs; `[ariaLabel]` names the Browse
6872
+ * button when the visible text is shared by several rows ("Upload" beside each document).
6873
+ *
6737
6874
  * `appearance="button"` drops the zone and renders only the Browse button (files can still be dropped
6738
6875
  * on it) — for a "Replace photo" / "Upload logo" / "Add document" action next to a preview, with the
6739
6876
  * same accept/size/count checks and error messages. `browse()` opens the picker from your own control.
@@ -6754,6 +6891,11 @@ class SdsFileDrop {
6754
6891
  /** Most files accepted in one pick/drop. Null = no limit (1 when not [multiple]). */
6755
6892
  maxFiles = input(null, ...(ngDevMode ? [{ debugName: "maxFiles" }] : []));
6756
6893
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
6894
+ /**
6895
+ * Work in progress (an upload running): a spinner replaces the icon, the control is disabled and marked
6896
+ * `aria-busy`. The host keeps showing its own result/error afterwards.
6897
+ */
6898
+ loading = input(false, ...(ngDevMode ? [{ debugName: "loading", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
6757
6899
  /** Icon in the zone at rest. */
6758
6900
  icon = input('upload', ...(ngDevMode ? [{ debugName: "icon" }] : []));
6759
6901
  /** `zone` (default): the dashed drop zone with a Browse button. `button`: the Browse button alone. */
@@ -6764,6 +6906,13 @@ class SdsFileDrop {
6764
6906
  /** Shown while files are dragged over the zone. */
6765
6907
  dropLabel = input('Drop to add', ...(ngDevMode ? [{ debugName: "dropLabel" }] : []));
6766
6908
  browseLabel = input('Browse files', ...(ngDevMode ? [{ debugName: "browseLabel" }] : []));
6909
+ /** Button text while [loading]. Empty keeps [browseLabel]. */
6910
+ loadingLabel = input('', ...(ngDevMode ? [{ debugName: "loadingLabel" }] : []));
6911
+ /**
6912
+ * Accessible name of the Browse button when its visible text is not enough — several upload buttons in
6913
+ * a list each need to say WHAT they upload ("Upload — VAT certificate"). Empty uses the visible text.
6914
+ */
6915
+ ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
6767
6916
  /** Extra line under the label, e.g. "JPEG or PNG, up to 10 MB". */
6768
6917
  hint = input('', ...(ngDevMode ? [{ debugName: "hint" }] : []));
6769
6918
  /** Tokens: `{name}`. */
@@ -6779,6 +6928,8 @@ class SdsFileDrop {
6779
6928
  dragging = signal(false, ...(ngDevMode ? [{ debugName: "dragging" }] : []));
6780
6929
  errors = signal([], ...(ngDevMode ? [{ debugName: "errors" }] : []));
6781
6930
  dragDepth = 0;
6931
+ isDisabled = computed(() => this.disabled() || this.loading(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
6932
+ buttonText = computed(() => this.loading() && this.loadingLabel() ? this.loadingLabel() : this.browseLabel(), ...(ngDevMode ? [{ debugName: "buttonText" }] : []));
6782
6933
  describedBy = computed(() => {
6783
6934
  const ids = [`${this.zoneId}-label`];
6784
6935
  if (this.hint())
@@ -6790,24 +6941,28 @@ class SdsFileDrop {
6790
6941
  zoneClass = computed(() => {
6791
6942
  const base = 'flex flex-col items-center justify-center gap-2 rounded-card border-2 border-dashed px-6 py-8 ' +
6792
6943
  'text-center transition-colors';
6944
+ if (this.loading())
6945
+ return `${base} cursor-progress border-border bg-muted/50`;
6793
6946
  if (this.disabled())
6794
6947
  return `${base} cursor-not-allowed border-border bg-muted opacity-60`;
6795
6948
  return this.dragging()
6796
- ? `${base} cursor-copy border-brand-500 bg-brand-50 dark:bg-muted`
6949
+ ? `${base} cursor-copy border-brand-500 bg-brand-50 ${DARK_TINT_BG}`
6797
6950
  : `${base} cursor-pointer border-border bg-muted/50 hover:border-ink-faint`;
6798
6951
  }, ...(ngDevMode ? [{ debugName: "zoneClass" }] : []));
6799
6952
  buttonClass = computed(() => {
6800
6953
  const size = this.size() === 'sm' ? 'h-8 px-3' : 'h-9 px-3.5';
6801
- const drag = this.dragging() ? ' border-brand-500 bg-brand-50 dark:bg-muted' : ' border-border bg-surface hover:bg-muted';
6954
+ const drag = this.dragging()
6955
+ ? ` border-brand-500 bg-brand-50 ${DARK_TINT_BG}`
6956
+ : ' border-border bg-surface hover:bg-muted';
6802
6957
  return (`inline-flex ${size} items-center gap-1.5 rounded-control border text-sm font-semibold text-ink shadow-sm ` +
6803
6958
  'transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 ' +
6804
- 'disabled:cursor-not-allowed disabled:opacity-60' +
6959
+ (this.loading() ? 'cursor-progress' : 'disabled:cursor-not-allowed disabled:opacity-60') +
6805
6960
  drag);
6806
6961
  }, ...(ngDevMode ? [{ debugName: "buttonClass" }] : []));
6807
6962
  /** Open the native file picker. */
6808
6963
  browse(event) {
6809
6964
  event?.stopPropagation();
6810
- if (this.disabled())
6965
+ if (this.isDisabled())
6811
6966
  return;
6812
6967
  this.fileInput()?.nativeElement.click();
6813
6968
  }
@@ -6817,28 +6972,28 @@ class SdsFileDrop {
6817
6972
  this.browse();
6818
6973
  }
6819
6974
  onDragEnter(event) {
6820
- if (this.disabled() || !this.hasFiles(event))
6975
+ if (this.isDisabled() || !this.hasFiles(event))
6821
6976
  return;
6822
6977
  event.preventDefault();
6823
6978
  this.dragDepth++;
6824
6979
  this.dragging.set(true);
6825
6980
  }
6826
6981
  onDragOver(event) {
6827
- if (this.disabled() || !this.hasFiles(event))
6982
+ if (this.isDisabled() || !this.hasFiles(event))
6828
6983
  return;
6829
6984
  event.preventDefault();
6830
6985
  if (event.dataTransfer)
6831
6986
  event.dataTransfer.dropEffect = 'copy';
6832
6987
  }
6833
6988
  onDragLeave(event) {
6834
- if (this.disabled() || !this.hasFiles(event))
6989
+ if (this.isDisabled() || !this.hasFiles(event))
6835
6990
  return;
6836
6991
  this.dragDepth = Math.max(0, this.dragDepth - 1);
6837
6992
  if (this.dragDepth === 0)
6838
6993
  this.dragging.set(false);
6839
6994
  }
6840
6995
  onDrop(event) {
6841
- if (this.disabled())
6996
+ if (this.isDisabled())
6842
6997
  return;
6843
6998
  event.preventDefault();
6844
6999
  this.dragDepth = 0;
@@ -6897,12 +7052,14 @@ class SdsFileDrop {
6897
7052
  this.errors.set([]);
6898
7053
  }
6899
7054
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsFileDrop, deps: [], target: i0.ɵɵFactoryTarget.Component });
6900
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsFileDrop, isStandalone: true, selector: "sds-file-drop", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxSize: { classPropertyName: "maxSize", publicName: "maxSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, dropLabel: { classPropertyName: "dropLabel", publicName: "dropLabel", isSignal: true, isRequired: false, transformFunction: null }, browseLabel: { classPropertyName: "browseLabel", publicName: "browseLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, wrongTypeMessage: { classPropertyName: "wrongTypeMessage", publicName: "wrongTypeMessage", isSignal: true, isRequired: false, transformFunction: null }, tooLargeMessage: { classPropertyName: "tooLargeMessage", publicName: "tooLargeMessage", isSignal: true, isRequired: false, transformFunction: null }, tooManyMessage: { classPropertyName: "tooManyMessage", publicName: "tooManyMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { files: "files", rejected: "rejected" }, host: { classAttribute: "block" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
7055
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsFileDrop, isStandalone: true, selector: "sds-file-drop", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxSize: { classPropertyName: "maxSize", publicName: "maxSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, dropLabel: { classPropertyName: "dropLabel", publicName: "dropLabel", isSignal: true, isRequired: false, transformFunction: null }, browseLabel: { classPropertyName: "browseLabel", publicName: "browseLabel", isSignal: true, isRequired: false, transformFunction: null }, loadingLabel: { classPropertyName: "loadingLabel", publicName: "loadingLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, wrongTypeMessage: { classPropertyName: "wrongTypeMessage", publicName: "wrongTypeMessage", isSignal: true, isRequired: false, transformFunction: null }, tooLargeMessage: { classPropertyName: "tooLargeMessage", publicName: "tooLargeMessage", isSignal: true, isRequired: false, transformFunction: null }, tooManyMessage: { classPropertyName: "tooManyMessage", publicName: "tooManyMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { files: "files", rejected: "rejected" }, host: { classAttribute: "block" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
6901
7056
  @if (appearance() === 'button') {
6902
7057
  <button
6903
7058
  type="button"
6904
7059
  [class]="buttonClass()"
6905
- [disabled]="disabled()"
7060
+ [disabled]="isDisabled()"
7061
+ [attr.aria-label]="ariaLabel() || null"
7062
+ [attr.aria-busy]="loading() ? 'true' : null"
6906
7063
  [attr.aria-describedby]="errors().length ? zoneId + '-errors' : null"
6907
7064
  [attr.data-dragging]="dragging() ? 'true' : null"
6908
7065
  (click)="browse($event)"
@@ -6911,8 +7068,12 @@ class SdsFileDrop {
6911
7068
  (dragleave)="onDragLeave($event)"
6912
7069
  (drop)="onDrop($event)"
6913
7070
  >
6914
- <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="16" />
6915
- {{ dragging() ? dropLabel() : browseLabel() }}
7071
+ @if (loading()) {
7072
+ <sds-icon name="loader-circle" [size]="16" class="animate-spin" />
7073
+ } @else {
7074
+ <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="16" />
7075
+ }
7076
+ {{ dragging() ? dropLabel() : buttonText() }}
6916
7077
  </button>
6917
7078
  <input
6918
7079
  #fileInput
@@ -6922,13 +7083,14 @@ class SdsFileDrop {
6922
7083
  aria-hidden="true"
6923
7084
  [accept]="accept()"
6924
7085
  [multiple]="multiple()"
6925
- [disabled]="disabled()"
7086
+ [disabled]="isDisabled()"
6926
7087
  (change)="onInputChange($event)"
6927
7088
  />
6928
7089
  } @else {
6929
7090
  <div
6930
7091
  [class]="zoneClass()"
6931
- [attr.aria-disabled]="disabled() ? 'true' : null"
7092
+ [attr.aria-disabled]="isDisabled() ? 'true' : null"
7093
+ [attr.aria-busy]="loading() ? 'true' : null"
6932
7094
  [attr.data-dragging]="dragging() ? 'true' : null"
6933
7095
  (click)="onZoneClick($event)"
6934
7096
  (dragenter)="onDragEnter($event)"
@@ -6940,7 +7102,11 @@ class SdsFileDrop {
6940
7102
  class="grid h-11 w-11 place-items-center rounded-full bg-surface text-ink-soft shadow-sm ring-1 ring-border"
6941
7103
  aria-hidden="true"
6942
7104
  >
6943
- <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="22" />
7105
+ @if (loading()) {
7106
+ <sds-icon name="loader-circle" [size]="22" class="animate-spin" />
7107
+ } @else {
7108
+ <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="22" />
7109
+ }
6944
7110
  </span>
6945
7111
  <p class="text-sm font-semibold text-ink" [id]="zoneId + '-label'">
6946
7112
  {{ dragging() ? dropLabel() : label() }}
@@ -6951,12 +7117,13 @@ class SdsFileDrop {
6951
7117
  <button
6952
7118
  type="button"
6953
7119
  class="mt-1 inline-flex h-9 items-center gap-1.5 rounded-control border border-border bg-surface px-3.5 text-sm font-semibold text-ink shadow-sm transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-60"
6954
- [disabled]="disabled()"
7120
+ [disabled]="isDisabled()"
7121
+ [attr.aria-label]="ariaLabel() || null"
6955
7122
  [attr.aria-describedby]="describedBy()"
6956
7123
  (click)="browse($event)"
6957
7124
  >
6958
7125
  <sds-icon name="upload" [size]="16" />
6959
- {{ browseLabel() }}
7126
+ {{ buttonText() }}
6960
7127
  </button>
6961
7128
  <input
6962
7129
  #fileInput
@@ -6966,7 +7133,7 @@ class SdsFileDrop {
6966
7133
  aria-hidden="true"
6967
7134
  [accept]="accept()"
6968
7135
  [multiple]="multiple()"
6969
- [disabled]="disabled()"
7136
+ [disabled]="isDisabled()"
6970
7137
  (change)="onInputChange($event)"
6971
7138
  />
6972
7139
  </div>
@@ -6984,7 +7151,7 @@ class SdsFileDrop {
6984
7151
  </ul>
6985
7152
  }
6986
7153
  </div>
6987
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7154
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6988
7155
  }
6989
7156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsFileDrop, decorators: [{
6990
7157
  type: Component,
@@ -6998,7 +7165,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
6998
7165
  <button
6999
7166
  type="button"
7000
7167
  [class]="buttonClass()"
7001
- [disabled]="disabled()"
7168
+ [disabled]="isDisabled()"
7169
+ [attr.aria-label]="ariaLabel() || null"
7170
+ [attr.aria-busy]="loading() ? 'true' : null"
7002
7171
  [attr.aria-describedby]="errors().length ? zoneId + '-errors' : null"
7003
7172
  [attr.data-dragging]="dragging() ? 'true' : null"
7004
7173
  (click)="browse($event)"
@@ -7007,8 +7176,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7007
7176
  (dragleave)="onDragLeave($event)"
7008
7177
  (drop)="onDrop($event)"
7009
7178
  >
7010
- <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="16" />
7011
- {{ dragging() ? dropLabel() : browseLabel() }}
7179
+ @if (loading()) {
7180
+ <sds-icon name="loader-circle" [size]="16" class="animate-spin" />
7181
+ } @else {
7182
+ <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="16" />
7183
+ }
7184
+ {{ dragging() ? dropLabel() : buttonText() }}
7012
7185
  </button>
7013
7186
  <input
7014
7187
  #fileInput
@@ -7018,13 +7191,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7018
7191
  aria-hidden="true"
7019
7192
  [accept]="accept()"
7020
7193
  [multiple]="multiple()"
7021
- [disabled]="disabled()"
7194
+ [disabled]="isDisabled()"
7022
7195
  (change)="onInputChange($event)"
7023
7196
  />
7024
7197
  } @else {
7025
7198
  <div
7026
7199
  [class]="zoneClass()"
7027
- [attr.aria-disabled]="disabled() ? 'true' : null"
7200
+ [attr.aria-disabled]="isDisabled() ? 'true' : null"
7201
+ [attr.aria-busy]="loading() ? 'true' : null"
7028
7202
  [attr.data-dragging]="dragging() ? 'true' : null"
7029
7203
  (click)="onZoneClick($event)"
7030
7204
  (dragenter)="onDragEnter($event)"
@@ -7036,7 +7210,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7036
7210
  class="grid h-11 w-11 place-items-center rounded-full bg-surface text-ink-soft shadow-sm ring-1 ring-border"
7037
7211
  aria-hidden="true"
7038
7212
  >
7039
- <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="22" />
7213
+ @if (loading()) {
7214
+ <sds-icon name="loader-circle" [size]="22" class="animate-spin" />
7215
+ } @else {
7216
+ <sds-icon [name]="dragging() ? 'upload' : icon()" [size]="22" />
7217
+ }
7040
7218
  </span>
7041
7219
  <p class="text-sm font-semibold text-ink" [id]="zoneId + '-label'">
7042
7220
  {{ dragging() ? dropLabel() : label() }}
@@ -7047,12 +7225,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7047
7225
  <button
7048
7226
  type="button"
7049
7227
  class="mt-1 inline-flex h-9 items-center gap-1.5 rounded-control border border-border bg-surface px-3.5 text-sm font-semibold text-ink shadow-sm transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-60"
7050
- [disabled]="disabled()"
7228
+ [disabled]="isDisabled()"
7229
+ [attr.aria-label]="ariaLabel() || null"
7051
7230
  [attr.aria-describedby]="describedBy()"
7052
7231
  (click)="browse($event)"
7053
7232
  >
7054
7233
  <sds-icon name="upload" [size]="16" />
7055
- {{ browseLabel() }}
7234
+ {{ buttonText() }}
7056
7235
  </button>
7057
7236
  <input
7058
7237
  #fileInput
@@ -7062,7 +7241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7062
7241
  aria-hidden="true"
7063
7242
  [accept]="accept()"
7064
7243
  [multiple]="multiple()"
7065
- [disabled]="disabled()"
7244
+ [disabled]="isDisabled()"
7066
7245
  (change)="onInputChange($event)"
7067
7246
  />
7068
7247
  </div>
@@ -7082,7 +7261,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7082
7261
  </div>
7083
7262
  `,
7084
7263
  }]
7085
- }], propDecorators: { fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], maxSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSize", required: false }] }], maxFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFiles", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], dropLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropLabel", required: false }] }], browseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "browseLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], wrongTypeMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrongTypeMessage", required: false }] }], tooLargeMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooLargeMessage", required: false }] }], tooManyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooManyMessage", required: false }] }], files: [{ type: i0.Output, args: ["files"] }], rejected: [{ type: i0.Output, args: ["rejected"] }] } });
7264
+ }], propDecorators: { fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], maxSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSize", required: false }] }], maxFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFiles", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], dropLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropLabel", required: false }] }], browseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "browseLabel", required: false }] }], loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], wrongTypeMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrongTypeMessage", required: false }] }], tooLargeMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooLargeMessage", required: false }] }], tooManyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooManyMessage", required: false }] }], files: [{ type: i0.Output, args: ["files"] }], rejected: [{ type: i0.Output, args: ["rejected"] }] } });
7086
7265
 
7087
7266
  let nextId$8 = 0;
7088
7267
  /**
@@ -7496,7 +7675,7 @@ class SdsImageCropper {
7496
7675
  <sds-icon name="zoom-in" [size]="18" />
7497
7676
  </button>
7498
7677
  </div>
7499
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7678
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7500
7679
  }
7501
7680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsImageCropper, decorators: [{
7502
7681
  type: Component,
@@ -7721,7 +7900,7 @@ class SdsCalendar {
7721
7900
  navBtn = 'inline-flex h-8 w-8 items-center justify-center rounded-control text-ink-soft hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';
7722
7901
  titleBtn = 'rounded-control px-2 py-1 capitalize hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';
7723
7902
  actionBtn = 'rounded-control px-2 py-1 text-xs font-medium text-brand-700 hover:bg-brand-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';
7724
- doneBtn = 'rounded-control bg-brand-600 px-3 py-1 text-xs font-semibold text-white hover:bg-brand-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';
7903
+ doneBtn = `rounded-control bg-brand-600 px-3 py-1 text-xs font-semibold text-white hover:bg-brand-700 ${DARK_BRAND_FILL_HOVER} focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500`;
7725
7904
  timeInput = 'w-8 bg-transparent py-1 text-center text-sm text-ink outline-none disabled:cursor-not-allowed disabled:opacity-40';
7726
7905
  stepBtn = 'flex h-3.5 w-5 items-center justify-center text-ink-faint transition-colors hover:text-ink focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-30';
7727
7906
  // --- labels ---
@@ -7977,7 +8156,7 @@ class SdsCalendar {
7977
8156
  dayClass(cell) {
7978
8157
  const base = 'inline-flex h-9 w-9 items-center justify-center rounded-full text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';
7979
8158
  if (cell.selected)
7980
- return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700`;
8159
+ return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700 ${DARK_BRAND_FILL_HOVER}`;
7981
8160
  let cls = `${base} hover:bg-brand-50`;
7982
8161
  if (cell.otherMonth)
7983
8162
  cls += ' text-ink-faint';
@@ -7990,7 +8169,7 @@ class SdsCalendar {
7990
8169
  cellClass(selected, current, disabled) {
7991
8170
  const base = 'h-10 rounded-control text-sm capitalize transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';
7992
8171
  if (selected)
7993
- return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700`;
8172
+ return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700 ${DARK_BRAND_FILL_HOVER}`;
7994
8173
  let cls = `${base} text-ink hover:bg-brand-50`;
7995
8174
  if (current)
7996
8175
  cls += ' font-semibold text-brand-600';
@@ -8217,7 +8396,7 @@ class SdsCalendar {
8217
8396
  </div>
8218
8397
  }
8219
8398
  </div>
8220
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8399
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8221
8400
  }
8222
8401
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsCalendar, decorators: [{
8223
8402
  type: Component,
@@ -8846,7 +9025,7 @@ class SdsDatePicker {
8846
9025
  @if (error()) {
8847
9026
  <p class="mt-1.5 text-xs font-medium text-danger">{{ error() }}</p>
8848
9027
  }
8849
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "component", type: SdsCalendar, selector: "sds-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "locale", "showActions", "showTime", "showDone", "timeLabel", "hoursLabel", "minutesLabel", "doneLabel", "calendarLabel", "previousLabel", "nextLabel", "todayActionLabel", "clearActionLabel"], outputs: ["valueChange", "dateSelect", "done"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9028
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }, { kind: "component", type: SdsCalendar, selector: "sds-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "locale", "showActions", "showTime", "showDone", "timeLabel", "hoursLabel", "minutesLabel", "doneLabel", "calendarLabel", "previousLabel", "nextLabel", "todayActionLabel", "clearActionLabel"], outputs: ["valueChange", "dateSelect", "done"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8850
9029
  }
8851
9030
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsDatePicker, decorators: [{
8852
9031
  type: Component,
@@ -9627,7 +9806,7 @@ class SdsSelect {
9627
9806
  @if (error()) {
9628
9807
  <p class="mt-1.5 text-xs font-medium text-danger">{{ error() }}</p>
9629
9808
  }
9630
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9809
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9631
9810
  }
9632
9811
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSelect, decorators: [{
9633
9812
  type: Component,
@@ -9859,6 +10038,14 @@ class SdsMultiSelect {
9859
10038
  filterLabel = input('Search', ...(ngDevMode ? [{ debugName: "filterLabel" }] : []));
9860
10039
  /** Visible text of the "select all" row (see {@link showToggleAll}). */
9861
10040
  selectAllLabel = input('Select all', ...(ngDevMode ? [{ debugName: "selectAllLabel" }] : []));
10041
+ /** The panel opened. */
10042
+ opened = output();
10043
+ /**
10044
+ * The panel closed (Escape, Tab, an outside click, a re-click on the field, a footer `close()`), with
10045
+ * the selection at that moment. For "apply on close": take the value here instead of on every
10046
+ * `ngModelChange`. Not emitted when the component is destroyed with the panel open.
10047
+ */
10048
+ closed = output();
9862
10049
  /** Optional projected `<ng-template sdsSelectOption>` — custom option-row rendering. */
9863
10050
  optionTpl = contentChild(SdsSelectOption, ...(ngDevMode ? [{ debugName: "optionTpl" }] : []));
9864
10051
  /** Optional projected `<ng-template sdsSelectEmpty>` — custom no-results content. */
@@ -9990,6 +10177,7 @@ class SdsMultiSelect {
9990
10177
  return;
9991
10178
  this.filterText.set('');
9992
10179
  this.open.set(true);
10180
+ this.opened.emit();
9993
10181
  this.onTouched();
9994
10182
  this.initHighlight();
9995
10183
  afterNextRender(() => {
@@ -10014,6 +10202,7 @@ class SdsMultiSelect {
10014
10202
  this.open.set(false);
10015
10203
  if (returnFocus)
10016
10204
  this.trigger()?.nativeElement.focus();
10205
+ this.closed.emit([...this.value()]);
10017
10206
  }
10018
10207
  clear(event) {
10019
10208
  event.stopPropagation();
@@ -10258,7 +10447,7 @@ class SdsMultiSelect {
10258
10447
  this.close();
10259
10448
  }
10260
10449
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsMultiSelect, deps: [], target: i0.ɵɵFactoryTarget.Component });
10261
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsMultiSelect, isStandalone: true, selector: "sds-multi-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, optionDisabled: { classPropertyName: "optionDisabled", publicName: "optionDisabled", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedLabels: { classPropertyName: "maxSelectedLabels", publicName: "maxSelectedLabels", isSignal: true, isRequired: false, transformFunction: null }, selectedItemsLabel: { classPropertyName: "selectedItemsLabel", publicName: "selectedItemsLabel", isSignal: true, isRequired: false, transformFunction: null }, showToggleAll: { classPropertyName: "showToggleAll", publicName: "showToggleAll", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, removeLabel: { classPropertyName: "removeLabel", publicName: "removeLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, filterLabel: { classPropertyName: "filterLabel", publicName: "filterLabel", isSignal: true, isRequired: false, transformFunction: null }, selectAllLabel: { classPropertyName: "selectAllLabel", publicName: "selectAllLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "block" }, providers: [
10450
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsMultiSelect, isStandalone: true, selector: "sds-multi-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, optionDisabled: { classPropertyName: "optionDisabled", publicName: "optionDisabled", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedLabels: { classPropertyName: "maxSelectedLabels", publicName: "maxSelectedLabels", isSignal: true, isRequired: false, transformFunction: null }, selectedItemsLabel: { classPropertyName: "selectedItemsLabel", publicName: "selectedItemsLabel", isSignal: true, isRequired: false, transformFunction: null }, showToggleAll: { classPropertyName: "showToggleAll", publicName: "showToggleAll", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, removeLabel: { classPropertyName: "removeLabel", publicName: "removeLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, filterLabel: { classPropertyName: "filterLabel", publicName: "filterLabel", isSignal: true, isRequired: false, transformFunction: null }, selectAllLabel: { classPropertyName: "selectAllLabel", publicName: "selectAllLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "block" }, providers: [
10262
10451
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsMultiSelect), multi: true },
10263
10452
  ], queries: [{ propertyName: "optionTpl", first: true, predicate: SdsSelectOption, descendants: true, isSignal: true }, { propertyName: "emptyTpl", first: true, predicate: SdsSelectEmpty, descendants: true, isSignal: true }, { propertyName: "footerTpl", first: true, predicate: SdsSelectFooter, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }], ngImport: i0, template: `
10264
10453
  @if (label()) {
@@ -10436,7 +10625,7 @@ class SdsMultiSelect {
10436
10625
  @if (error()) {
10437
10626
  <p class="mt-1.5 text-xs font-medium text-danger">{{ error() }}</p>
10438
10627
  }
10439
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10628
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10440
10629
  }
10441
10630
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsMultiSelect, decorators: [{
10442
10631
  type: Component,
@@ -10629,7 +10818,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
10629
10818
  }
10630
10819
  `,
10631
10820
  }]
10632
- }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], optionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionDisabled", required: false }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], maxSelectedLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelectedLabels", required: false }] }], selectedItemsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItemsLabel", required: false }] }], showToggleAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToggleAll", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], removeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], filterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLabel", required: false }] }], selectAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllLabel", required: false }] }], optionTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectOption), { isSignal: true }] }], emptyTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectEmpty), { isSignal: true }] }], footerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectFooter), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
10821
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], optionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionDisabled", required: false }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], maxSelectedLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelectedLabels", required: false }] }], selectedItemsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItemsLabel", required: false }] }], showToggleAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToggleAll", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], removeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], filterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLabel", required: false }] }], selectAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllLabel", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], optionTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectOption), { isSignal: true }] }], emptyTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectEmpty), { isSignal: true }] }], footerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectFooter), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
10633
10822
 
10634
10823
  const SDS_PHONE_COUNTRIES = [
10635
10824
  { iso2: 'BE', name: 'Belgium', dialCode: '32', lengths: [9], format: '### ## ## ##', example: '470123456' },
@@ -11288,7 +11477,7 @@ class SdsPhoneInput {
11288
11477
  {{ hint() || autoHint() }}
11289
11478
  </p>
11290
11479
  }
11291
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11480
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11292
11481
  }
11293
11482
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsPhoneInput, decorators: [{
11294
11483
  type: Component,
@@ -11551,7 +11740,7 @@ class SdsPaginator {
11551
11740
  if (this.disabled())
11552
11741
  return `${cls} text-ink-faint opacity-50 cursor-not-allowed`;
11553
11742
  return active
11554
- ? `${cls} bg-brand-600 text-white hover:bg-brand-700 cursor-pointer`
11743
+ ? `${cls} bg-brand-600 text-white hover:bg-brand-700 ${DARK_BRAND_FILL_HOVER} cursor-pointer`
11555
11744
  : `${cls} text-ink-soft hover:bg-muted cursor-pointer`;
11556
11745
  }
11557
11746
  firstPage() {
@@ -11707,7 +11896,7 @@ class SdsPaginator {
11707
11896
  </label>
11708
11897
  }
11709
11898
  </div>
11710
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "component", type: SdsSelect, selector: "sds-select", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "dataKey", "placeholder", "label", "ariaLabel", "hint", "error", "size", "appearance", "disabled", "clearable", "filter", "filterPlaceholder", "emptyMessage", "clearLabel", "filterLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11899
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }, { kind: "component", type: SdsSelect, selector: "sds-select", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "dataKey", "placeholder", "label", "ariaLabel", "hint", "error", "size", "appearance", "disabled", "clearable", "filter", "filterPlaceholder", "emptyMessage", "clearLabel", "filterLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11711
11900
  }
11712
11901
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsPaginator, decorators: [{
11713
11902
  type: Component,
@@ -11961,10 +12150,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
11961
12150
  * Container (role="tablist") for the <sds-tab> headers. Renders the bottom rule
11962
12151
  * and handles roving-focus keyboard navigation (Arrow keys, Home, End) with
11963
12152
  * automatic activation.
12153
+ *
12154
+ * Name the tab set with [ariaLabel] (or [ariaLabelledby] pointing at a visible heading) when the page has
12155
+ * more than one, or when the tabs alone do not say what they switch.
12156
+ *
12157
+ * @example
12158
+ * <sds-tab-list [ariaLabel]="'Order status'">…</sds-tab-list>
11964
12159
  */
11965
12160
  class SdsTabList {
11966
12161
  host = inject(ElementRef);
11967
12162
  store = inject(SdsTabsStore);
12163
+ /** Accessible name of the tablist. */
12164
+ ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
12165
+ /** Id of a visible element that names the tablist (takes precedence over [ariaLabel] for AT). */
12166
+ ariaLabelledby = input('', ...(ngDevMode ? [{ debugName: "ariaLabelledby" }] : []));
11968
12167
  listClass = computed(() => {
11969
12168
  const base = 'relative flex border-b border-border';
11970
12169
  return this.store.scrollable() ? `${base} overflow-x-auto` : base;
@@ -11998,7 +12197,7 @@ class SdsTabList {
11998
12197
  el.click(); // automatic activation
11999
12198
  }
12000
12199
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsTabList, deps: [], target: i0.ɵɵFactoryTarget.Component });
12001
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.25", type: SdsTabList, isStandalone: true, selector: "sds-tab-list", host: { attributes: { "role": "tablist" }, listeners: { "keydown": "onKeydown($event)" }, properties: { "class": "listClass()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
12200
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.25", type: SdsTabList, isStandalone: true, selector: "sds-tab-list", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "tablist" }, listeners: { "keydown": "onKeydown($event)" }, properties: { "class": "listClass()", "attr.aria-label": "ariaLabel() || null", "attr.aria-labelledby": "ariaLabelledby() || null" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
12002
12201
  }
12003
12202
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsTabList, decorators: [{
12004
12203
  type: Component,
@@ -12008,11 +12207,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
12008
12207
  host: {
12009
12208
  role: 'tablist',
12010
12209
  '[class]': 'listClass()',
12210
+ '[attr.aria-label]': 'ariaLabel() || null',
12211
+ '[attr.aria-labelledby]': 'ariaLabelledby() || null',
12011
12212
  '(keydown)': 'onKeydown($event)',
12012
12213
  },
12013
12214
  template: `<ng-content />`,
12014
12215
  }]
12015
- }] });
12216
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledby", required: false }] }] } });
12016
12217
 
12017
12218
  /**
12018
12219
  * A single tab header (role="tab"). Project the label and, optionally, an
@@ -12358,7 +12559,7 @@ class SdsAccordionHeader {
12358
12559
  [class.rotate-180]="panel.open()"
12359
12560
  />
12360
12561
  </button>
12361
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12562
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12362
12563
  }
12363
12564
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsAccordionHeader, decorators: [{
12364
12565
  type: Component,
@@ -14059,7 +14260,7 @@ class SdsTable {
14059
14260
  </div>
14060
14261
  }
14061
14262
  </div>
14062
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "component", type: SdsPaginator, selector: "sds-paginator", inputs: ["totalRecords", "first", "rows", "rowsPerPageOptions", "pageLinkSize", "showFirstLastIcon", "showPageLinks", "showCurrentPageReport", "currentPageReportTemplate", "showJumpToPageInput", "rowsPerPageLabel", "jumpToPageLabel", "paginationLabel", "firstPageLabel", "previousPageLabel", "nextPageLabel", "lastPageLabel", "pageLinkLabel", "jumpToPageAriaLabel", "size", "disabled"], outputs: ["firstChange", "rowsChange", "pageChange"] }, { kind: "component", type: SdsInputNumber, selector: "sds-input-number", inputs: ["label", "ariaLabel", "placeholder", "hint", "error", "invalid", "ariaDescribedby", "size", "appearance", "disabled", "readonly", "mode", "locale", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "min", "max", "step", "showButtons", "buttonLayout", "incrementIcon", "decrementIcon", "allowEmpty", "clearable", "clearLabel", "incrementLabel", "decrementLabel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14263
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }, { kind: "component", type: SdsPaginator, selector: "sds-paginator", inputs: ["totalRecords", "first", "rows", "rowsPerPageOptions", "pageLinkSize", "showFirstLastIcon", "showPageLinks", "showCurrentPageReport", "currentPageReportTemplate", "showJumpToPageInput", "rowsPerPageLabel", "jumpToPageLabel", "paginationLabel", "firstPageLabel", "previousPageLabel", "nextPageLabel", "lastPageLabel", "pageLinkLabel", "jumpToPageAriaLabel", "size", "disabled"], outputs: ["firstChange", "rowsChange", "pageChange"] }, { kind: "component", type: SdsInputNumber, selector: "sds-input-number", inputs: ["label", "ariaLabel", "placeholder", "hint", "error", "invalid", "required", "ariaDescribedby", "size", "appearance", "disabled", "readonly", "mode", "locale", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "min", "max", "step", "showButtons", "buttonLayout", "incrementIcon", "decrementIcon", "allowEmpty", "clearable", "clearLabel", "incrementLabel", "decrementLabel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14063
14264
  }
14064
14265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsTable, decorators: [{
14065
14266
  type: Component,
@@ -14613,7 +14814,7 @@ class SdsToastHost {
14613
14814
  </button>
14614
14815
  </div>
14615
14816
  </ng-template>
14616
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14817
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14617
14818
  }
14618
14819
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsToastHost, decorators: [{
14619
14820
  type: Component,
@@ -14776,7 +14977,7 @@ class SdsThemeToggle {
14776
14977
  >
14777
14978
  <sds-icon [name]="isDark() ? 'sun' : 'moon'" [size]="iconSize()" />
14778
14979
  </button>
14779
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14980
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14780
14981
  }
14781
14982
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsThemeToggle, decorators: [{
14782
14983
  type: Component,
@@ -15019,7 +15220,7 @@ class SdsTopbar {
15019
15220
  </div>
15020
15221
  </div>
15021
15222
  </header>
15022
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15223
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15023
15224
  }
15024
15225
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsTopbar, decorators: [{
15025
15226
  type: Component,
@@ -15414,7 +15615,7 @@ class SdsSidebar {
15414
15615
  <ng-content select="[sdsFooter]" />
15415
15616
  </div>
15416
15617
  </aside>
15417
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15618
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15418
15619
  }
15419
15620
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSidebar, decorators: [{
15420
15621
  type: Component,
@@ -15657,7 +15858,7 @@ class SdsNavGroup {
15657
15858
  <ng-content />
15658
15859
  </div>
15659
15860
  </div>
15660
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15861
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15661
15862
  }
15662
15863
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsNavGroup, decorators: [{
15663
15864
  type: Component,
@@ -15775,7 +15976,7 @@ class SdsNavItem {
15775
15976
  : this.badgeTone() === 'neutral'
15776
15977
  ? 'bg-muted text-ink-soft border border-border'
15777
15978
  : this.store.appearance() === 'surface'
15778
- ? 'bg-brand-600 text-white dark:bg-ink dark:text-surface'
15979
+ ? `bg-brand-600 text-white ${DARK_PRIMARY_BG} ${DARK_ON_PRIMARY}`
15779
15980
  : 'bg-white text-brand-800';
15780
15981
  const base = 'ml-auto inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full px-1.5 ' +
15781
15982
  'text-[11px] font-bold tabular-nums leading-none';
@@ -15860,7 +16061,7 @@ class SdsNavItem {
15860
16061
  <span class="sr-only">, {{ text }}</span>
15861
16062
  }
15862
16063
  </ng-template>
15863
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16064
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15864
16065
  }
15865
16066
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsNavItem, decorators: [{
15866
16067
  type: Component,
@@ -16067,7 +16268,7 @@ class SdsUserMenu {
16067
16268
  </div>
16068
16269
  </div>
16069
16270
  }
16070
- `, isInline: true, styles: [".animate-sds-menu{animation:sds-menu-in .14s ease-out}@keyframes sds-menu-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-menu{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsAvatar, selector: "sds-avatar", inputs: ["name", "initials", "src", "size", "status", "shape", "bgClass", "fallbackIcon", "placeholderClass", "decorative", "lazy"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16271
+ `, isInline: true, styles: [".animate-sds-menu{animation:sds-menu-in .14s ease-out}@keyframes sds-menu-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-menu{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsAvatar, selector: "sds-avatar", inputs: ["name", "initials", "src", "size", "status", "shape", "bgClass", "fallbackIcon", "placeholderClass", "decorative", "lazy"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16071
16272
  }
16072
16273
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsUserMenu, decorators: [{
16073
16274
  type: Component,
@@ -16218,7 +16419,7 @@ class SdsMenuItem {
16218
16419
  <span class="flex-1 truncate text-left">{{ label() }}</span>
16219
16420
  <ng-content />
16220
16421
  </ng-template>
16221
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16422
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16222
16423
  }
16223
16424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsMenuItem, decorators: [{
16224
16425
  type: Component,
@@ -16606,7 +16807,7 @@ class SdsSearchCommand {
16606
16807
  </div>
16607
16808
  </div>
16608
16809
  }
16609
- `, isInline: true, styles: [".animate-sds-cmd{animation:sds-cmd-in .16s ease-out}@keyframes sds-cmd-in{0%{opacity:0;transform:translateY(-10px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(prefers-reduced-motion:reduce){.animate-sds-cmd{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16810
+ `, isInline: true, styles: [".animate-sds-cmd{animation:sds-cmd-in .16s ease-out}@keyframes sds-cmd-in{0%{opacity:0;transform:translateY(-10px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(prefers-reduced-motion:reduce){.animate-sds-cmd{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16610
16811
  }
16611
16812
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSearchCommand, decorators: [{
16612
16813
  type: Component,
@@ -17054,7 +17255,7 @@ class SdsLanguageSwitcher {
17054
17255
  </div>
17055
17256
  </div>
17056
17257
  }
17057
- `, isInline: true, styles: [".animate-sds-menu{animation:sds-menu-in .14s ease-out}@keyframes sds-menu-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-menu{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17258
+ `, isInline: true, styles: [".animate-sds-menu{animation:sds-menu-in .14s ease-out}@keyframes sds-menu-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.animate-sds-menu{animation:none}}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth", "filled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17058
17259
  }
17059
17260
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsLanguageSwitcher, decorators: [{
17060
17261
  type: Component,