@ngstarter-ui/components 21.0.49 → 21.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/ai/component-registry.json +92 -22
  2. package/fesm2022/ngstarter-ui-components-confirm.mjs +1 -1
  3. package/fesm2022/ngstarter-ui-components-confirm.mjs.map +1 -1
  4. package/fesm2022/ngstarter-ui-components-country-select.mjs +1 -1
  5. package/fesm2022/ngstarter-ui-components-country-select.mjs.map +1 -1
  6. package/fesm2022/ngstarter-ui-components-currency-select.mjs +1 -1
  7. package/fesm2022/ngstarter-ui-components-currency-select.mjs.map +1 -1
  8. package/fesm2022/ngstarter-ui-components-date-format-select.mjs +1 -1
  9. package/fesm2022/ngstarter-ui-components-date-format-select.mjs.map +1 -1
  10. package/fesm2022/ngstarter-ui-components-dialog.mjs +37 -10
  11. package/fesm2022/ngstarter-ui-components-dialog.mjs.map +1 -1
  12. package/fesm2022/ngstarter-ui-components-filter-builder.mjs +1 -1
  13. package/fesm2022/ngstarter-ui-components-filter-builder.mjs.map +1 -1
  14. package/fesm2022/ngstarter-ui-components-form-builder.mjs +218 -12
  15. package/fesm2022/ngstarter-ui-components-form-builder.mjs.map +1 -1
  16. package/fesm2022/ngstarter-ui-components-image-designer.mjs +1 -1
  17. package/fesm2022/ngstarter-ui-components-image-designer.mjs.map +1 -1
  18. package/fesm2022/ngstarter-ui-components-option.mjs +2 -2
  19. package/fesm2022/ngstarter-ui-components-option.mjs.map +1 -1
  20. package/fesm2022/ngstarter-ui-components-paginator.mjs +1 -1
  21. package/fesm2022/ngstarter-ui-components-paginator.mjs.map +1 -1
  22. package/fesm2022/ngstarter-ui-components-select.mjs +474 -27
  23. package/fesm2022/ngstarter-ui-components-select.mjs.map +1 -1
  24. package/fesm2022/ngstarter-ui-components-stepper.mjs +2 -2
  25. package/fesm2022/ngstarter-ui-components-stepper.mjs.map +1 -1
  26. package/fesm2022/ngstarter-ui-components-timezone-select.mjs +1 -1
  27. package/fesm2022/ngstarter-ui-components-timezone-select.mjs.map +1 -1
  28. package/package.json +1 -1
  29. package/styles/_tokens.scss +1 -1
  30. package/types/ngstarter-ui-components-dialog.d.ts +13 -4
  31. package/types/ngstarter-ui-components-form-builder.d.ts +50 -2
  32. package/types/ngstarter-ui-components-select.d.ts +112 -3
@@ -3423,9 +3423,31 @@
3423
3423
  "docsPath": "/components/dialog",
3424
3424
  "docsOverviewSource": "projects/docs/src/app/components/dialog/overview/overview.html",
3425
3425
  "purpose": "Open custom focused modal workflows above the current page.",
3426
- "useWhen": "Use Dialog.open(ComponentOrTemplate, config) for forms, editing records, creating objects, settings, detail views, wizard-like steps, scrollable content, and custom modal workflows where users must complete or close the task before returning to the page. Structure custom dialog components with ngs-dialog-title, ngs-dialog-content, ngs-dialog-actions, DialogRef.close(...), ngs-dialog-close, and optional DIALOG_DATA. Use DialogConfig for data, sizing, disableClose, autofocus, backdrop, panel classes, and accessibility labels. Do not use for a short binary destructive confirmation; use Confirm. Do not use for global messages; use Announcement, Alert, or SnackBar. Do not use for mobile bottom action panels; use BottomSheet. Do not use for side inspectors, filters, or detail panels; use Drawer or SidePanel.",
3426
+ "useWhen": "Use Dialog.open(ComponentOrTemplate, config) for forms, editing records, creating objects, settings, detail views, wizard-like steps, scrollable content, and custom modal workflows where users must complete or close the task before returning to the page. Structure custom dialog components with ngs-dialog-title, ngs-dialog-content, ngs-dialog-actions, DialogRef.close(...), ngs-dialog-close, and optional DIALOG_DATA. Use DialogConfig for data, sizing, disableClose, autofocus, backdrop, panel classes, accessibility labels, and showCloseButton when the dialog should render the built-in icon close button. Do not use for a short binary destructive confirmation; use Confirm. Do not use for global messages; use Announcement, Alert, or SnackBar. Do not use for mobile bottom action panels; use BottomSheet. Do not use for side inspectors, filters, or detail panels; use Drawer or SidePanel.",
3427
+ "configOptions": [
3428
+ "data",
3429
+ "width",
3430
+ "height",
3431
+ "minWidth",
3432
+ "minHeight",
3433
+ "maxWidth",
3434
+ "maxHeight",
3435
+ "hasBackdrop",
3436
+ "backdropClass",
3437
+ "panelClass",
3438
+ "disableClose",
3439
+ "autoFocus",
3440
+ "restoreFocus",
3441
+ "ariaDescribedBy",
3442
+ "ariaLabelledBy",
3443
+ "ariaLabel",
3444
+ "role",
3445
+ "closeOnNavigation",
3446
+ "showCloseButton"
3447
+ ],
3427
3448
  "exampleTopics": [
3428
3449
  "Basic Dialog",
3450
+ "Dialog Close",
3429
3451
  "Dialog With Scrollable Content",
3430
3452
  "Dialog Sizing (height, min-height)",
3431
3453
  "Dialog scrollable content",
@@ -3447,10 +3469,10 @@
3447
3469
  "source": "<ngs-form-field class=\"w-1/2\">\n <ngs-label>What's your name?</ngs-label>\n <input ngsInput [(ngModel)]=\"name\">\n</ngs-form-field>\n<div>\n <button ngsButton=\"outlined\" (click)=\"openDialog()\">Pick one</button>\n</div>\n@if (animal) {\n <p>You chose: <em>{{ animal }}</em></p>\n}"
3448
3470
  },
