@besaitech/ng-design-system 0.0.77 → 0.0.79

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.
@@ -438,7 +438,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
438
438
  `, styles: [".sds-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:9999px;animation:sds-spin .6s linear infinite}@keyframes sds-spin{to{transform:rotate(360deg)}}\n"] }]
439
439
  }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], block: [{ type: i0.Input, args: [{ isSignal: true, alias: "block", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
440
440
 
441
- let nextId$q = 0;
441
+ let nextId$r = 0;
442
442
  const SIZES$d = {
443
443
  sm: 'h-9 text-sm',
444
444
  md: 'h-10 text-sm',
@@ -451,7 +451,7 @@ const SIZES$d = {
451
451
  * sidebar search field).
452
452
  */
453
453
  class SdsInput {
454
- autoId = `sds-input-${nextId$q++}`;
454
+ autoId = `sds-input-${nextId$r++}`;
455
455
  /**
456
456
  * `id` of the native `<input>` — for a `<label for>` outside the component, or to focus the field with
457
457
  * `document.getElementById(id).focus()` (after adding a row, say). Empty (default) generates one. Set it
@@ -811,7 +811,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
811
811
  `, 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"] }]
812
812
  }], 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"] }] } });
813
813
 
814
- let nextId$p = 0;
814
+ let nextId$q = 0;
815
815
  const HEIGHTS = {
816
816
  sm: 'h-9',
817
817
  md: 'h-10',
@@ -839,7 +839,7 @@ const TEXT = {
839
839
  * with "." ("1.234" in nl-BE) stays a thousands separator.
840
840
  */
841
841
  class SdsInputNumber {
842
- inputId = `sds-input-number-${nextId$p++}`;
842
+ inputId = `sds-input-number-${nextId$q++}`;
843
843
  fieldRef = viewChild('field', ...(ngDevMode ? [{ debugName: "fieldRef" }] : []));
844
844
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
845
845
  /** Accessible name used when no visible [label] is provided. */
@@ -1623,7 +1623,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1623
1623
  }]
1624
1624
  }], 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 }] }] } });
1625
1625
 
1626
- let nextId$o = 0;
1626
+ let nextId$p = 0;
1627
1627
  const SIZES$c = {
1628
1628
  sm: 'h-9 text-sm',
1629
1629
  md: 'h-10 text-sm',
@@ -1664,7 +1664,7 @@ function parseTime(value) {
1664
1664
  * <sds-time-input [ariaLabel]="'Closes at'" [ngModel]="end()" (ngModelChange)="end.set($event)" clearable />
1665
1665
  */
1666
1666
  class SdsTimeInput {
1667
- fieldId = `sds-time-input-${nextId$o++}`;
1667
+ fieldId = `sds-time-input-${nextId$p++}`;
1668
1668
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
1669
1669
  /** Accessible name of the field when there is no visible [label]. */
1670
1670
  ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
@@ -2193,7 +2193,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2193
2193
  }]
2194
2194
  }], propDecorators: { 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 }] }], 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 }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], withSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "withSeconds", required: false }] }], placeholderText: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholderText", required: false }] }], hoursLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hoursLabel", required: false }] }], minutesLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "minutesLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], hoursEl: [{ type: i0.ViewChild, args: ['hoursEl', { isSignal: true }] }], minutesEl: [{ type: i0.ViewChild, args: ['minutesEl', { isSignal: true }] }] } });
2195
2195
 
2196
- let nextId$n = 0;
2196
+ let nextId$o = 0;
2197
2197
  const SIZES$b = {
2198
2198
  sm: 'min-h-9 text-sm',
2199
2199
  md: 'min-h-10 text-sm',
@@ -2216,7 +2216,7 @@ const SIZES$b = {
2216
2216
  * `<sds-localized-input [languages]="['fr','nl','en']" [(ngModel)]="title" />`.
2217
2217
  */
2218
2218
  class SdsLocalizedInput {
2219
- autoId = `sds-localized-input-${nextId$n++}`;
2219
+ autoId = `sds-localized-input-${nextId$o++}`;
2220
2220
  /** The native field's id; a generated one when empty (set it to pair an external `<label for>`). */
2221
2221
  inputId = input('', ...(ngDevMode ? [{ debugName: "inputId" }] : []));
2222
2222
  /** The native field's id: {@link inputId} or the generated one. */
@@ -2576,7 +2576,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2576
2576
  }]
2577
2577
  }], 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 }] }], 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 }] }], requiredLanguages: [{ type: i0.Input, args: [{ isSignal: true, alias: "requiredLanguages", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], showCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCount", required: false }] }], languages: [{ type: i0.Input, args: [{ isSignal: true, alias: "languages", required: false }] }], currentLanguage: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentLanguage", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], languageSwitcherLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "languageSwitcherLabel", required: false }] }], untranslatedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "untranslatedLabel", required: false }] }], requiredLanguageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "requiredLanguageLabel", required: false }] }] } });
2578
2578
 
2579
- let nextId$m = 0;
2579
+ let nextId$n = 0;
2580
2580
  const SIZES$a = {
2581
2581
  md: 'h-12 w-11 text-lg',
2582
2582
  lg: 'h-14 w-12 text-xl',
@@ -2593,7 +2593,7 @@ const SIZES$a = {
2593
2593
  * first box and have it land correctly.
2594
2594
  */
2595
2595
  class SdsOtpInput {
2596
- groupId = `sds-otp-${nextId$m++}`;
2596
+ groupId = `sds-otp-${nextId$n++}`;
2597
2597
  /** How many boxes / characters the code has. */
2598
2598
  length = input(6, ...(ngDevMode ? [{ debugName: "length", transform: numberAttribute }] : [{ transform: numberAttribute }]));
2599
2599
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
@@ -2893,7 +2893,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2893
2893
  }]
2894
2894
  }], ctorParameters: () => [], propDecorators: { length: [{ type: i0.Input, args: [{ isSignal: true, alias: "length", 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 }] }], inputMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputMode", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], autoFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFocus", required: false }] }], cellLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellLabel", required: false }] }], completed: [{ type: i0.Output, args: ["completed"] }], cells: [{ type: i0.ViewChildren, args: ['cell', { isSignal: true }] }] } });
2895
2895
 
2896
- let nextId$l = 0;
2896
+ let nextId$m = 0;
2897
2897
  const SIZES$9 = {
2898
2898
  sm: 'text-sm px-3 py-2',
2899
2899
  md: 'text-sm px-3.5 py-2.5',
@@ -2905,7 +2905,7 @@ const SIZES$9 = {
2905
2905
  * [(ngModel)].
2906
2906
  */
2907
2907
  class SdsTextarea {
2908
- fieldId = `sds-textarea-${nextId$l++}`;
2908
+ fieldId = `sds-textarea-${nextId$m++}`;
2909
2909
  field = viewChild('field', ...(ngDevMode ? [{ debugName: "field" }] : []));
2910
2910
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
2911
2911
  /** Accessible name used when no visible [label] is provided. */
@@ -3172,7 +3172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3172
3172
  }]
3173
3173
  }], ctorParameters: () => [], propDecorators: { field: [{ 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 }] }], 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 }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], autoResize: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoResize", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], showCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCount", required: false }] }], countLimitLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "countLimitLabel", required: false }] }], countLabelTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "countLabelTemplate", required: false }] }], resize: [{ type: i0.Input, args: [{ isSignal: true, alias: "resize", required: false }] }] } });
3174
3174
 
3175
- let nextId$k = 0;
3175
+ let nextId$l = 0;
3176
3176
  const SIZES$8 = {
3177
3177
  sm: { track: 'h-5 w-9', knob: 'h-4 w-4', on: 'translate-x-4', icon: 11 },
3178
3178
  md: { track: 'h-6 w-11', knob: 'h-5 w-5', on: 'translate-x-5', icon: 13 },
@@ -3185,7 +3185,7 @@ const SIZES$8 = {
3185
3185
  * states.
3186
3186
  */
3187
3187
  class SdsToggleSwitch {
3188
- fieldId = `sds-toggle-switch-${nextId$k++}`;
3188
+ fieldId = `sds-toggle-switch-${nextId$l++}`;
3189
3189
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
3190
3190
  /** Accessible name used when no visible [label] is provided. */
3191
3191
  ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
@@ -3432,7 +3432,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3432
3432
  }]
3433
3433
  }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], trueValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "trueValue", required: false }] }], falseValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "falseValue", required: false }] }], onIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "onIcon", required: false }] }], offIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "offIcon", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }] } });
3434
3434
 
3435
- let nextId$j = 0;
3435
+ let nextId$k = 0;
3436
3436
  /**
3437
3437
  * Boolean checkbox. Implements ControlValueAccessor — use with reactive forms
3438
3438
  * or `[(ngModel)]`. Renders a styled box (brand-filled with a check when on)
@@ -3447,7 +3447,7 @@ let nextId$j = 0;
3447
3447
  * <sds-checkbox label="Auto-merge" [(ngModel)]="autoMerge" />
3448
3448
  */
3449
3449
  class SdsCheckbox {
3450
- id = `sds-checkbox-${nextId$j++}`;
3450
+ id = `sds-checkbox-${nextId$k++}`;
3451
3451
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
3452
3452
  /** Accessible name used when no visible [label] is provided. */
3453
3453
  ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
@@ -3595,7 +3595,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3595
3595
  }]
3596
3596
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }] } });
3597
3597
 
