@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.
- package/calendar/index.d.ts +277 -0
- package/fesm2022/besaitech-ng-design-system-calendar.mjs +1184 -0
- package/fesm2022/besaitech-ng-design-system-calendar.mjs.map +1 -0
- package/fesm2022/besaitech-ng-design-system.mjs +946 -43
- package/fesm2022/besaitech-ng-design-system.mjs.map +1 -1
- package/index.d.ts +228 -26
- package/package.json +5 -1
- package/themes/base.css +53 -1
|
@@ -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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|