3449
3471
  {
3450
- "name": "dialog-scrollable-content",
3451
- "title": "Dialog scrollable content",
3452
- "file": "projects/docs/src/app/components/dialog/_examples/dialog-scrollable-content/dialog-scrollable-content.dialog.html",
3453
- "source": "<h3 ngs-dialog-title>Install Angular</h3>\n<ngs-dialog-content class=\"prose dark:prose-invert max-w-full\">\n <h2>Develop across all platforms</h2>\n <p>Learn one way to build applications with Angular and reuse your code and abilities to build\n apps for any deployment target. For web, mobile web, native mobile and native desktop.</p>\n <h2>Speed &amp; Performance</h2>\n <p>Achieve the maximum speed possible on the Web Platform today, and take it further, via Web\n Workers and server-side rendering. Angular puts you in control over scalability. Meet huge\n data requirements by building data models on RxJS, Immutable.js or another push-model.</p>\n <h3>Incredible tooling</h3>\n <p>Build features quickly with simple, declarative templates. Extend the template language with\n your own components and use a wide array of existing components. Get immediate Angular-specific\n help and feedback with nearly every IDE and editor. All this comes together so you can focus\n on building amazing apps rather than trying to make the code work.</p>\n <h3>Loved by millions</h3>\n <p>From prototype through global deployment, Angular delivers the productivity and scalable\n infrastructure that supports Google's largest applications.</p>\n <h3>What is Angular?</h3>\n <p>Angular is a platform that makes it easy to build applications with the web. Angular\n combines declarative templates, dependency injection, end to end tooling, and integrated\n best practices to solve development challenges. Angular empowers developers to build\n applications that live on the web, mobile, or\n..."
3472
+ "name": "dialog-close-example",
3473
+ "title": "Dialog close",
3474
+ "file": "projects/docs/src/app/components/dialog/_examples/dialog-close-example/dialog-close-example.html",
3475
+ "source": "<button ngsButton=\"filled\" (click)=\"openDialog()\">Open close dialog</button>\n@if (result()) {\n <p class=\"mt-3\">Result: {{ result() }}</p>\n}\n<ng-template #closeDialog>\n <h3 ngs-dialog-title>Close dialog</h3>\n <ngs-dialog-content>\n <p>\n This dialog enables the built-in close button through <code>showCloseButton</code>. Action\n buttons can still use <code>ngs-dialog-close</code> to close the current dialog and optionally\n return a result to the opener.\n </p>\n </ngs-dialog-content>\n <ngs-dialog-actions align=\"end\">\n <button ngsButton ngs-dialog-close>Cancel</button>\n <button ngsButton=\"filled\" [ngs-dialog-close]=\"'Saved changes'\">Save</button>\n </ngs-dialog-actions>\n</ng-template>"
3454
3476
  }
3455
3477
  ],
3456
3478
  "previewAsset": "projects/components/dialog/preview.svg",
@@ -3466,6 +3488,7 @@
3466
3488
  "ngs-dialog-actions",
3467
3489
  "ngs-dialog-container",
3468
3490
  "ngs-dialog-content",
3491
+ "ngs-dialog-header",
3469
3492
  "ngs-dialog-title"
3470
3493
  ],
3471
3494
  "exportedSymbols": [
@@ -3477,6 +3500,7 @@
3477
3500
  "DialogConfig",
3478
3501
  "DialogContainer",
3479
3502
  "DialogContent",
3503
+ "DialogHeader",
3480
3504
  "DialogRef",
3481
3505
  "DialogTitle"
3482
3506
  ],
@@ -4413,6 +4437,7 @@
4413
4437
  "ngs-form-builder",
4414
4438
  "ngs-form-builder-field-host",
4415
4439
  "ngs-form-builder-settings-host",
4440
+ "ngs-form-logic",
4416
4441
  "ngs-form-renderer"
4417
4442
  ],
4418
4443
  "exportedSymbols": [
@@ -4429,6 +4454,7 @@
4429
4454
  "FORM_BUILDER_LAYOUT_BASE_SETTINGS_SCHEMA",
4430
4455
  "FORM_BUILDER_LAYOUT_CONTAINER_BASE_SETTINGS_SCHEMA",
4431
4456
  "FORM_BUILDER_SECTION_BASE_SETTINGS_SCHEMA",
4457
+ "FORM_BUILDER_SELECT_DATA_SOURCES",
4432
4458
  "FORM_BUILDER_SETTINGS",
4433
4459
  "FORM_BUILDER_STATIC_BASE_SETTINGS_SCHEMA",
4434
4460
  "FORM_BUILDER_UPLOAD_CALLBACK",
@@ -4450,6 +4476,9 @@
4450
4476
  "FormBuilderSchema",
4451
4477
  "FormBuilderSection",
4452
4478
  "FormBuilderSectionSettingsContext",
4479
+ "FormBuilderSelectDataSourceDefinition",
4480
+ "FormBuilderSelectDataSourceOptions",
4481
+ "FormBuilderSelectOptionsSource",
4453
4482
  "formBuilderSettings",
4454
4483
  "FormBuilderSettingsConfig",
4455
4484
  "FormBuilderSettingsContext",
@@ -4460,16 +4489,20 @@
4460
4489
  "FormBuilderUploadCallback",
4461
4490
  "FormBuilderUploadContext",
4462
4491
  "FormBuilderValidationRule",
4492
+ "FormLogic",
4463
4493
  "FormRenderer",
4464
4494
  "provideFormBuilder",
4465
4495
  "provideFormBuilderField",
4466
4496
  "provideFormBuilderFields",
4497
+ "provideFormBuilderSelectDataSource",
4498
+ "provideFormBuilderSelectDataSources",
4467
4499
  "validatorsFromRules"
4468
4500
  ],
4469
4501
  "inputs": [
4470
4502
  "canvasDropPlaceholderDelay",
4471
4503
  "control",
4472
4504
  "definitions",
4505
+ "description",
4473
4506
  "editableCanvas",
4474
4507
  "field",
4475
4508
  "inspectorTitle",
@@ -4480,6 +4513,7 @@
4480
4513
  "settingsDefinitions",
4481
4514
  "showSubmit",
4482
4515
  "submitLabel",
4516
+ "title",
4483
4517
  "uploadCallback"
4484
4518
  ],