3598
- let nextId$i = 0;
3598
+ let nextId$j = 0;
3599
3599
  /**
3600
3600
  * Mounted radios by group name. A pick updates the rest of its group, because a native radio says
3601
3601
  * nothing when the browser unchecks it — without this a reactive form would leave the old choice drawn.
@@ -3621,7 +3621,7 @@ const groups = new Map();
3621
3621
  * <sds-radio name="size" value="large" label="Grand" [(ngModel)]="size" />
3622
3622
  */
3623
3623
  class SdsRadio {
3624
- id = `sds-radio-${nextId$i++}`;
3624
+ id = `sds-radio-${nextId$j++}`;
3625
3625
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
3626
3626
  /** Accessible name used when no visible [label] is provided. */
3627
3627
  ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
@@ -3984,7 +3984,7 @@ const VARIANTS$1 = {
3984
3984
  warning: 'bg-accent-amber-soft text-accent-amber border-transparent',
3985
3985
  danger: 'bg-accent-red-soft text-accent-red border-transparent',
3986
3986
  };
3987
- const DOT = {
3987
+ const DOT$1 = {
3988
3988
  neutral: 'bg-ink-faint',
3989
3989
  brand: 'bg-brand-500',
3990
3990
  info: 'bg-accent-blue',
@@ -4005,7 +4005,7 @@ class SdsBadge {
4005
4005
  : 'px-2.5 py-1 text-[11px]';
4006
4006
  return `${VARIANTS$1[this.variant()]} ${size}`;
4007
4007
  }, ...(ngDevMode ? [{ debugName: "classes" }] : []));
4008
- dotClass = computed(() => DOT[this.variant()], ...(ngDevMode ? [{ debugName: "dotClass" }] : []));
4008
+ dotClass = computed(() => DOT$1[this.variant()], ...(ngDevMode ? [{ debugName: "dotClass" }] : []));
4009
4009
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsBadge, deps: [], target: i0.ɵɵFactoryTarget.Component });
4010
4010
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsBadge, isStandalone: true, selector: "sds-badge", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, dot: { classPropertyName: "dot", publicName: "dot", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex" }, ngImport: i0, template: `
4011
4011
  <span
@@ -4197,7 +4197,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4197
4197
 
4198
4198
  /** Activation order: none → contains → may-contain → none. */
4199
4199
  const ORDER = ['none', 'contains', 'may-contain'];
4200
- let nextId$h = 0;
4200
+ let nextId$i = 0;
4201
4201
  /**
4202
4202
  * A chip that cycles through three states — `none`, `contains`, `may-contain` — built for the 14-tile
4203
4203
  * allergen declaration grid, but generic (any "no / yes / maybe" declaration).
@@ -4217,7 +4217,7 @@ let nextId$h = 0;
4217
4217
  * containsLabel="Contains" mayContainLabel="May contain" noneLabel="Not present" />
4218
4218
  */
4219
4219
  class SdsTriStateChip {
4220
- chipId = `sds-tri-state-chip-${nextId$h++}`;
4220
+ chipId = `sds-tri-state-chip-${nextId$i++}`;
4221
4221
  /** Current state. Two-way: `[(value)]`. */
4222
4222
  value = model('none', ...(ngDevMode ? [{ debugName: "value" }] : []));
4223
4223
  /** Visible name (e.g. the allergen). Required — the chip has no other accessible name. */
@@ -4442,7 +4442,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4442
4442
  }]
4443
4443
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showState: [{ type: i0.Input, args: [{ isSignal: true, alias: "showState", required: false }] }], noneLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "noneLabel", required: false }] }], containsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "containsLabel", required: false }] }], mayContainLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "mayContainLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }] } });
4444
4444
 
4445
- let nextId$g = 0;
4445
+ let nextId$h = 0;
4446
4446
  /**
4447
4447
  * Segmented control: a small set of mutually exclusive options shown side by side (e.g. "Pick exactly /
4448
4448
  * at least / up to"). Radio-group semantics: `role="radiogroup"` with `role="radio"` segments, one tab
@@ -4458,7 +4458,7 @@ let nextId$g = 0;
4458
4458
  */