4485
4519
  "outputs": [
@@ -6029,6 +6063,7 @@
6029
6063
  "Menu With Icons",
6030
6064
  "Menu Divider",
6031
6065
  "Menu Heading",
6066
+ "Data Driven Menu",
6032
6067
  "Menu Header & Footer",
6033
6068
  "Nested Menu",
6034
6069
  "Menu Positioning",
@@ -6051,10 +6086,10 @@
6051
6086
  "source": "<div class=\"w-[300px] h-[300px] p-10 rounded-2xl text-center border border-muted flex items-center justify-center\"\n [ngsContextMenuTriggerFor]=\"contextMenu\">\n Right click here to trigger a context menu\n</div>\n<ngs-menu #contextMenu>\n <button ngs-menu-item>\n <ngs-icon name=\"fluent:cut-24-regular\"/>\n Cut\n </button>\n <button ngs-menu-item>\n <ngs-icon name=\"fluent:copy-24-regular\"/>\n Copy\n </button>\n <button ngs-menu-item>\n <ngs-icon name=\"fluent:clipboard-text-24-regular\"/>\n Paste\n </button>\n <button ngs-menu-item>\n <ngs-icon name=\"fluent:print-24-regular\"/>\n Print\n </button>\n</ngs-menu>"
6052
6087
  },
6053
6088
  {
6054
- "name": "lazy-rendering-example",
6055
- "title": "Lazy rendering",
6056
- "file": "projects/docs/src/app/components/menu/_examples/lazy-rendering-example/lazy-rendering-example.html",
6057
- "source": "<ngs-menu #appMenu=\"ngsMenu\">\n <ng-template ngsMenuContent let-name=\"name\">\n <button ngs-menu-item>Settings</button>\n <button ngs-menu-item>Log off {{name}}</button>\n </ng-template>\n</ngs-menu>\n<button ngsIconButton [ngsMenuTriggerFor]=\"appMenu\" [ngsMenuTriggerData]=\"{name: 'Sally'}\">\n <ngs-icon name=\"fluent:more-vertical-24-regular\"/>\n</button>\n<button ngsIconButton [ngsMenuTriggerFor]=\"appMenu\" [ngsMenuTriggerData]=\"{name: 'Bob'}\">\n <ngs-icon name=\"fluent:more-vertical-24-regular\"/>\n</button>"
6089
+ "name": "data-driven-menu-example",
6090
+ "title": "Data driven menu",
6091
+ "file": "projects/docs/src/app/components/menu/_examples/data-driven-menu-example/data-driven-menu-example.html",
6092
+ "source": "<div class=\"flex flex-col items-start gap-3\">\n <button ngsButton [ngsMenuTriggerFor]=\"projectMenu\">\n Project actions\n </button>\n <span class=\"text-sm text-neutral-600\">{{ selectedAction() }}</span>\n</div>\n<ngs-menu #projectMenu=\"ngsMenu\">\n @for (action of actions; track action.id) {\n <button ngs-menu-item [disabled]=\"action.disabled ?? false\" (click)=\"selectAction(action)\">\n <ngs-icon [name]=\"action.icon\"/>\n <span>{{ action.label }}</span>\n </button>\n }\n</ngs-menu>"
6058
6093
  }
6059
6094
  ],
6060
6095
  "previewAsset": "projects/components/menu/preview.svg",
@@ -8007,10 +8042,12 @@
8007
8042
  "Multiple Selection",
8008
8043
  "Customizing the trigger label",
8009
8044
  "Select with search feature",
8045
+ "Async Data Source",
8010
8046
  "Get set value",
8011
8047
  "Resetting value",
8012
8048
  "Custom trigger",
8013
- "Select search"
8049
+ "Select search",
8050
+ "Async data source select"
8014
8051
  ],
8015
8052
  "minimalExample": "<p>Basic ngs-select</p>\n<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite food</ngs-label>\n <ngs-select>\n @for (food of foods; track food) {\n <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>",
8016
8053
  "exampleFiles": [
@@ -8020,22 +8057,24 @@
8020
8057
  "file": "projects/docs/src/app/forms/select/_examples/basic-select-example/basic-select-example.html",
8021
8058
  "source": "<p>Basic ngs-select</p>\n<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite food</ngs-label>\n <ngs-select>\n @for (food of foods; track food) {\n <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>"
8022
8059
  },
8060
+ {
8061
+ "name": "async-data-source-select-example",
8062
+ "title": "Async data source select",
8063
+ "file": "projects/docs/src/app/forms/select/_examples/async-data-source-select-example/async-data-source-select-example.html",
8064
+ "source": "<ngs-form-field class=\"w-full max-w-md\">\n <ngs-label>Owner</ngs-label>\n <ngs-select\n [formControl]=\"owner\"\n [dataSource]=\"usersDataSource\"\n placeholder=\"Assign owner\"\n searchable\n clearable\n [pageSize]=\"20\"\n [searchDebounce]=\"150\">\n <ng-template ngsOptionContentDef let-user let-label=\"label\">\n <span class=\"flex min-w-0 flex-col\">\n <span class=\"truncate\">{{ user.name }}</span>\n <span class=\"truncate text-xs text-neutral-500\">{{ user.team }} - {{ label }}</span>\n </span>\n </ng-template>\n <ng-template ngsSelectValueDef let-user>\n {{ user.name }} - {{ user.team }}\n </ng-template>\n </ngs-select>\n</ngs-form-field>"
8065
+ },
8023
8066
  {
8024
8067
  "name": "clearable-select-example",
8025
8068
  "title": "Clearable select",
8026
8069
  "file": "projects/docs/src/app/forms/select/_examples/clearable-select-example/clearable-select-example.html",
8027
8070
  "source": "<ngs-form-field class=\"w-1/2\">\n <ngs-label>Status</ngs-label>\n <ngs-select [formControl]=\"status()\" clearable>\n @for (statusOption of statuses(); track statusOption.value) {\n <ngs-option [value]=\"statusOption.value\">{{ statusOption.label }}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>"
8028
- },
8029
- {
8030
- "name": "custom-trigger-example",
8031
- "title": "Custom trigger",
8032
- "file": "projects/docs/src/app/forms/select/_examples/custom-trigger-example/custom-trigger-example.html",
8033
- "source": "<ngs-form-field class=\"w-1/2\">\n <ngs-label>Toppings</ngs-label>\n <ngs-select [formControl]=\"toppings\" multiple>\n <ngs-select-trigger>\n {{ toppings.value?.[0] || '' }}\n @if ((toppings.value?.length || 0) > 1) {\n <span class=\"opacity-75 text-sm\">\n (+{{ (toppings.value?.length || 0) - 1 }} {{ toppings.value?.length === 2 ? 'other' : 'others' }})\n </span>\n }\n </ngs-select-trigger>\n @for (topping of toppingList; track topping) {\n <ngs-option [value]=\"topping\">{{topping}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>"
8034
8071
  }
8035
8072
  ],
8036
8073
  "previewAsset": "projects/components/select/preview.svg",
8037
8074
  "selectors": [
8038
8075
  "ng-template[ngsFilterTriggerValue]",
8076
+ "ng-template[ngsOptionContentDef]",
8077
+ "ng-template[ngsSelectValueDef]",
8039
8078
  "ngs-filter-trigger",
8040
8079
  "ngs-select",
8041
8080
  "ngs-select-body",
@@ -8051,21 +8090,35 @@
8051
8090
  "SELECT",
8052
8091
  "SelectBody",
8053
8092
  "SelectChange",
8093
+ "SelectDataSource",
8094
+ "SelectDataSourceOption",
8095
+ "SelectDataSourceRequest",
8096
+ "SelectDataSourceResult",
8054
8097
  "SelectFooter",
8055
8098
  "SelectHeader",
8056
- "SelectTrigger"
8099
+ "SelectOptionContentContext",
8100
+ "SelectOptionContentDef",
8101
+ "SelectTrigger",
8102
+ "SelectValueContext",
8103
+ "SelectValueDef"
8057
8104
  ],
8058
8105
  "inputs": [
8059
8106
  "aria-describedby",
8060
8107
  "aria-label",
8061
8108
  "clearable",
8109
+ "dataSource",
8062
8110
  "disabled",
8063
8111
  "hideCheckIcon",
8064
8112
  "id",
8113
+ "loadOnOpen",
8065
8114
  "maxCount",
8115
+ "minSearchLength",
8066
8116
  "multiple",
8117
+ "pageSize",
8067
8118
  "placeholder",
8068
8119
  "required",
8120
+ "searchable",
8121
+ "searchDebounce",
8069
8122
  "showZero",
8070
8123
  "tabIndex",
8071
8124
  "value"
@@ -8081,7 +8134,10 @@
8081
8134
  "--ngs-color-on-surface",
8082
8135
  "--ngs-color-on-surface-variant",
8083
8136
  "--ngs-color-outline",
8137
+ "--ngs-color-outline-variant",
8084
8138
  "--ngs-color-primary",
8139
+ "--ngs-color-surface-container-high",
8140
+ "--ngs-color-surface-container-lowest",
8085
8141
  "--ngs-dropdown-bg",
8086
8142
  "--ngs-dropdown-border",
8087
8143
  "--ngs-dropdown-item-gap",
@@ -8106,6 +8162,7 @@
8106
8162
  "--ngs-filter-trigger-gap",
8107
8163
  "--ngs-filter-trigger-value-color",
8108
8164
  "--ngs-filter-trigger-value-font-weight",
8165
+ "--ngs-font-size-sm",
8109
8166
  "--ngs-select-arrow-color",
8110
8167
  "--ngs-select-arrow-container-width",
8111
8168
  "--ngs-select-arrow-size",
@@ -8123,6 +8180,18 @@
8123
8180
  "--ngs-select-panel-max-height",
8124
8181
  "--ngs-select-panel-shadow",
8125
8182
  "--ngs-select-placeholder-color",
8183
+ "--ngs-select-search-bg",
8184
+ "--ngs-select-search-border",
8185
+ "--ngs-select-search-color",
8186
+ "--ngs-select-search-focus-border-color",
8187
+ "--ngs-select-search-font-size",
8188
+ "--ngs-select-search-height",
8189
+ "--ngs-select-search-padding-inline",
8190
+ "--ngs-select-state-action-color",
8191
+ "--ngs-select-state-color",
8192
+ "--ngs-select-state-font-size",
8193
+ "--ngs-select-state-min-height",
8194
+ "--ngs-select-state-padding",
8126
8195
  "--ngs-select-trigger-gap"
8127
8196
  ],
8128
8197
  "example": "<ngs-select [value]=\"value\">...</ngs-select>"
@@ -9251,6 +9320,7 @@
9251
9320
  "useWhen": "Use ngs-stepper with ngs-step when users must move through related steps and see their current progress. Good for onboarding, checkout, setup, import/export flows, account or tenant creation, review flows, and multi-step forms. Use linear mode with stepControl when each step must be valid before the user continues. Use ngsStepperNext and ngsStepperPrevious on NgStarter buttons for standard wizard navigation, ngsStepLabel or label for step labels, optional/completed/error states for step status, and horizontal or vertical orientation for responsive layouts. Do not use Stepper when you only need step state and validation logic without the default visual UI; use HeadlessStepper. Do not use for independent page sections; use Tabs or ExpansionPanel. Do not use for app route navigation; use Navigation, Breadcrumbs, Sidebar, or routing. Do not use for showing only a percentage; use ProgressBar. Do not use for product tours over existing UI; use GuidedTour.",
9252
9321
  "exampleTopics": [
9253
9322
  "Basic Stepper",
9323
+ "Stepper In Dialog",
9254
9324
  "Stepper Vertical",
9255
9325
  "Stepper Header Position",
9256
9326
  "Stepper That Displays Errors In The Steps",
@@ -9273,10 +9343,10 @@
9273
9343
  "source": "<ngs-stepper headerPosition=\"bottom\" #stepper>\n <ngs-step [stepControl]=\"firstFormGroup\">\n <form [formGroup]=\"firstFormGroup\">\n <ng-template ngsStepLabel>Fill out your name</ng-template>\n <ngs-form-field class=\"w-1/2\">\n <input ngsInput placeholder=\"Last name, First name\" formControlName=\"firstCtrl\" required>\n </ngs-form-field>\n <div>\n <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n </div>\n </form>\n </ngs-step>\n <ngs-step [stepControl]=\"secondFormGroup\" optional>\n <form [formGroup]=\"secondFormGroup\">\n <ng-template ngsStepLabel>Fill out your address</ng-template>\n <ngs-form-field class=\"w-1/2\">\n <input ngsInput placeholder=\"Address\" formControlName=\"secondCtrl\" required>\n </ngs-form-field>\n <div class=\"flex gap-3\">\n <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n </div>\n </form>\n </ngs-step>\n <ngs-step>\n <ng-template ngsStepLabel>Done</ng-template>\n You are now done.\n <div class=\"flex gap-3\">\n <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n <button ngsButton=\"filled\" (click)=\"stepper.reset()\">Reset</button>\n </div>\n </ngs-step>\n</ngs-stepper>"
9274
9344
  },