4459
4459
  class SdsSegmented {
4460
4460
  host = inject(ElementRef);
4461
- baseId = `sds-segmented-${nextId$g++}`;
4461
+ baseId = `sds-segmented-${nextId$h++}`;
4462
4462
  /** Options: `{ value, label, icon?, disabled? }` objects, or bare strings/numbers. */
4463
4463
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
4464
4464
  /** Selected value. Two-way: `[(value)]`. */
@@ -4736,7 +4736,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4736
4736
  `,
4737
4737
  }]
4738
4738
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], count: [{ type: i0.Input, args: [{ isSignal: true, alias: "count", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showCheck: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCheck", required: false }] }] } });
4739
- let nextId$f = 0;
4739
+ let nextId$g = 0;
4740
4740
  /**
4741
4741
  * A set of chips: pick ONE (a filter row such as "All · Missing photo · Hidden", VAT presets, a date
4742
4742
  * range) or, with `multiple`, SEVERAL (categories of an item, days of the week, dietary tags). Unlike
@@ -4759,7 +4759,7 @@ let nextId$f = 0;
4759
4759
  */
4760
4760
  class SdsChipGroup {
4761
4761
  host = inject(ElementRef);
4762
- baseId = `sds-chip-group-${nextId$f++}`;
4762
+ baseId = `sds-chip-group-${nextId$g++}`;
4763
4763
  /** Options: `{ value, label, icon?, count?, disabled? }` objects, or bare strings/numbers. */
4764
4764
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
4765
4765
  /** Picked value (single) or values (multiple). Two-way: `[(value)]`. */
@@ -5661,7 +5661,172 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
5661
5661
  }]
5662
5662
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], image: [{ type: i0.Input, args: [{ isSignal: true, alias: "image", required: false }] }], imageAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageAlt", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], note: [{ type: i0.Input, args: [{ isSignal: true, alias: "note", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], busy: [{ type: i0.Input, args: [{ isSignal: true, alias: "busy", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], availableLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableLabel", required: false }] }], soldOutLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "soldOutLabel", required: false }] }], hiddenLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenLabel", required: false }] }], activate: [{ type: i0.Output, args: ["activate"] }], imageError: [{ type: i0.Output, args: ["imageError"] }] } });
5663
5663
 
5664
- let nextId$e = 0;
5664
+ /** The ordered ramp, `unknown` excluded — it has no position on a scale. */
5665
+ const RAMP = ['mild', 'moderate', 'severe', 'critical'];
5666
+ /**
5667
+ * Class strings are written out in full, one per level, and never composed as
5668
+ * `bg-severity-${level}`. Tailwind scans source text: a class name that only exists once the
5669
+ * expression runs produces no CSS, the component renders unstyled, and nothing warns. Same failure
5670
+ * base.css exists to prevent.
5671
+ */
5672
+ const TINT = {
5673
+ unknown: 'bg-severity-unknown-soft text-severity-unknown',
5674
+ mild: 'bg-severity-mild-soft text-severity-mild',
5675
+ moderate: 'bg-severity-moderate-soft text-severity-moderate',
5676
+ severe: 'bg-severity-severe-soft text-severity-severe',
5677
+ critical: 'bg-severity-critical-fill text-severity-critical-on',
5678
+ };
5679
+ const DOT = {
5680
+ unknown: 'bg-severity-unknown',
5681
+ mild: 'bg-severity-mild',
5682
+ moderate: 'bg-severity-moderate',
5683
+ severe: 'bg-severity-severe',
5684
+ critical: 'bg-severity-critical-on',
5685
+ };
5686
+ const FILLED = {
5687
+ unknown: 'bg-severity-unknown',
5688
+ mild: 'bg-severity-mild',
5689
+ moderate: 'bg-severity-moderate',
5690
+ severe: 'bg-severity-severe',
5691
+ critical: 'bg-severity-critical',
5692
+ };
5693
+ /**
5694
+ * How bad the thing itself is — an allergy's criticality, a reaction, an observation's abnormal
5695
+ * flag, a triage level.
5696
+ *
5697
+ * <b>This is not `sds-badge` with a status colour.</b> Status says what the UI did (saved, failed);
5698
+ * severity says what the record says. A red meaning "save failed" in one place and "anaphylaxis" in
5699
+ * another is a safety problem, so severity has its own measured ramp (see base.css) and its own
5700
+ * shape: five ordered steps that can render as a filled meter, where status is three categorical
5701
+ * states that render as a badge.
5702
+ *
5703
+ * <b>[label] is required and is never defaulted.</b> The component will not invent the word
5704
+ * "Severe" for you: colour alone must not carry meaning (greyscale, colour-blind readers, screen
5705
+ * readers), and a hardcoded English default is the exact bug that ships a trilingual app with one
5706
+ * untranslatable word in it. Pass your own translated text.
5707
+ *
5708
+ * `critical` is filled rather than tinted — the top of a scale should be louder than one more step
5709
+ * of the same treatment.
5710
+ *
5711
+ * @example
5712
+ * <sds-severity level="severe" [label]="'allergy.severe' | translate" />
5713
+ * <sds-severity level="moderate" variant="meter" [label]="'reaction.moderate' | translate" />
5714
+ */
5715
+ class SdsSeverity {
5716
+ level = input.required(...(ngDevMode ? [{ debugName: "level" }] : []));
5717
+ /** The visible wording, in the reader's language. Required on purpose — see the class docs. */
5718
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
5719
+ variant = input('badge', ...(ngDevMode ? [{ debugName: "variant" }] : []));
5720
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
5721
+ /**
5722
+ * Accessible name for the meter, when the visible label alone would not say what the number
5723
+ * means ("Élevée" out of context). Defaults to the label.
5724
+ */
5725
+ ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
5726
+ ramp = RAMP;
5727
+ small = computed(() => this.size() === 'sm', ...(ngDevMode ? [{ debugName: "small" }] : []));
5728
+ tintClass = computed(() => TINT[this.level()], ...(ngDevMode ? [{ debugName: "tintClass" }] : []));
5729
+ dotClass = computed(() => DOT[this.level()], ...(ngDevMode ? [{ debugName: "dotClass" }] : []));
5730
+ fillClass = computed(() => FILLED[this.level()], ...(ngDevMode ? [{ debugName: "fillClass" }] : []));
5731
+ accessibleName = computed(() => this.ariaLabel() || this.label(), ...(ngDevMode ? [{ debugName: "accessibleName" }] : []));
5732
+ /** How many of the four steps are lit. `unknown` lights none: it is not a low score. */
5733
+ reached = computed(() => RAMP.indexOf(this.level()) + 1, ...(ngDevMode ? [{ debugName: "reached" }] : []));
5734
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSeverity, deps: [], target: i0.ɵɵFactoryTarget.Component });
5735
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsSeverity, isStandalone: true, selector: "sds-severity", inputs: { level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex max-w-full" }, ngImport: i0, template: `
5736
+ @if (variant() === 'meter') {
5737
+ <span
5738
+ role="img"
5739
+ [attr.aria-label]="accessibleName()"
5740
+ class="inline-flex min-w-0 items-center gap-2"
5741
+ >
5742
+ <span class="inline-flex shrink-0 items-center gap-0.5" aria-hidden="true">
5743
+ @for (step of ramp; track step; let i = $index) {
5744
+ <span
5745
+ [class]="
5746
+ (small() ? 'h-2.5 w-1.5 ' : 'h-3 w-2 ') +
5747
+ 'rounded-[2px] ' +
5748
+ (i < reached() ? fillClass() : 'bg-border')
5749
+ "
5750
+ ></span>
5751
+ }
5752
+ </span>
5753
+ <span
5754
+ [class]="small() ? 'truncate text-xs' : 'truncate text-sm'"
5755
+ [class.font-medium]="true"
5756
+ >
5757
+ {{ label() }}
5758
+ </span>
5759
+ </span>
5760
+ } @else {
5761
+ <span
5762
+ [class]="
5763
+ tintClass() +
5764
+ ' inline-flex min-w-0 items-center gap-1.5 rounded-full font-medium ' +
5765
+ (small() ? 'h-5 px-2 text-xs' : 'h-6 px-2.5 text-sm')
5766
+ "
5767
+ >
5768
+ <span
5769
+ aria-hidden="true"
5770
+ [class]="dotClass() + ' size-1.5 shrink-0 rounded-full'"
5771
+ [class.opacity-70]="level() === 'unknown'"
5772
+ ></span>
5773
+ <span class="truncate">{{ label() }}</span>
5774
+ </span>
5775
+ }
5776
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
5777
+ }
5778
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSeverity, decorators: [{
5779
+ type: Component,
5780
+ args: [{
5781
+ selector: 'sds-severity',
5782
+ changeDetection: ChangeDetectionStrategy.OnPush,
5783
+ host: { class: 'inline-flex max-w-full' },
5784
+ template: `
5785
+ @if (variant() === 'meter') {
5786
+ <span
5787
+ role="img"
5788
+ [attr.aria-label]="accessibleName()"
5789
+ class="inline-flex min-w-0 items-center gap-2"
5790
+ >
5791
+ <span class="inline-flex shrink-0 items-center gap-0.5" aria-hidden="true">
5792
+ @for (step of ramp; track step; let i = $index) {
5793
+ <span
5794
+ [class]="
5795
+ (small() ? 'h-2.5 w-1.5 ' : 'h-3 w-2 ') +
5796
+ 'rounded-[2px] ' +
5797
+ (i < reached() ? fillClass() : 'bg-border')
5798
+ "
5799
+ ></span>
5800
+ }
5801
+ </span>
5802
+ <span
5803
+ [class]="small() ? 'truncate text-xs' : 'truncate text-sm'"
5804
+ [class.font-medium]="true"
5805
+ >
5806
+ {{ label() }}
5807
+ </span>
5808
+ </span>
5809
+ } @else {
5810
+ <span
5811
+ [class]="
5812
+ tintClass() +
5813
+ ' inline-flex min-w-0 items-center gap-1.5 rounded-full font-medium ' +
5814
+ (small() ? 'h-5 px-2 text-xs' : 'h-6 px-2.5 text-sm')
5815
+ "
5816
+ >
5817
+ <span
5818
+ aria-hidden="true"
5819
+ [class]="dotClass() + ' size-1.5 shrink-0 rounded-full'"
5820
+ [class.opacity-70]="level() === 'unknown'"
5821
+ ></span>
5822
+ <span class="truncate">{{ label() }}</span>
5823
+ </span>
5824
+ }
5825
+ `,
5826
+ }]
5827
+ }], propDecorators: { level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
5828
+
5829
+ let nextId$f = 0;
5665
5830
  /**
5666
5831
  * Marks the element inside `<sds-menu>` that opens it. It may be a native button or a component that
5667
5832
  * renders one (e.g. `<sds-button sdsMenuTrigger>`): the menu wires `aria-haspopup`, `aria-expanded` and
@@ -5709,7 +5874,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
5709
5874
  class SdsMenu {
5710
5875
  host = inject(ElementRef);
5711
5876
  injector = inject(Injector);
5712
- menuId = `sds-menu-${nextId$e++}`;
5877
+ menuId = `sds-menu-${nextId$f++}`;
5713
5878
  triggerId = `${this.menuId}-trigger`;
5714
5879
  /** Actions and separators, in order. */
5715
5880
  items = input([], ...(ngDevMode ? [{ debugName: "items" }] : []));
@@ -6372,7 +6537,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
6372
6537
  standalone: true,
6373
6538
  }]
6374
6539
  }] });
6375
- let nextId$d = 0;
6540
+ let nextId$e = 0;
6376
6541
  /** Fastest auto-scroll step, in px per animation frame (reached at the very edge). */
6377
6542
  const AUTO_SCROLL_MAX_STEP = 18;
6378
6543
  /** The nearest ancestor that scrolls vertically (below the document, which is handled as the window). */
@@ -6441,7 +6606,7 @@ function moveItem(list, from, to) {
6441
6606
  class SdsSortableList {
6442
6607
  host = inject(ElementRef);
6443
6608
  injector = inject(Injector);
6444
- instructionsId = `sds-sortable-${nextId$d++}-help`;
6609
+ instructionsId = `sds-sortable-${nextId$e++}-help`;
6445
6610
  /** The items, in order. Two-way: `[(items)]` receives the new order on drop. */
6446
6611
  items = model([], ...(ngDevMode ? [{ debugName: "items" }] : []));
6447
6612
  /** Property used as a stable identity for rows (strongly recommended). */
@@ -7033,7 +7198,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7033
7198
  }]
7034
7199
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }, { type: i0.Output, args: ["itemsChange"] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], labelField: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelField", required: false }] }], itemLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemLabel", required: false }] }], itemDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemDisabled", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], autoScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoScroll", required: false }] }], autoScrollEdge: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoScrollEdge", required: false }] }], handleLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "handleLabel", required: false }] }], instructions: [{ type: i0.Input, args: [{ isSignal: true, alias: "instructions", required: false }] }], pickedUpMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickedUpMessage", required: false }] }], movedMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "movedMessage", required: false }] }], droppedMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "droppedMessage", required: false }] }], cancelledMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelledMessage", required: false }] }], reorder: [{ type: i0.Output, args: ["reorder"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSortableItem), { isSignal: true }] }], handleTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSortableHandle), { isSignal: true }] }] } });
7035
7200
 
7036
- let nextId$c = 0;
7201
+ let nextId$d = 0;
7037
7202
  /** "1.5 MB" style size (decimal units, like file managers show them), for messages. */
7038
7203
  function sdsFormatBytes(bytes) {
7039
7204
  if (!Number.isFinite(bytes) || bytes < 0)
@@ -7090,7 +7255,7 @@ function sdsFileMatchesAccept(file, accept) {
7090
7255
  * (files)="upload($event)" (rejected)="onRejected($event)" />
7091
7256
  */
7092
7257
  class SdsFileDrop {
7093
- zoneId = `sds-file-drop-${nextId$c++}`;
7258
+ zoneId = `sds-file-drop-${nextId$d++}`;
7094
7259
  fileInput = viewChild('fileInput', ...(ngDevMode ? [{ debugName: "fileInput" }] : []));
7095
7260
  /** Accepted types, native `accept` syntax. Empty = anything. */
7096
7261
  accept = input('', ...(ngDevMode ? [{ debugName: "accept" }] : []));
@@ -7472,7 +7637,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
7472
7637
  }]
7473
7638
  }], 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"] }] } });
7474
7639
 