9275
9345
  {
9276
- "name": "stepper-label-bottom-position-example",
9277
- "title": "Stepper label bottom position",
9278
- "file": "projects/docs/src/app/components/stepper/_examples/stepper-label-bottom-position-example/stepper-label-bottom-position-example.html",
9279
- "source": "<ngs-stepper labelPosition=\"bottom\" #stepper>\n <ngs-step [stepControl]=\"firstFormGroup\">\n <form [formGroup]=\"firstFormGroup\">\n <ng-template ngsStepLabel>Fill out your name</ng-template>\n <ngs-form-field class=\"w-1/2 mt-2\">\n <ngs-label>Name</ngs-label>\n <input ngsInput placeholder=\"Last name, First name\" formControlName=\"firstCtrl\" required>\n </ngs-form-field>\n <div>\n <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n </div>\n </form>\n </ngs-step>\n <ngs-step [stepControl]=\"secondFormGroup\" optional>\n <form [formGroup]=\"secondFormGroup\">\n <ng-template ngsStepLabel>Fill out your address</ng-template>\n <ngs-form-field class=\"w-1/2 mt-2\">\n <ngs-label>Address</ngs-label>\n <input ngsInput formControlName=\"secondCtrl\" placeholder=\"Ex. 1 Main St, New York, NY\"\n required>\n </ngs-form-field>\n <div class=\"flex gap-3\">\n <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n </div>\n </form>\n </ngs-step>\n <ngs-step>\n <ng-template ngsStepLabel>Done</ng-template>\n <p>You are now done.</p>\n <div class=\"flex gap-3\">\n <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n <button ngsButton=\"filled\" (click)=\"stepper.reset()\">Reset</button>\n </div>\n </ngs-step>\n</ngs-stepper>"
9346
+ "name": "stepper-in-dialog-example",
9347
+ "title": "Stepper in dialog",
9348
+ "file": "projects/docs/src/app/components/stepper/_examples/stepper-in-dialog-example/stepper-in-dialog-example.html",
9349
+ "source": "<button ngsButton=\"filled\" (click)=\"openDialog()\">Open setup dialog</button>\n@if (result()) {\n <p class=\"mt-3\">Result: {{ result() }}</p>\n}\n<ng-template #setupDialog>\n <h3 ngs-dialog-title>Workspace setup</h3>\n <ngs-dialog-content>\n <ngs-stepper linear #stepper>\n <ngs-step [stepControl]=\"workspaceForm\">\n <ng-template ngsStepLabel>Workspace</ng-template>\n <form [formGroup]=\"workspaceForm\" class=\"grid gap-4 md:grid-cols-2\">\n <ngs-form-field>\n <ngs-label>Workspace name</ngs-label>\n <input\n ngsInput\n formControlName=\"workspaceName\"\n placeholder=\"Atlas Operations\"\n required\n />\n </ngs-form-field>\n <ngs-form-field>\n <ngs-label>Workspace slug</ngs-label>\n <input ngsInput formControlName=\"slug\" placeholder=\"atlas-ops\" required />\n </ngs-form-field>\n <ngs-form-field>\n <ngs-label>Region</ngs-label>\n <input ngsInput formControlName=\"region\" placeholder=\"Europe / Warsaw\" required />\n </ngs-form-field>\n <ngs-form-field>\n <ngs-label>Owner</ngs-label>\n <input ngsInput formControlName=\"owner\" placeholder=\"Maya Chen\" required />\n </ngs-form-field>\n <ngs-form-field class=\"md:col-span-2\">\n <ngs-label>Description</ngs-label>\n <textarea\n ngsInput\n formControlName=\"description\"\n placeholder=\"Describe what this workspace is used for\"\n rows=\"4\"\n required\n..."
9280
9350
  }
9281
9351
  ],
9282
9352
  "previewAsset": "projects/components/stepper/preview.svg",
@@ -9300,11 +9370,11 @@
9300
9370
  ],
9301
9371
  "outputs": [],