7475
- let nextId$b = 0;
7640
+ let nextId$c = 0;
7476
7641
  /**
7477
7642
  * Crops an image to a FIXED aspect ratio (e.g. the shop's card ratio): the frame is fixed and the image
7478
7643
  * moves and zooms behind it, always covering the frame, so every crop is valid.
@@ -7490,7 +7655,7 @@ let nextId$b = 0;
7490
7655
  * <sds-button (click)="upload(await cropper.toBlob({ width: 1600 }))">Save</sds-button>
7491
7656
  */
7492
7657
  class SdsImageCropper {
7493
- helpId = `sds-image-cropper-${nextId$b++}-help`;
7658
+ helpId = `sds-image-cropper-${nextId$c++}-help`;
7494
7659
  viewport = viewChild('viewport', ...(ngDevMode ? [{ debugName: "viewport" }] : []));
7495
7660
  /** Image to crop: a URL, or a Blob/File. */
7496
7661
  src = input(null, ...(ngDevMode ? [{ debugName: "src" }] : []));
@@ -8876,7 +9041,7 @@ const SIZES$7 = {
8876
9041
  class SdsDatePicker {
8877
9042
  host = inject(ElementRef);
8878
9043
  injector = inject(Injector);
8879
- fieldId = `sds-date-${nextId$a++}`;
9044
+ fieldId = `sds-date-${nextId$b++}`;
8880
9045
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
8881
9046
  ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
8882
9047
  placeholder = input('dd/mm/yyyy', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
@@ -9394,7 +9559,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
9394
9559
  `,
9395
9560
  }]
9396
9561
  }], 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 }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTime", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], timeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeLabel", required: false }] }], hoursLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hoursLabel", required: false }] }], minutesLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "minutesLabel", required: false }] }], doneLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "doneLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], openCalendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "openCalendarLabel", required: false }] }], closeCalendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeCalendarLabel", required: false }] }], panelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelLabel", required: false }] }], calendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarLabel", required: false }] }], previousLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousLabel", required: false }] }], nextLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextLabel", required: false }] }], todayActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayActionLabel", required: false }] }], clearActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearActionLabel", required: false }] }], calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SdsCalendar), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
9397
- let nextId$a = 0;
9562
+ let nextId$b = 0;
9398
9563
 
9399
9564
  /** Same first and last day (time-of-day ignored). `null` only equals `null`. */
9400
9565
  function isSameRange(a, b) {
@@ -9999,7 +10164,7 @@ const SIZES$6 = {
9999
10164
  class SdsDateRangePicker {
10000
10165
  host = inject(ElementRef);
10001
10166
  injector = inject(Injector);
10002
- uid = nextId$9++;
10167
+ uid = nextId$a++;
10003
10168
  fieldId = `sds-date-range-${this.uid}`;
10004
10169
  labelId = `${this.fieldId}-label`;
10005
10170
  valueId = `${this.fieldId}-value`;
@@ -10515,7 +10680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
10515
10680
  `,
10516
10681
  }]
10517
10682
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], maxDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDays", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], months: [{ type: i0.Input, args: [{ isSignal: true, alias: "months", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", 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 }] }], panelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelLabel", required: false }] }], presetsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "presetsLabel", required: false }] }], startLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startLabel", required: false }] }], endLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endLabel", required: false }] }], applyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "applyLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }], calendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarLabel", required: false }] }], previousLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousLabel", required: false }] }], nextLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextLabel", required: false }] }], presetSelect: [{ type: i0.Output, args: ["presetSelect"] }], calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SdsRangeCalendar), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
10518
- let nextId$9 = 0;
10683
+ let nextId$a = 0;
10519
10684
 
10520
10685
  /**
10521
10686
  * Supplies a custom template for each option row (and the selected value shown
@@ -10599,7 +10764,7 @@ const SIZES$5 = {
10599
10764
  md: 'h-10 text-sm',
10600
10765
  lg: 'h-12 text-base',
10601
10766
  };
10602
- let nextId$8 = 0;
10767
+ let nextId$9 = 0;
10603
10768
  /**
10604
10769
  * Single-select dropdown. Options may be primitives or objects (configure via
10605
10770
  * [optionLabel]/[optionValue]/[optionDisabled]). The overlay is appended to
@@ -10633,7 +10798,7 @@ let nextId$8 = 0;
10633
10798
  class SdsSelect {
10634
10799
  host = inject(ElementRef);
10635
10800
  injector = inject(Injector);
10636
- selectId = `sds-select-${nextId$8++}`;
10801
+ selectId = `sds-select-${nextId$9++}`;
10637
10802
  listId = `${this.selectId}-list`;
10638
10803
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
10639
10804
  optionLabel = input('label', ...(ngDevMode ? [{ debugName: "optionLabel" }] : []));
@@ -11343,7 +11508,7 @@ const SIZES$4 = {
11343
11508
  md: 'min-h-10 text-sm',
11344
11509
  lg: 'min-h-12 text-base',
11345
11510
  };
11346
- let nextId$7 = 0;
11511
+ let nextId$8 = 0;
11347
11512
  /**
11348
11513
  * Multi-select dropdown (value is an array). Options may be primitives or
11349
11514
  * objects (configure via [optionLabel]/[optionValue]/[optionDisabled]). The
@@ -11376,7 +11541,7 @@ let nextId$7 = 0;
11376
11541
  class SdsMultiSelect {
11377
11542
  host = inject(ElementRef);
11378
11543
  injector = inject(Injector);
11379
- selectId = `sds-multiselect-${nextId$7++}`;
11544
+ selectId = `sds-multiselect-${nextId$8++}`;
11380
11545
  listId = `${this.selectId}-list`;
11381
11546
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
11382
11547
  optionLabel = input('label', ...(ngDevMode ? [{ debugName: "optionLabel" }] : []));
@@ -12192,6 +12357,744 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
12192
12357
  }]
12193
12358
  }], 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 }] }] } });
12194
12359
 
12360
+ let nextId$7 = 0;
12361
+ /**
12362
+ * A select whose options come from the server as you type.
12363
+ *
12364
+ * <p><b>Why this is not `[filter]` on `sds-select`.</b> That filter narrows an array the host has
12365
+ * already fetched, which is right for a few dozen services and wrong for every patient a practice
12366
+ * has ever seen: you cannot ship the list to narrow it. Here the query goes to the provider and the
12367
+ * panel shows what comes back.
12368
+ *
12369
+ * <p><b>The dropdown button loads the first page.</b> Opening with an empty query calls
12370
+ * `search('', pageSize)`, so the control is useful before anybody types — a plain select for the
12371
+ * common case, a search for the rest. Set {@link minChars} above 0 if the backing query is too
12372
+ * expensive to run unprompted.
12373
+ *
12374
+ * <p><b>Only the latest response is applied.</b> Each search takes a sequence number and a slower
12375
+ * earlier request is dropped when it lands — otherwise typing fast leaves the panel showing results
12376
+ * for a query that is no longer in the box. Same guard `sds-address-autocomplete` makes.
12377
+ *
12378
+ * <p><b>A value you were given needs its option.</b> The component can only label what it has seen,
12379
+ * so a form that loads with `patientId = 42` shows nothing useful until something fetches 42. Pass
12380
+ * the objects you already hold to {@link selectedOptions} and it labels them without a round trip.
12381
+ * This is the one thing an async select cannot do for you, and silently showing a raw id instead is
12382
+ * how these controls usually get it wrong.
12383
+ *
12384
+ * <p>Takes the same template directives as `sds-select`, so a projected option row works in both:
12385
+ * `sdsSelectOption`, `sdsSelectEmpty`, `sdsSelectFooter`.
12386
+ *
12387
+ * @example
12388
+ * <sds-autocomplete
12389
+ * [search]="findPatients"
12390
+ * optionLabel="fullName"
12391
+ * optionValue="id"
12392
+ * [(ngModel)]="patientId"
12393
+ * [selectedOptions]="known()" />
12394
+ */
12395
+ class SdsAutocomplete {
12396
+ host = inject(ElementRef);
12397
+ injector = inject(Injector);
12398
+ baseId = `sds-autocomplete-${nextId$7++}`;
12399
+ inputId = `${this.baseId}-input`;
12400
+ panelId = `${this.baseId}-panel`;
12401
+ /** Where options come from. Required — this control has no local list to fall back on. */
12402
+ search = input.required(...(ngDevMode ? [{ debugName: "search" }] : []));
12403
+ /** How many to ask for. The "first X" the dropdown shows before anybody types. */
12404
+ pageSize = input(20, ...(ngDevMode ? [{ debugName: "pageSize", transform: numberAttribute }] : [{ transform: numberAttribute }]));
12405
+ /** Characters before a search runs. 0 means opening the panel fetches the first page. */
12406
+ minChars = input(0, ...(ngDevMode ? [{ debugName: "minChars", transform: numberAttribute }] : [{ transform: numberAttribute }]));
12407
+ debounceMs = input(250, ...(ngDevMode ? [{ debugName: "debounceMs", transform: numberAttribute }] : [{ transform: numberAttribute }]));
12408
+ multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
12409
+ display = input('chip', ...(ngDevMode ? [{ debugName: "display" }] : []));
12410
+ optionLabel = input('label', ...(ngDevMode ? [{ debugName: "optionLabel" }] : []));
12411
+ optionValue = input('', ...(ngDevMode ? [{ debugName: "optionValue" }] : []));
12412
+ optionDisabled = input('disabled', ...(ngDevMode ? [{ debugName: "optionDisabled" }] : []));
12413
+ /**
12414
+ * Options for values the control was handed rather than picked — a form loading an existing
12415
+ * record. Without them a written value has no label and the field would show an id.
12416
+ */
12417
+ selectedOptions = input([], ...(ngDevMode ? [{ debugName: "selectedOptions" }] : []));
12418
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
12419
+ ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
12420
+ placeholder = input('Search…', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
12421
+ hint = input('', ...(ngDevMode ? [{ debugName: "hint" }] : []));
12422
+ error = input('', ...(ngDevMode ? [{ debugName: "error" }] : []));
12423
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
12424
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
12425
+ clearable = input(false, ...(ngDevMode ? [{ debugName: "clearable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
12426
+ /** English defaults; an app serving more than one language passes every one of these. */
12427
+ searchingText = input('Searching…', ...(ngDevMode ? [{ debugName: "searchingText" }] : []));
12428
+ emptyMessage = input('No results', ...(ngDevMode ? [{ debugName: "emptyMessage" }] : []));
12429
+ searchErrorText = input("Couldn't search right now. Try again.", ...(ngDevMode ? [{ debugName: "searchErrorText" }] : []));
12430
+ minCharsText = input('Type at least {count} characters', ...(ngDevMode ? [{ debugName: "minCharsText" }] : []));
12431
+ clearLabel = input('Clear selection', ...(ngDevMode ? [{ debugName: "clearLabel" }] : []));
12432
+ removeLabel = input('Remove {label}', ...(ngDevMode ? [{ debugName: "removeLabel" }] : []));
12433
+ openLabel = input('Show options', ...(ngDevMode ? [{ debugName: "openLabel" }] : []));
12434
+ selected = output();
12435
+ opened = output();
12436
+ closed = output();
12437
+ triggerEl = viewChild('trigger', ...(ngDevMode ? [{ debugName: "triggerEl" }] : []));
12438
+ fieldEl = viewChild('field', ...(ngDevMode ? [{ debugName: "fieldEl" }] : []));
12439
+ panelRef = viewChild('panel', ...(ngDevMode ? [{ debugName: "panelRef" }] : []));
12440
+ optionTemplate = contentChild(SdsSelectOption, ...(ngDevMode ? [{ debugName: "optionTemplate" }] : []));
12441
+ emptyTemplate = contentChild(SdsSelectEmpty, ...(ngDevMode ? [{ debugName: "emptyTemplate" }] : []));
12442
+ footerTemplate = contentChild(SdsSelectFooter, ...(ngDevMode ? [{ debugName: "footerTemplate" }] : []));
12443
+ open = signal(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
12444
+ query = signal('', ...(ngDevMode ? [{ debugName: "query" }] : []));
12445
+ results = signal([], ...(ngDevMode ? [{ debugName: "results" }] : []));
12446
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
12447
+ failed = signal(false, ...(ngDevMode ? [{ debugName: "failed" }] : []));
12448
+ active = signal(-1, ...(ngDevMode ? [{ debugName: "active" }] : []));
12449
+ value = signal(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
12450
+ cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : []));
12451
+ /** Every option this control has seen, by value — how a chip keeps its label after a new search. */
12452
+ seen = new Map();
12453
+ timer;
12454
+ seq = 0;
12455
+ destroyed = false;
12456
+ isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
12457
+ tooShort = computed(() => this.minChars() > 0 && this.query().trim().length < this.minChars(), ...(ngDevMode ? [{ debugName: "tooShort" }] : []));
12458
+ /** The chosen options, resolved to objects where we have them. */
12459
+ chosen = computed(() => {
12460
+ for (const option of this.selectedOptions()) {
12461
+ this.seen.set(this.valueOf(option), option);
12462
+ }
12463
+ const current = this.value();
12464
+ const values = this.multiple()
12465
+ ? Array.isArray(current)
12466
+ ? current
12467
+ : []
12468
+ : current === null || current === undefined
12469
+ ? []
12470
+ : [current];
12471
+ return values.map((v) => this.seen.get(v) ?? v);
12472
+ }, ...(ngDevMode ? [{ debugName: "chosen" }] : []));
12473
+ hasValue = computed(() => this.chosen().length > 0, ...(ngDevMode ? [{ debugName: "hasValue" }] : []));
12474
+ /** Closed and single: the field shows the choice. Open or multi: it shows what you typed. */
12475
+ triggerPlaceholder = computed(() => {
12476
+ if (this.multiple() || this.open()) {
12477
+ return this.placeholder();
12478
+ }
12479
+ const [one] = this.chosen();
12480
+ return one === undefined ? this.placeholder() : this.labelOf(one);
12481
+ }, ...(ngDevMode ? [{ debugName: "triggerPlaceholder" }] : []));
12482
+ closeFn = () => this.close();
12483
+ constructor() {
12484
+ afterNextRender(() => this.position(), { injector: this.injector });
12485
+ }
12486
+ // ------------------------------------------------------------------ options
12487
+ labelOf(option) {
12488
+ if (option === null || option === undefined)
12489
+ return '';
12490
+ if (typeof option !== 'object')
12491
+ return String(option);
12492
+ const key = this.optionLabel();
12493
+ const raw = option[key];
12494
+ return raw === undefined || raw === null ? '' : String(raw);
12495
+ }
12496
+ valueOf(option) {
12497
+ const key = this.optionValue();
12498
+ if (!key || option === null || typeof option !== 'object')
12499
+ return option;
12500
+ return option[key];
12501
+ }
12502
+ trackValue(option) {
12503
+ const v = this.valueOf(option);
12504
+ return v === undefined ? option : v;
12505
+ }
12506
+ isOptionDisabled(option) {
12507
+ return (typeof option === 'object' &&
12508
+ option !== null &&
12509
+ !!option[this.optionDisabled()]);
12510
+ }
12511
+ isChosen(option) {
12512
+ const v = this.valueOf(option);
12513
+ const current = this.value();
12514
+ return this.multiple() ? Array.isArray(current) && current.includes(v) : current === v;
12515
+ }
12516
+ optionId(index) {
12517
+ return `${this.baseId}-option-${index}`;
12518
+ }
12519
+ fieldClass() {
12520
+ const h = this.size() === 'sm' ? 'min-h-8' : this.size() === 'lg' ? 'min-h-11' : 'min-h-10';
12521
+ return ('flex w-full flex-wrap items-center gap-1.5 rounded-control border bg-surface px-2.5 py-1 ' +
12522
+ 'focus-within:ring-2 focus-within:ring-brand-500 ' +
12523
+ h +
12524
+ (this.error() ? ' border-danger' : ' border-border') +
12525
+ (this.isDisabled() ? ' cursor-not-allowed opacity-60' : ' cursor-text'));
12526
+ }
12527
+ optionClass(index, option) {
12528
+ return ('flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm ' +
12529
+ (this.isOptionDisabled(option)
12530
+ ? 'cursor-not-allowed text-ink-faint'
12531
+ : index === this.active()
12532
+ ? 'bg-muted text-ink'
12533
+ : 'text-ink hover:bg-muted'));
12534
+ }
12535
+ // ------------------------------------------------------------------ searching
12536
+ onType(event) {
12537
+ this.query.set(event.target.value);
12538
+ this.open.set(true);
12539
+ this.schedule();
12540
+ }
12541
+ openPanel() {
12542
+ if (this.isDisabled() || this.open())
12543
+ return;
12544
+ this.open.set(true);
12545
+ this.opened.emit();
12546
+ this.schedule(0);
12547
+ setTimeout(() => this.position());
12548
+ this.addReflow();
12549
+ }
12550
+ toggle(event) {
12551
+ event.stopPropagation();
12552
+ if (this.open()) {
12553
+ this.close();
12554
+ }
12555
+ else {
12556
+ this.fieldEl()?.nativeElement.focus();
12557
+ this.openPanel();
12558
+ }
12559
+ }
12560
+ schedule(delay = this.debounceMs()) {
12561
+ clearTimeout(this.timer);
12562
+ if (this.tooShort()) {
12563
+ this.results.set([]);
12564
+ this.loading.set(false);
12565
+ return;
12566
+ }
12567
+ this.timer = setTimeout(() => void this.run(), delay);
12568
+ }
12569
+ async run() {
12570
+ const seq = ++this.seq;
12571
+ const query = this.query().trim();
12572
+ this.loading.set(true);
12573
+ this.failed.set(false);
12574
+ try {
12575
+ const rows = await this.search()(query, this.pageSize());
12576
+ if (seq !== this.seq || this.destroyed)
12577
+ return; // a newer search already won
12578
+ for (const row of rows)
12579
+ this.seen.set(this.valueOf(row), row);
12580
+ this.results.set(rows);
12581
+ this.active.set(rows.length ? 0 : -1);
12582
+ }
12583
+ catch {
12584
+ if (seq !== this.seq || this.destroyed)
12585
+ return;
12586
+ this.results.set([]);
12587
+ this.failed.set(true);
12588
+ }
12589
+ finally {
12590
+ if (seq === this.seq && !this.destroyed) {
12591
+ this.loading.set(false);
12592
+ setTimeout(() => this.position());
12593
+ }
12594
+ }
12595
+ }
12596
+ // ------------------------------------------------------------------ choosing
12597
+ pick(option, event) {
12598
+ event?.stopPropagation();
12599
+ if (this.isOptionDisabled(option))
12600
+ return;
12601
+ const v = this.valueOf(option);
12602
+ this.seen.set(v, option);
12603
+ if (!this.multiple()) {
12604
+ this.setValue(v);
12605
+ this.selected.emit(option);
12606
+ this.query.set('');
12607
+ this.close();
12608
+ return;
12609
+ }
12610
+ const current = Array.isArray(this.value()) ? [...this.value()] : [];
12611
+ const at = current.indexOf(v);
12612
+ if (at >= 0) {
12613
+ current.splice(at, 1);
12614
+ }
12615
+ else {
12616
+ current.push(v);
12617
+ this.selected.emit(option);
12618
+ }
12619
+ this.setValue(current);
12620
+ }
12621
+ remove(option, event) {
12622
+ event.stopPropagation();
12623
+ const v = this.valueOf(option);
12624
+ const current = Array.isArray(this.value()) ? [...this.value()] : [];
12625
+ this.setValue(current.filter((x) => x !== v));
12626
+ }
12627
+ clear(event) {
12628
+ event.stopPropagation();
12629
+ this.setValue(this.multiple() ? [] : null);
12630
+ this.query.set('');
12631
+ }
12632
+ onKeydown(event) {
12633
+ switch (event.key) {
12634
+ case 'ArrowDown':
12635
+ event.preventDefault();
12636
+ if (!this.open())
12637
+ return this.openPanel();
12638
+ this.active.set(Math.min(this.results().length - 1, this.active() + 1));
12639
+ return;
12640
+ case 'ArrowUp':
12641
+ event.preventDefault();
12642
+ this.active.set(Math.max(0, this.active() - 1));
12643
+ return;
12644
+ case 'Enter': {
12645
+ const option = this.results()[this.active()];
12646
+ if (this.open() && option !== undefined) {
12647
+ event.preventDefault();
12648
+ this.pick(option);
12649
+ }
12650
+ return;
12651
+ }
12652
+ case 'Escape':
12653
+ if (this.open()) {
12654
+ event.stopPropagation();
12655
+ this.close();
12656
+ }
12657
+ return;
12658
+ case 'Backspace': {
12659
+ // Emptying the box removes the last chip, the way every tag field does.
12660
+ if (this.multiple() && !this.query() && this.chosen().length) {
12661
+ const last = this.chosen()[this.chosen().length - 1];
12662
+ this.setValue(this.value().filter((x) => x !== this.valueOf(last)));
12663
+ }
12664
+ return;
12665
+ }
12666
+ default:
12667
+ return;
12668
+ }
12669
+ }
12670
+ close() {
12671
+ if (!this.open())
12672
+ return;
12673
+ this.open.set(false);
12674
+ this.active.set(-1);
12675
+ this.removeReflow();
12676
+ this.panelRef()?.nativeElement.remove();
12677
+ this.closed.emit(this.value());
12678
+ }
12679
+ onDocumentClick(event) {
12680
+ if (!this.open())
12681
+ return;
12682
+ const target = event.target;
12683
+ const panel = this.panelRef()?.nativeElement;
12684
+ if (!this.host.nativeElement.contains(target) && !panel?.contains(target)) {
12685
+ this.close();
12686
+ }
12687
+ }
12688
+ // --- body-appended overlay positioning (mirrors sds-select) ---
12689
+ reflow = () => this.position();
12690
+ listening = false;
12691
+ addReflow() {
12692
+ if (this.listening)
12693
+ return;
12694
+ window.addEventListener('scroll', this.reflow, true);
12695
+ window.addEventListener('resize', this.reflow);
12696
+ this.listening = true;
12697
+ }
12698
+ removeReflow() {
12699
+ if (!this.listening)
12700
+ return;
12701
+ window.removeEventListener('scroll', this.reflow, true);
12702
+ window.removeEventListener('resize', this.reflow);
12703
+ this.listening = false;
12704
+ }
12705
+ position() {
12706
+ const trigger = this.triggerEl()?.nativeElement;
12707
+ const panel = this.panelRef()?.nativeElement;
12708
+ if (!trigger || !panel)
12709
+ return;
12710
+ if (panel.parentElement !== document.body)
12711
+ document.body.appendChild(panel);
12712
+ const r = trigger.getBoundingClientRect();
12713
+ panel.style.minWidth = `${Math.round(r.width)}px`;
12714
+ const ph = panel.offsetHeight || 240;
12715
+ const gap = 4;
12716
+ const margin = 8;
12717
+ let top = r.bottom + gap;
12718
+ if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {
12719
+ top = r.top - gap - ph;
12720
+ }
12721
+ let left = r.left;
12722
+ const pw = panel.offsetWidth || r.width;
12723
+ if (left + pw > window.innerWidth - margin) {
12724
+ left = Math.max(margin, window.innerWidth - margin - pw);
12725
+ }
12726
+ panel.style.top = `${Math.round(top)}px`;
12727
+ panel.style.left = `${Math.round(left)}px`;
12728
+ }
12729
+ ngOnDestroy() {
12730
+ this.destroyed = true;
12731
+ clearTimeout(this.timer);
12732
+ this.removeReflow();
12733
+ this.panelRef()?.nativeElement.remove();
12734
+ }
12735
+ setValue(v) {
12736
+ this.value.set(v);
12737
+ this.onChange(v);
12738
+ this.onTouched();
12739
+ }
12740
+ // --- ControlValueAccessor ---
12741
+ onChange = () => { };
12742
+ onTouched = () => { };
12743
+ writeValue(value) {
12744
+ this.value.set(value ?? (this.multiple() ? [] : null));
12745
+ }
12746
+ registerOnChange(fn) {
12747
+ this.onChange = fn;
12748
+ }
12749
+ registerOnTouched(fn) {
12750
+ this.onTouched = fn;
12751
+ }
12752
+ setDisabledState(isDisabled) {
12753
+ this.cvaDisabled.set(isDisabled);
12754
+ if (isDisabled)
12755
+ this.close();
12756
+ }
12757
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsAutocomplete, deps: [], target: i0.ɵɵFactoryTarget.Component });
12758
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsAutocomplete, isStandalone: true, selector: "sds-autocomplete", inputs: { search: { classPropertyName: "search", publicName: "search", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, minChars: { classPropertyName: "minChars", publicName: "minChars", isSignal: true, isRequired: false, transformFunction: null }, debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", 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 }, selectedOptions: { classPropertyName: "selectedOptions", publicName: "selectedOptions", 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 }, size: { classPropertyName: "size", publicName: "size", 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 }, searchingText: { classPropertyName: "searchingText", publicName: "searchingText", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, searchErrorText: { classPropertyName: "searchErrorText", publicName: "searchErrorText", isSignal: true, isRequired: false, transformFunction: null }, minCharsText: { classPropertyName: "minCharsText", publicName: "minCharsText", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, removeLabel: { classPropertyName: "removeLabel", publicName: "removeLabel", isSignal: true, isRequired: false, transformFunction: null }, openLabel: { classPropertyName: "openLabel", publicName: "openLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected", opened: "opened", closed: "closed" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "block" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: SdsAutocomplete, multi: true }], queries: [{ propertyName: "optionTemplate", first: true, predicate: SdsSelectOption, descendants: true, isSignal: true }, { propertyName: "emptyTemplate", first: true, predicate: SdsSelectEmpty, descendants: true, isSignal: true }, { propertyName: "footerTemplate", first: true, predicate: SdsSelectFooter, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "triggerEl", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "fieldEl", first: true, predicate: ["field"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: `
12759
+ @if (label()) {
12760
+ <label class="mb-1 block text-sm font-medium text-ink" [attr.for]="inputId">
12761
+ {{ label() }}
12762
+ </label>
12763
+ }
12764
+
12765
+ <div #trigger [class]="fieldClass()" (click)="openPanel()">
12766
+ @if (multiple() && display() === 'chip' && chosen().length) {
12767
+ <span class="flex flex-wrap items-center gap-1">
12768
+ @for (item of chosen(); track trackValue(item)) {
12769
+ <span
12770
+ class="inline-flex max-w-full items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-ink"
12771
+ >
12772
+ <span class="truncate">{{ labelOf(item) }}</span>
12773
+ <button
12774
+ type="button"
12775
+ class="shrink-0 text-ink-faint hover:text-ink"
12776
+ [attr.aria-label]="removeLabel().replace('{label}', labelOf(item))"
12777
+ (click)="remove(item, $event)"
12778
+ >
12779
+ <sds-icon name="x" [size]="12" />
12780
+ </button>
12781
+ </span>
12782
+ }
12783
+ </span>
12784
+ }
12785
+
12786
+ <input
12787
+ #field
12788
+ [id]="inputId"
12789
+ type="text"
12790
+ role="combobox"
12791
+ autocomplete="off"
12792
+ class="min-w-0 flex-1 bg-transparent text-sm text-ink outline-none placeholder:text-ink-faint"
12793
+ [attr.aria-expanded]="open()"
12794
+ [attr.aria-controls]="panelId"
12795
+ [attr.aria-activedescendant]="open() && active() >= 0 ? optionId(active()) : null"
12796
+ [attr.aria-label]="label() ? null : ariaLabel() || null"
12797
+ [placeholder]="triggerPlaceholder()"
12798
+ [disabled]="isDisabled()"
12799
+ [value]="query()"
12800
+ (input)="onType($event)"
12801
+ (keydown)="onKeydown($event)"
12802
+ (focus)="openPanel()"
12803
+ />
12804
+
12805
+ @if (clearable() && hasValue() && !isDisabled()) {
12806
+ <button
12807
+ type="button"
12808
+ class="shrink-0 rounded text-ink-faint hover:text-ink"
12809
+ [attr.aria-label]="clearLabel()"
12810
+ (click)="clear($event)"
12811
+ >
12812
+ <sds-icon name="x" [size]="14" />
12813
+ </button>
12814
+ }
12815
+ <button
12816
+ type="button"
12817
+ class="shrink-0 rounded text-ink-faint hover:text-ink"
12818
+ [attr.aria-label]="openLabel()"
12819
+ [disabled]="isDisabled()"
12820
+ (click)="toggle($event)"
12821
+ >
12822
+ <sds-icon [name]="open() ? 'chevron-up' : 'chevron-down'" [size]="16" />
12823
+ </button>
12824
+ </div>
12825
+
12826
+ @if (hint() && !error()) {
12827
+ <p class="mt-1 text-xs text-ink-soft">{{ hint() }}</p>
12828
+ }
12829
+ @if (error()) {
12830
+ <p class="mt-1 text-xs text-danger">{{ error() }}</p>
12831
+ }
12832
+
12833
+ @if (open()) {
12834
+ <div
12835
+ #panel
12836
+ [id]="panelId"
12837
+ role="listbox"
12838
+ [attr.aria-multiselectable]="multiple() ? 'true' : null"
12839
+ class="fixed z-50 max-h-72 overflow-auto rounded-control border border-border bg-surface py-1 shadow-lg"
12840
+ >
12841
+ @if (loading()) {
12842
+ <p class="px-3 py-2 text-sm text-ink-soft">{{ searchingText() }}</p>
12843
+ } @else if (failed()) {
12844
+ <p class="px-3 py-2 text-sm text-danger">{{ searchErrorText() }}</p>
12845
+ } @else if (!results().length) {
12846
+ @if (tooShort()) {
12847
+ <p class="px-3 py-2 text-sm text-ink-soft">
12848
+ {{ minCharsText().replace('{count}', '' + minChars()) }}
12849
+ </p>
12850
+ } @else if (emptyTemplate()) {
12851
+ <div class="px-3 py-2 text-sm">
12852
+ <ng-container
12853
+ [ngTemplateOutlet]="emptyTemplate()!.template"
12854
+ [ngTemplateOutletContext]="{ $implicit: query(), filterText: query() }"
12855
+ />
12856
+ </div>
12857
+ } @else {
12858
+ <p class="px-3 py-2 text-sm text-ink-soft">{{ emptyMessage() }}</p>
12859
+ }
12860
+ } @else {
12861
+ @for (option of results(); track trackValue(option); let i = $index) {
12862
+ <button
12863
+ type="button"
12864
+ role="option"
12865
+ [id]="optionId(i)"
12866
+ [attr.aria-selected]="isChosen(option)"
12867
+ [disabled]="isOptionDisabled(option)"
12868
+ [class]="optionClass(i, option)"
12869
+ (click)="pick(option, $event)"
12870
+ (mouseenter)="active.set(i)"
12871
+ >
12872
+ @if (multiple()) {
12873
+ <span
12874
+ class="flex size-4 shrink-0 items-center justify-center rounded border"
12875
+ [class]="
12876
+ isChosen(option)
12877
+ ? 'border-brand-500 bg-brand-500 text-white'
12878
+ : 'border-border bg-surface'
12879
+ "
12880
+ aria-hidden="true"
12881
+ >
12882
+ @if (isChosen(option)) {
12883
+ <sds-icon name="check" [size]="11" />
12884
+ }
12885
+ </span>
12886
+ }
12887
+ @if (optionTemplate()) {
12888
+ <ng-container
12889
+ [ngTemplateOutlet]="optionTemplate()!.template"
12890
+ [ngTemplateOutletContext]="{
12891
+ $implicit: option,
12892
+ option: option,
12893
+ label: labelOf(option),
12894
+ value: valueOf(option),
12895
+ selected: isChosen(option),
12896
+ disabled: isOptionDisabled(option),
12897
+ index: i,
12898
+ }"
12899
+ />
12900
+ } @else {
12901
+ <span class="truncate">{{ labelOf(option) }}</span>
12902
+ }
12903
+ </button>
12904
+ }
12905
+ }
12906
+
12907
+ @if (footerTemplate()) {
12908
+ <div class="sticky bottom-0 border-t border-border bg-surface">
12909
+ <ng-container
12910
+ [ngTemplateOutlet]="footerTemplate()!.template"
12911
+ [ngTemplateOutletContext]="{
12912
+ $implicit: query(),
12913
+ filterText: query(),
12914
+ close: closeFn,
12915
+ }"
12916
+ />
12917
+ </div>
12918
+ }
12919
+ </div>
12920
+ }
12921
+ `, 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 });
12922
+ }
12923
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsAutocomplete, decorators: [{
12924
+ type: Component,
12925
+ args: [{
12926
+ selector: 'sds-autocomplete',
12927
+ changeDetection: ChangeDetectionStrategy.OnPush,
12928
+ imports: [NgTemplateOutlet, SdsIcon],
12929
+ host: { class: 'block', '(document:click)': 'onDocumentClick($event)' },
12930
+ providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: SdsAutocomplete, multi: true }],
12931
+ template: `
12932
+ @if (label()) {
12933
+ <label class="mb-1 block text-sm font-medium text-ink" [attr.for]="inputId">
12934
+ {{ label() }}
12935
+ </label>
12936
+ }
12937
+
12938
+ <div #trigger [class]="fieldClass()" (click)="openPanel()">
12939
+ @if (multiple() && display() === 'chip' && chosen().length) {
12940
+ <span class="flex flex-wrap items-center gap-1">
12941
+ @for (item of chosen(); track trackValue(item)) {
12942
+ <span
12943
+ class="inline-flex max-w-full items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-ink"
12944
+ >
12945
+ <span class="truncate">{{ labelOf(item) }}</span>
12946
+ <button
12947
+ type="button"
12948
+ class="shrink-0 text-ink-faint hover:text-ink"
12949
+ [attr.aria-label]="removeLabel().replace('{label}', labelOf(item))"
12950
+ (click)="remove(item, $event)"
12951
+ >
12952
+ <sds-icon name="x" [size]="12" />
12953
+ </button>
12954
+ </span>
12955
+ }
12956
+ </span>
12957
+ }
12958
+
12959
+ <input
12960
+ #field
12961
+ [id]="inputId"
12962
+ type="text"
12963
+ role="combobox"
12964
+ autocomplete="off"
12965
+ class="min-w-0 flex-1 bg-transparent text-sm text-ink outline-none placeholder:text-ink-faint"
12966
+ [attr.aria-expanded]="open()"
12967
+ [attr.aria-controls]="panelId"
12968
+ [attr.aria-activedescendant]="open() && active() >= 0 ? optionId(active()) : null"
12969
+ [attr.aria-label]="label() ? null : ariaLabel() || null"
12970
+ [placeholder]="triggerPlaceholder()"
12971
+ [disabled]="isDisabled()"
12972
+ [value]="query()"
12973
+ (input)="onType($event)"
12974
+ (keydown)="onKeydown($event)"
12975
+ (focus)="openPanel()"
12976
+ />
12977
+
12978
+ @if (clearable() && hasValue() && !isDisabled()) {
12979
+ <button
12980
+ type="button"
12981
+ class="shrink-0 rounded text-ink-faint hover:text-ink"
12982
+ [attr.aria-label]="clearLabel()"
12983
+ (click)="clear($event)"
12984
+ >
12985
+ <sds-icon name="x" [size]="14" />
12986
+ </button>
12987
+ }
12988
+ <button
12989
+ type="button"
12990
+ class="shrink-0 rounded text-ink-faint hover:text-ink"
12991
+ [attr.aria-label]="openLabel()"
12992
+ [disabled]="isDisabled()"
12993
+ (click)="toggle($event)"
12994
+ >
12995
+ <sds-icon [name]="open() ? 'chevron-up' : 'chevron-down'" [size]="16" />
12996
+ </button>
12997
+ </div>
12998
+
12999
+ @if (hint() && !error()) {
13000
+ <p class="mt-1 text-xs text-ink-soft">{{ hint() }}</p>
13001
+ }
13002
+ @if (error()) {
13003
+ <p class="mt-1 text-xs text-danger">{{ error() }}</p>
13004
+ }
13005
+
13006
+ @if (open()) {
13007
+ <div
13008
+ #panel
13009
+ [id]="panelId"
13010
+ role="listbox"
13011
+ [attr.aria-multiselectable]="multiple() ? 'true' : null"
13012
+ class="fixed z-50 max-h-72 overflow-auto rounded-control border border-border bg-surface py-1 shadow-lg"
13013
+ >
13014
+ @if (loading()) {
13015
+ <p class="px-3 py-2 text-sm text-ink-soft">{{ searchingText() }}</p>
13016
+ } @else if (failed()) {
13017
+ <p class="px-3 py-2 text-sm text-danger">{{ searchErrorText() }}</p>
13018
+ } @else if (!results().length) {
13019
+ @if (tooShort()) {
13020
+ <p class="px-3 py-2 text-sm text-ink-soft">
13021
+ {{ minCharsText().replace('{count}', '' + minChars()) }}
13022
+ </p>
13023
+ } @else if (emptyTemplate()) {
13024
+ <div class="px-3 py-2 text-sm">
13025
+ <ng-container
13026
+ [ngTemplateOutlet]="emptyTemplate()!.template"
13027
+ [ngTemplateOutletContext]="{ $implicit: query(), filterText: query() }"
13028
+ />
13029
+ </div>
13030
+ } @else {
13031
+ <p class="px-3 py-2 text-sm text-ink-soft">{{ emptyMessage() }}</p>
13032
+ }
13033
+ } @else {
13034
+ @for (option of results(); track trackValue(option); let i = $index) {
13035
+ <button
13036
+ type="button"
13037
+ role="option"
13038
+ [id]="optionId(i)"
13039
+ [attr.aria-selected]="isChosen(option)"
13040
+ [disabled]="isOptionDisabled(option)"
13041
+ [class]="optionClass(i, option)"
13042
+ (click)="pick(option, $event)"
13043
+ (mouseenter)="active.set(i)"
13044
+ >
13045
+ @if (multiple()) {
13046
+ <span
13047
+ class="flex size-4 shrink-0 items-center justify-center rounded border"
13048
+ [class]="
13049
+ isChosen(option)
13050
+ ? 'border-brand-500 bg-brand-500 text-white'
13051
+ : 'border-border bg-surface'
13052
+ "
13053
+ aria-hidden="true"
13054
+ >
13055
+ @if (isChosen(option)) {
13056
+ <sds-icon name="check" [size]="11" />
13057
+ }
13058
+ </span>
13059
+ }
13060
+ @if (optionTemplate()) {
13061
+ <ng-container
13062
+ [ngTemplateOutlet]="optionTemplate()!.template"
13063
+ [ngTemplateOutletContext]="{
13064
+ $implicit: option,
13065
+ option: option,
13066
+ label: labelOf(option),
13067
+ value: valueOf(option),
13068
+ selected: isChosen(option),
13069
+ disabled: isOptionDisabled(option),
13070
+ index: i,
13071
+ }"
13072
+ />
13073
+ } @else {
13074
+ <span class="truncate">{{ labelOf(option) }}</span>
13075
+ }
13076
+ </button>
13077
+ }
13078
+ }
13079
+
13080
+ @if (footerTemplate()) {
13081
+ <div class="sticky bottom-0 border-t border-border bg-surface">
13082
+ <ng-container
13083
+ [ngTemplateOutlet]="footerTemplate()!.template"
13084
+ [ngTemplateOutletContext]="{
13085
+ $implicit: query(),
13086
+ filterText: query(),
13087
+ close: closeFn,
13088
+ }"
13089
+ />
13090
+ </div>
13091
+ }
13092
+ </div>
13093
+ }
13094
+ `,
13095
+ }]
13096
+ }], ctorParameters: () => [], propDecorators: { search: [{ type: i0.Input, args: [{ isSignal: true, alias: "search", required: true }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], minChars: [{ type: i0.Input, args: [{ isSignal: true, alias: "minChars", required: false }] }], debounceMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceMs", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", 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 }] }], selectedOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedOptions", 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 }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], searchingText: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchingText", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], searchErrorText: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchErrorText", required: false }] }], minCharsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "minCharsText", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], removeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeLabel", required: false }] }], openLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "openLabel", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], triggerEl: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], fieldEl: [{ type: i0.ViewChild, args: ['field', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], optionTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectOption), { isSignal: true }] }], emptyTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectEmpty), { isSignal: true }] }], footerTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdsSelectFooter), { isSignal: true }] }] } });
13097
+
12195
13098
  const SDS_PHONE_COUNTRIES = [
12196
13099
  { iso2: 'BE', name: 'Belgium', dialCode: '32', lengths: [9], format: '### ## ## ##', example: '470123456' },
12197
13100
  { iso2: 'FR', name: 'France', dialCode: '33', lengths: [9], format: '# ## ## ## ##', example: '612345678' },
@@ -20734,5 +21637,5 @@ function provideSdsCharts(config) {
20734
21637
  * Generated bundle index. Do not edit.
20735
21638
  */
20736
21639
 
20737
- export { SDS_ALLERGENS, SDS_ALLERGEN_ICONS, SDS_ALLERGEN_LABELS_EN, SDS_CHART_CONFIG, SDS_CHART_LABELS_EN, SDS_ICONS, SDS_PHONE_COUNTRIES, SDS_THEME_STORAGE_KEY, SDS_UI_PREF_LANG_PARAM, SDS_UI_PREF_THEME_PARAM, SdsAccordion, SdsAccordionContent, SdsAccordionHeader, SdsAccordionPanel, SdsAccordionStore, SdsAddressAutocomplete, SdsAddressExtra, SdsAllergenIcon, SdsAvatar, SdsBadge, SdsBulkBar, SdsButton, SdsCalendar, SdsCard, SdsCheckbox, SdsChecklistRow, SdsChip, SdsChipGroup, SdsDatePicker, SdsDateRangePicker, SdsEnvBanner, SdsFileDrop, SdsFormActions, SdsIcon, SdsImageCropper, SdsInput, SdsInputNumber, SdsLanguageSwitcher, SdsLocalizedInput, SdsMenu, SdsMenuItem, SdsMenuTrigger, SdsMultiSelect, SdsNavGroup, SdsNavItem, SdsOtpInput, SdsPaginator, SdsPhoneInput, SdsRadio, SdsRangeCalendar, SdsScore, SdsSearchCommand, SdsSegmented, SdsSelect, SdsSelectEmpty, SdsSelectFooter, SdsSelectOption, SdsShell, SdsSidebar, SdsSortableHandle, SdsSortableItem, SdsSortableList, SdsStatusTile, SdsTab, SdsTabList, SdsTabPanel, SdsTabPanels, SdsTable, SdsTableCell, SdsTableEmpty, SdsTableHeader, SdsTableRowExpansion, SdsTabs, SdsTabsStore, SdsTextarea, SdsThemeService, SdsThemeToggle, SdsTimeInput, SdsToastHost, SdsToastService, SdsToggleSwitch, SdsTopbar, SdsTriStateChip, SdsUserMenu, SidebarStore, addDays, addMonths, addMonthsKeepDay, appendUiPrefs, diffInDays, formatDateRange, formatDdMmYyyy, formatHhMm, isOutOfRange, isSameDay, isSameRange, isSdsThemeMode, isoDay, pad2, provideSdsCharts, readUiPrefs, sdsFileMatchesAccept, sdsFormatBytes, sdsFormatNational, sdsLastDays, sdsLastMonths, sdsMatchDialCode, sdsNormalizeSignificant, startOfDay, startOfMonth, stripUiPrefs };
21640
+ export { SDS_ALLERGENS, SDS_ALLERGEN_ICONS, SDS_ALLERGEN_LABELS_EN, SDS_CHART_CONFIG, SDS_CHART_LABELS_EN, SDS_ICONS, SDS_PHONE_COUNTRIES, SDS_THEME_STORAGE_KEY, SDS_UI_PREF_LANG_PARAM, SDS_UI_PREF_THEME_PARAM, SdsAccordion, SdsAccordionContent, SdsAccordionHeader, SdsAccordionPanel, SdsAccordionStore, SdsAddressAutocomplete, SdsAddressExtra, SdsAllergenIcon, SdsAutocomplete, SdsAvatar, SdsBadge, SdsBulkBar, SdsButton, SdsCalendar, SdsCard, SdsCheckbox, SdsChecklistRow, SdsChip, SdsChipGroup, SdsDatePicker, SdsDateRangePicker, SdsEnvBanner, SdsFileDrop, SdsFormActions, SdsIcon, SdsImageCropper, SdsInput, SdsInputNumber, SdsLanguageSwitcher, SdsLocalizedInput, SdsMenu, SdsMenuItem, SdsMenuTrigger, SdsMultiSelect, SdsNavGroup, SdsNavItem, SdsOtpInput, SdsPaginator, SdsPhoneInput, SdsRadio, SdsRangeCalendar, SdsScore, SdsSearchCommand, SdsSegmented, SdsSelect, SdsSelectEmpty, SdsSelectFooter, SdsSelectOption, SdsSeverity, SdsShell, SdsSidebar, SdsSortableHandle, SdsSortableItem, SdsSortableList, SdsStatusTile, SdsTab, SdsTabList, SdsTabPanel, SdsTabPanels, SdsTable, SdsTableCell, SdsTableEmpty, SdsTableHeader, SdsTableRowExpansion, SdsTabs, SdsTabsStore, SdsTextarea, SdsThemeService, SdsThemeToggle, SdsTimeInput, SdsToastHost, SdsToastService, SdsToggleSwitch, SdsTopbar, SdsTriStateChip, SdsUserMenu, SidebarStore, addDays, addMonths, addMonthsKeepDay, appendUiPrefs, diffInDays, formatDateRange, formatDdMmYyyy, formatHhMm, isOutOfRange, isSameDay, isSameRange, isSdsThemeMode, isoDay, pad2, provideSdsCharts, readUiPrefs, sdsFileMatchesAccept, sdsFormatBytes, sdsFormatNational, sdsLastDays, sdsLastMonths, sdsMatchDialCode, sdsNormalizeSignificant, startOfDay, startOfMonth, stripUiPrefs };
20738
21641
  //# sourceMappingURL=besaitech-ng-design-system.mjs.map