9302
9372
  "cssTokens": [
9373
+ "--ngs-color-border",
9303
9374
  "--ngs-color-on-primary",
9304
9375
  "--ngs-color-on-success",
9305
9376
  "--ngs-color-on-surface",
9306
9377
  "--ngs-color-on-surface-variant",
9307
- "--ngs-color-outline-variant",
9308
9378
  "--ngs-color-primary",
9309
9379
  "--ngs-color-success",
9310
9380
  "--ngs-color-surface-container-high",
@@ -28,7 +28,7 @@ class Confirm {
28
28
  title = signal(this._data.title, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
29
29
  description = signal(this._data.description, ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
30
30
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Confirm, deps: [], target: i0.ɵɵFactoryTarget.Component });
31
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: Confirm, isStandalone: true, selector: "ngs-confirm", host: { classAttribute: "ngs-confirm" }, exportAs: ["ngsConfirm"], ngImport: i0, template: "<h3 ngs-dialog-title>{{ title() }}</h3>\n<ngs-dialog-content>\n {{ description() }}\n</ngs-dialog-content>\n<ngs-dialog-actions align=\"end\">\n <button ngsButton [ngs-dialog-close]=\"false\">Cancel</button>\n <button ngsButton=\"filled\" [ngs-dialog-close]=\"true\">Confirm</button>\n</ngs-dialog-actions>\n", styles: [":host{display:block;width:500px}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: Button, selector: " button[ngsButton], button[ngsIconButton], a[ngsButton], a[ngsIconButton] ", inputs: ["ngsButton", "ngsIconButton", "loading", "disabled", "disabledInteractive", "disableRipple", "reverse", "fullWidth", "hideTextOnMobile"], exportAs: ["ngsButton"] }, { kind: "directive", type: DialogClose, selector: "[ngs-dialog-close], [ngsDialogClose]", inputs: ["ngs-dialog-close", "ngsDialogClose", "ariaLabel", "type"], exportAs: ["ngsDialogClose"] }, { kind: "component", type: DialogActions, selector: "ngs-dialog-actions, [ngs-dialog-actions], [ngsDialogActions]", inputs: ["align"] }, { kind: "component", type: DialogContent, selector: "ngs-dialog-content,[ngs-dialog-content],[ngsDialogContent]" }, { kind: "component", type: DialogTitle, selector: "ngs-dialog-title, [ngs-dialog-title], [ngsDialogTitle]", inputs: ["id"], exportAs: ["ngsDialogTitle"] }] });
31
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: Confirm, isStandalone: true, selector: "ngs-confirm", host: { classAttribute: "ngs-confirm" }, exportAs: ["ngsConfirm"], ngImport: i0, template: "<h3 ngs-dialog-title>{{ title() }}</h3>\n<ngs-dialog-content>\n {{ description() }}\n</ngs-dialog-content>\n<ngs-dialog-actions align=\"end\">\n <button ngsButton [ngs-dialog-close]=\"false\">Cancel</button>\n <button ngsButton=\"filled\" [ngs-dialog-close]=\"true\">Confirm</button>\n</ngs-dialog-actions>\n", styles: [":host{display:block;width:500px}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: Button, selector: " button[ngsButton], button[ngsIconButton], a[ngsButton], a[ngsIconButton] ", inputs: ["ngsButton", "ngsIconButton", "loading", "disabled", "disabledInteractive", "disableRipple", "reverse", "fullWidth", "hideTextOnMobile"], exportAs: ["ngsButton"] }, { kind: "directive", type: DialogClose, selector: "[ngs-dialog-close],[ngsDialogClose]", inputs: ["ngs-dialog-close", "ngsDialogClose", "ariaLabel", "type"], exportAs: ["ngsDialogClose"] }, { kind: "component", type: DialogActions, selector: "ngs-dialog-actions, [ngs-dialog-actions], [ngsDialogActions]", inputs: ["align"] }, { kind: "component", type: DialogContent, selector: "ngs-dialog-content,[ngs-dialog-content],[ngsDialogContent]" }, { kind: "component", type: DialogTitle, selector: "ngs-dialog-title, [ngs-dialog-title], [ngsDialogTitle]", inputs: ["id"], exportAs: ["ngsDialogTitle"] }] });
32
32
  }
33
33
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Confirm, decorators: [{
34
34
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"ngstarter-ui-components-confirm.mjs","sources":["../../../projects/components/confirm/src/confirm-ref.ts","../../../projects/components/confirm/src/confirm/confirm.ts","../../../projects/components/confirm/src/confirm/confirm.html","../../../projects/components/confirm/src/confirm-manager.ts","../../../projects/components/confirm/ngstarter-ui-components-confirm.ts"],"sourcesContent":["import { EventEmitter } from '@angular/core';\n\nexport class ConfirmRef {\n readonly canceled = new EventEmitter();\n readonly confirmed = new EventEmitter();\n readonly closed = new EventEmitter();\n\n close(): void {\n this.closed.emit();\n }\n\n cancel(): void {\n this.canceled.emit();\n this.close();\n }\n\n confirm(): void {\n this.confirmed.emit();\n this.close();\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { DIALOG_DATA } from '@angular/cdk/dialog';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { DialogActions, DialogClose, DialogContent, DialogTitle } from '@ngstarter-ui/components/dialog';\n\n@Component({\n selector: 'ngs-confirm',\n exportAs: 'ngsConfirm',\n imports: [\n ReactiveFormsModule,\n Button,\n DialogClose,\n DialogActions,\n DialogContent,\n DialogTitle\n ],\n templateUrl: './confirm.html',\n styleUrl: './confirm.scss',\n host: {\n 'class': 'ngs-confirm'\n }\n})\nexport class Confirm {\n private _data = inject(DIALOG_DATA);\n\n title = signal(this._data.title);\n description = signal(this._data.description);\n}\n","<h3 ngs-dialog-title>{{ title() }}</h3>\n<ngs-dialog-content>\n {{ description() }}\n</ngs-dialog-content>\n<ngs-dialog-actions align=\"end\">\n <button ngsButton [ngs-dialog-close]=\"false\">Cancel</button>\n <button ngsButton=\"filled\" [ngs-dialog-close]=\"true\">Confirm</button>\n</ngs-dialog-actions>\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { ConfirmOptions } from './types';\nimport { ConfirmRef } from './confirm-ref';\nimport { Confirm } from './confirm/confirm';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Dialog } from '@ngstarter-ui/components/dialog';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfirmManager {\n private _dialog = inject(Dialog);\n private _destroyRef = inject(DestroyRef);\n\n open(options: ConfirmOptions): ConfirmRef {\n const confirmRef = new ConfirmRef();\n const dialogRef = this._dialog.open(Confirm, {\n data: options,\n closeOnNavigation: true,\n disableClose: true\n });\n dialogRef\n .afterClosed()\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((isConfirmed: boolean) => {\n if (isConfirmed) {\n confirmRef.confirm();\n } else {\n confirmRef.cancel();\n }\n });\n return confirmRef;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngstarter-ui-components-confirm.mjs","sources":["../../../projects/components/confirm/src/confirm-ref.ts","../../../projects/components/confirm/src/confirm/confirm.ts","../../../projects/components/confirm/src/confirm/confirm.html","../../../projects/components/confirm/src/confirm-manager.ts","../../../projects/components/confirm/ngstarter-ui-components-confirm.ts"],"sourcesContent":["import { EventEmitter } from '@angular/core';\n\nexport class ConfirmRef {\n readonly canceled = new EventEmitter();\n readonly confirmed = new EventEmitter();\n readonly closed = new EventEmitter();\n\n close(): void {\n this.closed.emit();\n }\n\n cancel(): void {\n this.canceled.emit();\n this.close();\n }\n\n confirm(): void {\n this.confirmed.emit();\n this.close();\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { DIALOG_DATA } from '@angular/cdk/dialog';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { DialogActions, DialogClose, DialogContent, DialogTitle } from '@ngstarter-ui/components/dialog';\n\n@Component({\n selector: 'ngs-confirm',\n exportAs: 'ngsConfirm',\n imports: [\n ReactiveFormsModule,\n Button,\n DialogClose,\n DialogActions,\n DialogContent,\n DialogTitle\n ],\n templateUrl: './confirm.html',\n styleUrl: './confirm.scss',\n host: {\n 'class': 'ngs-confirm'\n }\n})\nexport class Confirm {\n private _data = inject(DIALOG_DATA);\n\n title = signal(this._data.title);\n description = signal(this._data.description);\n}\n","<h3 ngs-dialog-title>{{ title() }}</h3>\n<ngs-dialog-content>\n {{ description() }}\n</ngs-dialog-content>\n<ngs-dialog-actions align=\"end\">\n <button ngsButton [ngs-dialog-close]=\"false\">Cancel</button>\n <button ngsButton=\"filled\" [ngs-dialog-close]=\"true\">Confirm</button>\n</ngs-dialog-actions>\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { ConfirmOptions } from './types';\nimport { ConfirmRef } from './confirm-ref';\nimport { Confirm } from './confirm/confirm';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Dialog } from '@ngstarter-ui/components/dialog';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfirmManager {\n private _dialog = inject(Dialog);\n private _destroyRef = inject(DestroyRef);\n\n open(options: ConfirmOptions): ConfirmRef {\n const confirmRef = new ConfirmRef();\n const dialogRef = this._dialog.open(Confirm, {\n data: options,\n closeOnNavigation: true,\n disableClose: true\n });\n dialogRef\n .afterClosed()\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((isConfirmed: boolean) => {\n if (isConfirmed) {\n confirmRef.confirm();\n } else {\n confirmRef.cancel();\n }\n });\n return confirmRef;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MAEa,UAAU,CAAA;AACZ,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAE;AAC7B,IAAA,SAAS,GAAG,IAAI,YAAY,EAAE;AAC9B,IAAA,MAAM,GAAG,IAAI,YAAY,EAAE;IAEpC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QACpB,IAAI,CAAC,KAAK,EAAE;IACd;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACrB,IAAI,CAAC,KAAK,EAAE;IACd;AACD;;MCGY,OAAO,CAAA;AACV,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IAEnC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAChC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;uGAJjC,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBpB,yTAQA,EAAA,MAAA,EAAA,CAAA,uGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,MAAM,EAAA,QAAA,EAAA,mFAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,WAAW,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,aAAa,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,aAAa,uGACb,WAAW,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAQF,OAAO,EAAA,UAAA,EAAA,CAAA;kBAjBnB,SAAS;+BACE,aAAa,EAAA,QAAA,EACb,YAAY,EAAA,OAAA,EACb;wBACP,mBAAmB;wBACnB,MAAM;wBACN,WAAW;wBACX,aAAa;wBACb,aAAa;wBACb;qBACD,EAAA,IAAA,EAGK;AACJ,wBAAA,OAAO,EAAE;AACV,qBAAA,EAAA,QAAA,EAAA,yTAAA,EAAA,MAAA,EAAA,CAAA,uGAAA,CAAA,EAAA;;;MEXU,cAAc,CAAA;AACjB,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAExC,IAAA,IAAI,CAAC,OAAuB,EAAA;AAC1B,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;AAC3C,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,YAAY,EAAE;AACf,SAAA,CAAC;QACF;AACG,aAAA,WAAW;AACX,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AACzC,aAAA,SAAS,CAAC,CAAC,WAAoB,KAAI;YAClC,IAAI,WAAW,EAAE;gBACf,UAAU,CAAC,OAAO,EAAE;YACtB;iBAAO;gBACL,UAAU,CAAC,MAAM,EAAE;YACrB;AACF,QAAA,CAAC,CAAC;AACJ,QAAA,OAAO,UAAU;IACnB;uGAtBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACTD;;AAEG;;;;"}
@@ -557,7 +557,7 @@ class CountrySelect {
557
557
  provide: FormFieldControl,
558
558
  useExisting: forwardRef(() => CountrySelect),
559
559
  },
560
- ], viewQueries: [{ propertyName: "ngsSelect", first: true, predicate: ["ngsSelect"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], exportAs: ["ngsCountrySelect"], ngImport: i0, template: "<ngs-select\n #ngsSelect\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event)\"\n (opened)=\"onSelectOpened()\"\n (closed)=\"onSelectClosed()\"\n [id]=\"id + '-select'\"\n [placeholder]=\"placeholder\"\n [required]=\"isRequiredSignal()\"\n [disabled]=\"isDisabledSignal()\"\n [multiple]=\"multiple()\"\n [hideCheckIcon]=\"hideCheckIcon()\"\n [clearable]=\"clearable()\"\n [aria-label]=\"ariaLabel()\"\n [tabIndex]=\"tabIndex()\"\n [aria-describedby]=\"ariaDescribedby()\">\n <ngs-select-trigger class=\"select-trigger\">\n @let selectedCountries = selectedCountryDisplays();\n @if (selectedCountries.length === 1) {\n @let selectedCountry = selectedCountries[0];\n <span class=\"ngs-select-trigger-content\">\n <span class=\"flag-icon\" aria-hidden=\"true\">{{ selectedCountry.flag }}</span>\n <span class=\"ngs-select-trigger-text\">\n {{ selectedCountry.name }}\n @if (showCountryCode()) {\n <span class=\"code\">({{ selectedCountry.code }})</span>\n }\n </span>\n </span>\n } @else if (selectedCountries.length > 1) {\n <span class=\"ngs-select-trigger-content\">\n <span class=\"ngs-select-trigger-text\">\n {{ selectedCountriesText() }}\n </span>\n </span>\n }\n\n </ngs-select-trigger>\n\n <ngs-select-header>\n <div class=\"sticky top-0 z-1 bg-surface-container-lowest\">\n <input #searchInput\n type=\"text\"\n placeholder=\"Search...\"\n autocomplete=\"off\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onCountrySearch($event)\"\n class=\"w-full text-sm focus:outline-none border-b border-surface-container-high focus:border-b-primary h-14 px-3\">\n @if (searchTerm().trim()) {\n <div class=\"absolute end-1 top-1/2 -translate-y-1/2\">\n <button\n ngsIconButton\n (click)=\"clearSearch($event)\"\n class=\"clear-button\"\n type=\"button\"\n aria-label=\"Clear search\">\n <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n </button>\n </div>\n }\n </div>\n </ngs-select-header>\n\n @for (country of visibleCountries(); track country.code) {\n <ngs-option [value]=\"country.code\">\n <div class=\"flex items-center gap-2\">\n <span class=\"select-option-icon text-2xl\" aria-hidden=\"true\">{{ country.flag }}</span>\n <span class=\"select-option-text\">\n {{ country.name }}\n @if (showCountryCode()) {\n <span class=\"code\">({{ country.code }})</span>\n }\n </span>\n </div>\n </ngs-option>\n } @empty {\n @if (searchTerm()) {\n <div class=\"text-sm px-4 py-3\">\n <span i18n>Country not found</span>.\n </div>\n }\n }\n\n @if (visibleCountryCount() < filteredCountries().length) {\n <div class=\"select-loading\">\n Loading more countries...\n </div>\n }\n</ngs-select>\n", styles: [":host{display:block}:host .flag-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;font-size:22px;line-height:1}:host .select-option-content{display:flex;align-items:center;gap:var(--ngs-dropdown-item-gap);min-width:0;width:100%;height:100%;overflow:hidden;white-space:nowrap}:host .select-option-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .code{text-transform:uppercase;color:var(--ngs-color-neutral-500)}:host .select-loading{padding:calc(var(--spacing, .25rem) * 2) calc(var(--spacing, .25rem) * 4);color:var(--ngs-color-on-surface-variant);font-size:var(--ngs-font-size-sm)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: Option, selector: "ngs-option", inputs: ["value", "data", "disabled", "selected"], outputs: ["onSelectionChange"], exportAs: ["ngsOption"] }, { kind: "component", type: Icon, selector: "ngs-icon", inputs: ["name"], exportAs: ["ngsIcon"] }, { kind: "component", type: Select, selector: "ngs-select", inputs: ["id", "placeholder", "disabled", "required", "multiple", "hideCheckIcon", "clearable", "aria-label", "tabIndex", "aria-describedby", "value"], outputs: ["selectionChange", "opened", "closed", "valueChange"], exportAs: ["ngsSelect"] }, { kind: "directive", type: SelectTrigger, selector: "ngs-select-trigger" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: Button, selector: " button[ngsButton], button[ngsIconButton], a[ngsButton], a[ngsIconButton] ", inputs: ["ngsButton", "ngsIconButton", "loading", "disabled", "disabledInteractive", "disableRipple", "reverse", "fullWidth", "hideTextOnMobile"], exportAs: ["ngsButton"] }, { kind: "component", type: SelectHeader, selector: "ngs-select-header" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
560
+ ], viewQueries: [{ propertyName: "ngsSelect", first: true, predicate: ["ngsSelect"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], exportAs: ["ngsCountrySelect"], ngImport: i0, template: "<ngs-select\n #ngsSelect\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event)\"\n (opened)=\"onSelectOpened()\"\n (closed)=\"onSelectClosed()\"\n [id]=\"id + '-select'\"\n [placeholder]=\"placeholder\"\n [required]=\"isRequiredSignal()\"\n [disabled]=\"isDisabledSignal()\"\n [multiple]=\"multiple()\"\n [hideCheckIcon]=\"hideCheckIcon()\"\n [clearable]=\"clearable()\"\n [aria-label]=\"ariaLabel()\"\n [tabIndex]=\"tabIndex()\"\n [aria-describedby]=\"ariaDescribedby()\">\n <ngs-select-trigger class=\"select-trigger\">\n @let selectedCountries = selectedCountryDisplays();\n @if (selectedCountries.length === 1) {\n @let selectedCountry = selectedCountries[0];\n <span class=\"ngs-select-trigger-content\">\n <span class=\"flag-icon\" aria-hidden=\"true\">{{ selectedCountry.flag }}</span>\n <span class=\"ngs-select-trigger-text\">\n {{ selectedCountry.name }}\n @if (showCountryCode()) {\n <span class=\"code\">({{ selectedCountry.code }})</span>\n }\n </span>\n </span>\n } @else if (selectedCountries.length > 1) {\n <span class=\"ngs-select-trigger-content\">\n <span class=\"ngs-select-trigger-text\">\n {{ selectedCountriesText() }}\n </span>\n </span>\n }\n\n </ngs-select-trigger>\n\n <ngs-select-header>\n <div class=\"sticky top-0 z-1 bg-surface-container-lowest\">\n <input #searchInput\n type=\"text\"\n placeholder=\"Search...\"\n autocomplete=\"off\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onCountrySearch($event)\"\n class=\"w-full text-sm focus:outline-none border-b border-surface-container-high focus:border-b-primary h-14 px-3\">\n @if (searchTerm().trim()) {\n <div class=\"absolute end-1 top-1/2 -translate-y-1/2\">\n <button\n ngsIconButton\n (click)=\"clearSearch($event)\"\n class=\"clear-button\"\n type=\"button\"\n aria-label=\"Clear search\">\n <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n </button>\n </div>\n }\n </div>\n </ngs-select-header>\n\n @for (country of visibleCountries(); track country.code) {\n <ngs-option [value]=\"country.code\">\n <div class=\"flex items-center gap-2\">\n <span class=\"select-option-icon text-2xl\" aria-hidden=\"true\">{{ country.flag }}</span>\n <span class=\"select-option-text\">\n {{ country.name }}\n @if (showCountryCode()) {\n <span class=\"code\">({{ country.code }})</span>\n }\n </span>\n </div>\n </ngs-option>\n } @empty {\n @if (searchTerm()) {\n <div class=\"text-sm px-4 py-3\">\n <span i18n>Country not found</span>.\n </div>\n }\n }\n\n @if (visibleCountryCount() < filteredCountries().length) {\n <div class=\"select-loading\">\n Loading more countries...\n </div>\n }\n</ngs-select>\n", styles: [":host{display:block}:host .flag-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;font-size:22px;line-height:1}:host .select-option-content{display:flex;align-items:center;gap:var(--ngs-dropdown-item-gap);min-width:0;width:100%;height:100%;overflow:hidden;white-space:nowrap}:host .select-option-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .code{text-transform:uppercase;color:var(--ngs-color-neutral-500)}:host .select-loading{padding:calc(var(--spacing, .25rem) * 2) calc(var(--spacing, .25rem) * 4);color:var(--ngs-color-on-surface-variant);font-size:var(--ngs-font-size-sm)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: Option, selector: "ngs-option", inputs: ["value", "data", "disabled", "selected"], outputs: ["onSelectionChange"], exportAs: ["ngsOption"] }, { kind: "component", type: Icon, selector: "ngs-icon", inputs: ["name"], exportAs: ["ngsIcon"] }, { kind: "component", type: Select, selector: "ngs-select", inputs: ["id", "placeholder", "disabled", "required", "multiple", "hideCheckIcon", "clearable", "dataSource", "pageSize", "searchable", "searchDebounce", "minSearchLength", "loadOnOpen", "aria-label", "tabIndex", "aria-describedby", "value"], outputs: ["selectionChange", "opened", "closed", "valueChange"], exportAs: ["ngsSelect"] }, { kind: "directive", type: SelectTrigger, selector: "ngs-select-trigger" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: Button, selector: " button[ngsButton], button[ngsIconButton], a[ngsButton], a[ngsIconButton] ", inputs: ["ngsButton", "ngsIconButton", "loading", "disabled", "disabledInteractive", "disableRipple", "reverse", "fullWidth", "hideTextOnMobile"], exportAs: ["ngsButton"] }, { kind: "component", type: SelectHeader, selector: "ngs-select-header" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
561
561
  }
562
562
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: CountrySelect, decorators: [{
563
563
  type: Component,