@acorex/platform 20.4.2 → 20.5.0-next.1

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 (29) hide show
  1. package/common/index.d.ts +9 -1
  2. package/core/index.d.ts +405 -193
  3. package/fesm2022/acorex-platform-common.mjs +34 -11
  4. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-core.mjs +638 -244
  6. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-layout-builder.mjs +417 -112
  8. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-layout-components.mjs +614 -31
  10. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-entity.mjs +143 -511
  12. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-widget-core.mjs +70 -47
  14. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-layout-widgets.mjs +2750 -1480
  16. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  17. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-rdKxuMC_.mjs → acorex-platform-themes-default-entity-master-list-view.component-ccqB5ShI.mjs} +7 -1
  18. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-rdKxuMC_.mjs.map → acorex-platform-themes-default-entity-master-list-view.component-ccqB5ShI.mjs.map} +1 -1
  19. package/fesm2022/acorex-platform-themes-default.mjs +8 -3
  20. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  21. package/fesm2022/acorex-platform-themes-shared.mjs +676 -271
  22. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  23. package/layout/builder/index.d.ts +127 -28
  24. package/layout/components/index.d.ts +245 -3
  25. package/layout/entity/index.d.ts +1 -59
  26. package/layout/widget-core/index.d.ts +20 -1
  27. package/layout/widgets/index.d.ts +396 -6
  28. package/package.json +6 -5
  29. package/themes/default/index.d.ts +1 -0
@@ -15,24 +15,24 @@ import { HttpClient } from '@angular/common/http';
15
15
  import { signalStore, withState, withComputed, withMethods, patchState, withHooks } from '@ngrx/signals';
16
16
  import { timer, firstValueFrom, fromEvent, Subscription, filter } from 'rxjs';
17
17
  import { debounceTime } from 'rxjs/operators';
18
- import * as i2$1 from '@acorex/core/translation';
18
+ import * as i5 from '@acorex/core/translation';
19
19
  import { AXTranslationModule } from '@acorex/core/translation';
20
20
  import * as i3$1 from '@acorex/platform/layout/widget-core';
21
21
  import { AXPValueWidgetComponent, AXP_WIDGETS_LAYOUT_CATEGORY, AXPWidgetCoreModule } from '@acorex/platform/layout/widget-core';
22
- import * as i2$4 from '@acorex/platform/layout/components';
22
+ import * as i2$3 from '@acorex/platform/layout/components';
23
23
  import { AXPComponentSlotModule } from '@acorex/platform/layout/components';
24
- import * as i2$2 from '@acorex/components/form';
24
+ import * as i2$1 from '@acorex/components/form';
25
25
  import { AXFormModule } from '@acorex/components/form';
26
26
  import * as i4$1 from '@acorex/components/search-box';
27
27
  import { AXSearchBoxModule } from '@acorex/components/search-box';
28
28
  import * as i1$1 from '@acorex/components/select-box';
29
29
  import { AXSelectBoxModule } from '@acorex/components/select-box';
30
- import * as i5 from '@angular/forms';
30
+ import * as i5$1 from '@angular/forms';
31
31
  import { FormsModule } from '@angular/forms';
32
32
  import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY } from '@acorex/platform/layout/widgets';
33
33
  import { AXSelectionCdkModule } from '@acorex/cdk/selection';
34
34
  import { AXPopupService } from '@acorex/components/popup';
35
- import * as i2$3 from '@acorex/components/button-group';
35
+ import * as i2$2 from '@acorex/components/button-group';
36
36
  import { AXButtonGroupModule } from '@acorex/components/button-group';
37
37
  import { AXBasePageComponent } from '@acorex/components/page';
38
38
 
@@ -480,7 +480,7 @@ class AXPThemeSlotComponent {
480
480
  </ax-button-item-list>
481
481
  </ax-dropdown-panel>
482
482
  </ax-button>
483
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i2$1.AXTranslatorDirective, selector: "[translate]" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }] }); }
483
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }] }); }
484
484
  }
485
485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPThemeSlotComponent, decorators: [{
486
486
  type: Component,
@@ -724,7 +724,7 @@ class AXPColorChooserWidgetEditComponent extends AXPValueWidgetComponent {
724
724
  </ax-select-box>
725
725
  </ax-form-field>
726
726
  </ax-form>
727
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i1$1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i2$2.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i2$2.AXFormComponent, selector: "ax-form", inputs: ["labelMode", "look", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i2$2.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i4$1.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
727
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i1$1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i2$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i2$1.AXFormComponent, selector: "ax-form", inputs: ["labelMode", "look", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i2$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i4$1.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
728
728
  }
729
729
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPColorChooserWidgetEditComponent, decorators: [{
730
730
  type: Component,
@@ -814,7 +814,7 @@ class AXPFontSizeChooserWidgetComponent extends AXPValueWidgetComponent {
814
814
  </div>
815
815
  </div>
816
816
  }
817
- `, isInline: true, styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}:host>div{display:flex;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}:host>div:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-surface));color:rgb(var(--ax-sys-color-on-surface));border-color:rgb(var(--ax-sys-color-border-surface))}:host>div{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}:host>div:hover{background-color:rgb(var(--ax-sys-color-dark-surface));color:rgb(var(--ax-sys-color-on-dark-surface));border-color:rgb(var(--ax-sys-color-border-dark-surface))}:host>div.--selected{background-color:rgb(var(--ax-sys-color-primary-lighter-surface));color:rgb(var(--ax-sys-color-on-primary-lighter-surface));border-color:rgb(var(--ax-sys-color-border-primary-lighter-surface))}:host>div>div{display:flex;align-items:center;justify-content:center}:host>div>div i{font-size:1.25rem;line-height:1.75rem}:host>div>span{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.625}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
817
+ `, isInline: true, styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}:host>div{display:flex;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}:host>div:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-surface));color:rgb(var(--ax-sys-color-on-surface));border-color:rgb(var(--ax-sys-color-border-surface))}:host>div{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}:host>div:hover{background-color:rgb(var(--ax-sys-color-dark-surface));color:rgb(var(--ax-sys-color-on-dark-surface));border-color:rgb(var(--ax-sys-color-border-dark-surface))}:host>div.--selected{background-color:rgb(var(--ax-sys-color-primary-lighter-surface));color:rgb(var(--ax-sys-color-on-primary-lighter-surface));border-color:rgb(var(--ax-sys-color-border-primary-lighter-surface))}:host>div>div{display:flex;align-items:center;justify-content:center}:host>div>div i{font-size:1.25rem;line-height:1.75rem}:host>div>span{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.625}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
818
818
  }
819
819
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPFontSizeChooserWidgetComponent, decorators: [{
820
820
  type: Component,
@@ -936,232 +936,80 @@ const AXPFontStyleChooserWidget = {
936
936
  }
937
937
  };
938
938
 
939
+ //#region ---- Injection Tokens ----
940
+ /**
941
+ * Injection token for icon providers.
942
+ * Use multi: true to register multiple providers.
943
+ */
944
+ const AXP_ICON_PROVIDER = new InjectionToken('AXP_ICON_PROVIDER');
945
+ /**
946
+ * Injection token for icon style providers.
947
+ * Use multi: true to register multiple providers.
948
+ */
949
+ const AXP_ICON_STYLE_PROVIDER = new InjectionToken('AXP_ICON_STYLE_PROVIDER');
950
+ //#endregion
951
+
952
+ //#endregion
953
+ //#region ---- Abstract Providers ----
939
954
  class AXPIconProvider {
940
955
  }
941
956
  class AXPIconStyleProvider {
942
957
  }
943
- const DEFAULT_ICON_STYLES = [
944
- { name: 'fa-solid', label: 'Solid' },
945
- { name: 'fa-regular', label: 'Regular' },
946
- ];
947
- const DEFAULT_ICONS = [
948
- // Navigation & Actions
949
- { name: 'house', label: 'House', tags: ['home', 'building'], supportedStyle: ['fa-regular'] },
950
- { name: 'magnifying-glass', label: 'Search', tags: ['find', 'zoom'], supportedStyle: ['fa-solid'] },
951
- { name: 'user', label: 'User', tags: ['person', 'account'] },
952
- { name: 'check', label: 'Check', tags: ['confirm', 'done'] },
953
- { name: 'xmark', label: 'Close', tags: ['cancel', 'exit'] },
954
- { name: 'plus', label: 'Add', tags: ['create', 'new', 'plus'] },
955
- { name: 'minus', label: 'Remove', tags: ['delete', 'subtract', 'minus'] },
956
- { name: 'edit', label: 'Edit', tags: ['modify', 'change', 'pencil'] },
957
- { name: 'trash', label: 'Delete', tags: ['remove', 'delete', 'bin'] },
958
- { name: 'copy', label: 'Copy', tags: ['duplicate', 'clone'] },
959
- { name: 'download', label: 'Download', tags: ['save', 'export'] },
960
- { name: 'upload', label: 'Upload', tags: ['import', 'send'] },
961
- { name: 'print', label: 'Print', tags: ['printer', 'document'] },
962
- { name: 'share', label: 'Share', tags: ['send', 'distribute'] },
963
- { name: 'link', label: 'Link', tags: ['url', 'connection'] },
964
- { name: 'external-link', label: 'External Link', tags: ['open', 'external'] },
965
- // Media & Files
966
- { name: 'star', label: 'Star', tags: ['favorite', 'rate'] },
967
- { name: 'heart', label: 'Heart', tags: ['love', 'like'] },
968
- { name: 'cloud', label: 'Cloud', tags: ['weather', 'sky'] },
969
- { name: 'envelope', label: 'Envelope', tags: ['mail', 'message'] },
970
- { name: 'folder', label: 'Folder', tags: ['directory', 'files'] },
971
- { name: 'gear', label: 'Gear', tags: ['settings', 'options'] },
972
- { name: 'camera', label: 'Camera', tags: ['photo', 'image'] },
973
- { name: 'video', label: 'Video', tags: ['film', 'movie'] },
974
- { name: 'music', label: 'Music', tags: ['sound', 'audio'] },
975
- { name: 'file-lines', label: 'File', tags: ['document', 'text'] },
976
- { name: 'file-pdf', label: 'PDF', tags: ['document', 'pdf'] },
977
- { name: 'file-image', label: 'Image', tags: ['picture', 'photo'] },
978
- { name: 'file-video', label: 'Video File', tags: ['movie', 'clip'] },
979
- { name: 'file-audio', label: 'Audio File', tags: ['sound', 'music'] },
980
- { name: 'file-zipper', label: 'Archive', tags: ['zip', 'compressed'] },
981
- { name: 'image', label: 'Image', tags: ['picture', 'photo'] },
982
- { name: 'images', label: 'Images', tags: ['gallery', 'photos'] },
983
- // Communication & Social
984
- { name: 'phone', label: 'Phone', tags: ['call', 'telephone'] },
985
- { name: 'mobile', label: 'Mobile', tags: ['cell', 'smartphone'] },
986
- { name: 'comment', label: 'Comment', tags: ['message', 'chat'] },
987
- { name: 'comments', label: 'Comments', tags: ['messages', 'discussion'] },
988
- { name: 'thumbs-up', label: 'Like', tags: ['approve', 'good'] },
989
- { name: 'thumbs-down', label: 'Dislike', tags: ['disapprove', 'bad'] },
990
- { name: 'bell', label: 'Notification', tags: ['alert', 'reminder'] },
991
- { name: 'flag', label: 'Flag', tags: ['mark', 'report'] },
992
- { name: 'bookmark', label: 'Bookmark', tags: ['save', 'favorite'] },
993
- { name: 'calendar', label: 'Calendar', tags: ['date', 'schedule'] },
994
- { name: 'clock', label: 'Clock', tags: ['time', 'schedule'] },
995
- // Business & Finance
996
- { name: 'chart-line', label: 'Chart', tags: ['graph', 'analytics'] },
997
- { name: 'chart-bar', label: 'Bar Chart', tags: ['graph', 'statistics'] },
998
- { name: 'chart-pie', label: 'Pie Chart', tags: ['graph', 'percentage'] },
999
- { name: 'calculator', label: 'Calculator', tags: ['math', 'compute'] },
1000
- { name: 'dollar-sign', label: 'Dollar', tags: ['money', 'currency'] },
1001
- { name: 'credit-card', label: 'Credit Card', tags: ['payment', 'card'] },
1002
- { name: 'receipt', label: 'Receipt', tags: ['bill', 'invoice'] },
1003
- { name: 'briefcase', label: 'Briefcase', tags: ['business', 'work'] },
1004
- { name: 'building', label: 'Building', tags: ['office', 'company'] },
1005
- { name: 'handshake', label: 'Handshake', tags: ['agreement', 'partnership'] },
1006
- // Technology & Tools
1007
- { name: 'laptop', label: 'Laptop', tags: ['computer', 'notebook'] },
1008
- { name: 'desktop', label: 'Desktop', tags: ['computer', 'monitor'] },
1009
- { name: 'tablet', label: 'Tablet', tags: ['ipad', 'device'] },
1010
- { name: 'keyboard', label: 'Keyboard', tags: ['input', 'typing'] },
1011
- { name: 'mouse', label: 'Mouse', tags: ['pointer', 'click'] },
1012
- { name: 'wifi', label: 'WiFi', tags: ['internet', 'connection'] },
1013
- { name: 'database', label: 'Database', tags: ['data', 'storage'] },
1014
- { name: 'server', label: 'Server', tags: ['hosting', 'backend'] },
1015
- { name: 'code', label: 'Code', tags: ['programming', 'development'] },
1016
- { name: 'bug', label: 'Bug', tags: ['error', 'debug'] },
1017
- { name: 'shield', label: 'Shield', tags: ['security', 'protection'] },
1018
- { name: 'lock', label: 'Lock', tags: ['security', 'private'] },
1019
- { name: 'unlock', label: 'Unlock', tags: ['open', 'access'] },
1020
- { name: 'key', label: 'Key', tags: ['access', 'password'] },
1021
- // Transportation & Location
1022
- { name: 'car', label: 'Car', tags: ['vehicle', 'automobile'] },
1023
- { name: 'truck', label: 'Truck', tags: ['vehicle', 'delivery'] },
1024
- { name: 'plane', label: 'Plane', tags: ['aircraft', 'travel'] },
1025
- { name: 'train', label: 'Train', tags: ['railway', 'transport'] },
1026
- { name: 'ship', label: 'Ship', tags: ['boat', 'vessel'] },
1027
- { name: 'bicycle', label: 'Bicycle', tags: ['bike', 'cycle'] },
1028
- { name: 'map', label: 'Map', tags: ['location', 'navigation'] },
1029
- { name: 'map-pin', label: 'Location', tags: ['pin', 'marker'] },
1030
- { name: 'globe', label: 'Globe', tags: ['world', 'earth'] },
1031
- { name: 'compass', label: 'Compass', tags: ['direction', 'navigation'] },
1032
- // Health & Medical
1033
- { name: 'heart-pulse', label: 'Heart Rate', tags: ['health', 'medical'] },
1034
- { name: 'stethoscope', label: 'Stethoscope', tags: ['medical', 'doctor'] },
1035
- { name: 'pills', label: 'Pills', tags: ['medicine', 'drugs'] },
1036
- { name: 'syringe', label: 'Syringe', tags: ['injection', 'medical'] },
1037
- { name: 'bandage', label: 'Bandage', tags: ['first aid', 'wound'] },
1038
- { name: 'hospital', label: 'Hospital', tags: ['medical', 'healthcare'] },
1039
- // Education & Learning
1040
- { name: 'graduation-cap', label: 'Graduation', tags: ['education', 'degree'] },
1041
- { name: 'book', label: 'Book', tags: ['reading', 'education'] },
1042
- { name: 'book-open', label: 'Open Book', tags: ['reading', 'study'] },
1043
- { name: 'pen', label: 'Pen', tags: ['write', 'draw'] },
1044
- { name: 'pencil', label: 'Pencil', tags: ['write', 'draw'] },
1045
- { name: 'highlighter', label: 'Highlighter', tags: ['mark', 'emphasize'] },
1046
- { name: 'ruler', label: 'Ruler', tags: ['measure', 'straight'] },
1047
- { name: 'microscope', label: 'Microscope', tags: ['science', 'research'] },
1048
- // Food & Dining
1049
- { name: 'utensils', label: 'Utensils', tags: ['food', 'dining'] },
1050
- { name: 'pizza-slice', label: 'Pizza', tags: ['food', 'slice'] },
1051
- { name: 'coffee', label: 'Coffee', tags: ['drink', 'beverage'] },
1052
- { name: 'wine-glass', label: 'Wine', tags: ['drink', 'alcohol'] },
1053
- { name: 'cake', label: 'Cake', tags: ['dessert', 'sweet'] },
1054
- { name: 'apple', label: 'Apple', tags: ['fruit', 'healthy'] },
1055
- // Sports & Recreation
1056
- { name: 'football', label: 'Football', tags: ['sport', 'soccer'] },
1057
- { name: 'basketball', label: 'Basketball', tags: ['sport', 'ball'] },
1058
- { name: 'baseball', label: 'Baseball', tags: ['sport', 'ball'] },
1059
- { name: 'tennis-ball', label: 'Tennis', tags: ['sport', 'racket'] },
1060
- { name: 'swimming-pool', label: 'Swimming', tags: ['sport', 'water'] },
1061
- { name: 'dumbbell', label: 'Dumbbell', tags: ['fitness', 'weight'] },
1062
- // Weather & Nature
1063
- { name: 'sun', label: 'Sun', tags: ['weather', 'bright'] },
1064
- { name: 'moon', label: 'Moon', tags: ['night', 'dark'] },
1065
- { name: 'cloud-sun', label: 'Partly Cloudy', tags: ['weather', 'mixed'] },
1066
- { name: 'cloud-rain', label: 'Rain', tags: ['weather', 'precipitation'] },
1067
- { name: 'snowflake', label: 'Snow', tags: ['weather', 'cold'] },
1068
- { name: 'bolt', label: 'Lightning', tags: ['weather', 'storm'] },
1069
- { name: 'tree', label: 'Tree', tags: ['nature', 'plant'] },
1070
- { name: 'leaf', label: 'Leaf', tags: ['nature', 'plant'] },
1071
- { name: 'flower', label: 'Flower', tags: ['nature', 'plant'] },
1072
- // Shopping & Commerce
1073
- { name: 'shopping-cart', label: 'Shopping Cart', tags: ['buy', 'purchase'] },
1074
- { name: 'bag-shopping', label: 'Shopping Bag', tags: ['buy', 'store'] },
1075
- { name: 'tags', label: 'Tags', tags: ['price', 'label'] },
1076
- { name: 'percent', label: 'Percent', tags: ['discount', 'sale'] },
1077
- { name: 'gift', label: 'Gift', tags: ['present', 'surprise'] },
1078
- { name: 'box', label: 'Box', tags: ['package', 'container'] },
1079
- // Security & Safety
1080
- { name: 'eye', label: 'Eye', tags: ['view', 'watch'] },
1081
- { name: 'eye-slash', label: 'Hide', tags: ['hidden', 'invisible'] },
1082
- { name: 'user-secret', label: 'Secret User', tags: ['anonymous', 'hidden'] },
1083
- { name: 'fingerprint', label: 'Fingerprint', tags: ['biometric', 'identity'] },
1084
- { name: 'fire', label: 'Fire', tags: ['hot', 'burn'] },
1085
- { name: 'warning', label: 'Warning', tags: ['alert', 'caution'] },
1086
- { name: 'exclamation-triangle', label: 'Exclamation', tags: ['warning', 'alert'] },
1087
- // Miscellaneous
1088
- { name: 'question', label: 'Question', tags: ['help', 'ask'] },
1089
- { name: 'info', label: 'Info', tags: ['information', 'details'] },
1090
- { name: 'lightbulb', label: 'Lightbulb', tags: ['idea', 'bright'] },
1091
- { name: 'magic-wand', label: 'Magic Wand', tags: ['magic', 'wish'] },
1092
- { name: 'puzzle-piece', label: 'Puzzle', tags: ['piece', 'solve'] },
1093
- { name: 'gamepad', label: 'Gamepad', tags: ['gaming', 'controller'] },
1094
- { name: 'dice', label: 'Dice', tags: ['game', 'random'] },
1095
- { name: 'palette', label: 'Palette', tags: ['color', 'art'] },
1096
- { name: 'brush', label: 'Brush', tags: ['paint', 'art'] },
1097
- { name: 'scissors', label: 'Scissors', tags: ['cut', 'trim'] },
1098
- ];
1099
- class AXPIconProviderDefault extends AXPIconProvider {
1100
- async provide() {
1101
- return DEFAULT_ICONS;
1102
- }
1103
- }
1104
- class AXPIconStyleProviderDefault extends AXPIconStyleProvider {
1105
- async provide() {
1106
- return DEFAULT_ICON_STYLES;
1107
- }
1108
- }
1109
- const AXP_ICON_PROVIDER = new InjectionToken('AXP_ICON_PROVIDER');
1110
- const AXP_ICON_STYLE_PROVIDER = new InjectionToken('AXP_ICON_STYLE_PROVIDER');
958
+ //#endregion
959
+ //#region ---- Service ----
1111
960
  class AXPIconChooserService {
1112
961
  constructor() {
1113
- this.defaultIconProvider = new AXPIconProviderDefault();
1114
- this.iconProviders = (() => {
1115
- const injected = inject(AXP_ICON_PROVIDER, { optional: true });
1116
- if (!injected) {
1117
- return [this.defaultIconProvider];
1118
- }
1119
- const providers = Array.isArray(injected) ? injected : [injected];
1120
- return [...providers, this.defaultIconProvider];
1121
- })();
1122
- this.defaultStyleProvider = new AXPIconStyleProviderDefault();
1123
- this.styleProviders = (() => {
1124
- const injected = inject(AXP_ICON_STYLE_PROVIDER, { optional: true });
1125
- if (!injected) {
1126
- return [this.defaultStyleProvider];
1127
- }
1128
- const providers = Array.isArray(injected) ? injected : [injected];
1129
- return [...providers, this.defaultStyleProvider];
1130
- })();
962
+ //#region ---- Properties ----
963
+ this.iconProviders = inject(AXP_ICON_PROVIDER, { optional: true }) ?? [];
964
+ this.styleProviders = inject(AXP_ICON_STYLE_PROVIDER, { optional: true }) ?? [];
1131
965
  this.iconsCache = null;
1132
966
  this.stylesCache = null;
1133
967
  }
968
+ //#endregion
969
+ //#region ---- Public Methods ----
970
+ /**
971
+ * Get all available icon styles from registered providers.
972
+ * Results are cached after first call.
973
+ */
1134
974
  async getStyles() {
1135
975
  if (this.stylesCache) {
1136
976
  return this.stylesCache;
1137
977
  }
1138
978
  const allStyles = [];
1139
- for (const resolver of this.styleProviders) {
1140
- const result = await resolver.provide();
979
+ for (const provider of this.styleProviders) {
980
+ const result = await provider.provide();
1141
981
  allStyles.push(...result);
1142
982
  }
983
+ // Remove duplicates based on style name
1143
984
  const uniqueStyles = allStyles.filter((style, index, self) => index === self.findIndex((s) => s.name === style.name));
1144
985
  this.stylesCache = uniqueStyles;
1145
986
  return uniqueStyles;
1146
987
  }
988
+ /**
989
+ * Get all available icons from registered providers.
990
+ * Icons from multiple providers are merged, with duplicates removed.
991
+ * Results are cached after first call.
992
+ */
1147
993
  async getIcons() {
1148
994
  if (this.iconsCache) {
1149
995
  return this.iconsCache;
1150
996
  }
1151
997
  const allIcons = [];
1152
- for (const resolver of this.iconProviders) {
1153
- const result = await resolver.provide();
998
+ for (const provider of this.iconProviders) {
999
+ const result = await provider.provide();
1154
1000
  allIcons.push(...result);
1155
1001
  }
1002
+ // Remove duplicates based on icon name, keeping first occurrence
1156
1003
  const uniqueIcons = allIcons.filter((icon, index, self) => index === self.findIndex((i) => i.name === icon.name));
1157
1004
  this.iconsCache = uniqueIcons;
1158
1005
  return uniqueIcons;
1159
1006
  }
1160
1007
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPIconChooserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1161
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPIconChooserService }); }
1008
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPIconChooserService, providedIn: 'root' }); }
1162
1009
  }
1163
1010
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPIconChooserService, decorators: [{
1164
- type: Injectable
1011
+ type: Injectable,
1012
+ args: [{ providedIn: 'root' }]
1165
1013
  }] });
1166
1014
 
1167
1015
  class AXPIconChooserPopupComponent extends AXBasePageComponent {
@@ -1171,10 +1019,10 @@ class AXPIconChooserPopupComponent extends AXBasePageComponent {
1171
1019
  this.filteredIcons = [];
1172
1020
  this.searchQuery = '';
1173
1021
  this.viewModes = [
1174
- { value: 'square', text: 'Square View', icon: 'fa-solid fa-border-all' },
1022
+ { value: 'square', text: '@general:widgets.icon-chooser.view-mode.square', icon: 'fa-solid fa-border-all' },
1175
1023
  {
1176
1024
  value: 'rectangle',
1177
- text: 'Rectangle View',
1025
+ text: '@general:widgets.icon-chooser.view-mode.rectangle',
1178
1026
  icon: 'fa-solid fa-list',
1179
1027
  },
1180
1028
  ];
@@ -1225,42 +1073,50 @@ class AXPIconChooserPopupComponent extends AXBasePageComponent {
1225
1073
  return `${this.selectedIconType} fa-${icon.name}`;
1226
1074
  }
1227
1075
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPIconChooserPopupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1228
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: AXPIconChooserPopupComponent, isStandalone: true, selector: "ng-component", inputs: { value: "value" }, providers: [AXPIconChooserService], usesInheritance: true, ngImport: i0, template: `
1229
- <div class="ax-flex ax-flex-col ax-h-full ax-p-4 ax-gap-4 ax-bg-lightest">
1230
- <div class="ax-flex ax-justify-center">
1231
- <ax-search-box
1232
- class="ax-w-full md:ax-w-1/2"
1233
- (onValueChanged)="handleSearch($event)"
1234
- placeholder="Search for icons..."
1235
- ></ax-search-box>
1236
- </div>
1076
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: AXPIconChooserPopupComponent, isStandalone: true, selector: "ng-component", inputs: { value: "value" }, usesInheritance: true, ngImport: i0, template: `
1077
+ <div class="ax-flex ax-flex-col ax-h-full ax-bg-lightest">
1078
+ <!-- Fixed Header Section -->
1079
+ <div class="ax-sticky ax-top-0 ax-z-10 ax-bg-lightest ax-border-b ax-p-4 ax-gap-4 ax-flex ax-flex-col">
1080
+ <!-- Search Bar -->
1081
+ <div class="ax-flex ax-justify-center">
1082
+ <ax-search-box
1083
+ class="ax-w-full"
1084
+ (onValueChanged)="handleSearch($event)"
1085
+ [placeholder]="'@general:widgets.icon-chooser.search-placeholder' | translate | async"
1086
+ ></ax-search-box>
1087
+ </div>
1237
1088
 
1238
- <div class="ax-flex ax-justify-between ax-items-center ax-flex-wrap ax-gap-2">
1239
- <ax-button-group selection="single" look="outline">
1240
- @for (item of iconTypes; track item.name) {
1241
- <ax-button-group-item
1242
- [text]="item.label"
1243
- [selected]="item.name === selectedIconType"
1244
- (onClick)="handleIconTypeChange(item)"
1245
- >
1246
- </ax-button-group-item>
1247
- }
1248
- </ax-button-group>
1089
+ <!-- Controls Row -->
1090
+ <div class="ax-flex ax-justify-between ax-items-center ax-flex-wrap ax-gap-2">
1091
+ <!-- Icon Style Filter -->
1092
+ <ax-button-group selection="single" look="outline">
1093
+ @for (item of iconTypes; track item.name) {
1094
+ <ax-button-group-item
1095
+ [text]="item.label"
1096
+ [selected]="item.name === selectedIconType"
1097
+ (onClick)="handleIconTypeChange(item)"
1098
+ >
1099
+ </ax-button-group-item>
1100
+ }
1101
+ </ax-button-group>
1249
1102
 
1250
- <ax-button-group selection="single" look="outline">
1251
- @for (item of viewModes; track item.value) {
1252
- <ax-button-group-item
1253
- [title]="item.text"
1254
- [selected]="item.value === selectedViewMode"
1255
- (onClick)="handleViewModeChange(item)"
1256
- >
1257
- <ax-icon [class]="item.icon"></ax-icon>
1258
- </ax-button-group-item>
1259
- }
1260
- </ax-button-group>
1103
+ <!-- View Mode Toggle -->
1104
+ <ax-button-group selection="single" look="outline">
1105
+ @for (item of viewModes; track item.value) {
1106
+ <ax-button-group-item
1107
+ [title]="item.text | translate | async"
1108
+ [selected]="item.value === selectedViewMode"
1109
+ (onClick)="handleViewModeChange(item)"
1110
+ >
1111
+ <ax-icon [class]="item.icon"></ax-icon>
1112
+ </ax-button-group-item>
1113
+ }
1114
+ </ax-button-group>
1115
+ </div>
1261
1116
  </div>
1262
1117
 
1263
- <div class="ax-flex-1 ax-overflow-y-auto ax-pr-2">
1118
+ <!-- Scrollable Content Area -->
1119
+ <div class="ax-flex-1 ax-overflow-y-auto ax-p-4 ax-pt-2">
1264
1120
  <div
1265
1121
  class="ax-grid ax-gap-1"
1266
1122
  [ngClass]="
@@ -1292,47 +1148,55 @@ class AXPIconChooserPopupComponent extends AXBasePageComponent {
1292
1148
  </div>
1293
1149
  </div>
1294
1150
  </div>
1295
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i4$1.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i2$3.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "color", "look", "fitParent", "selection"], outputs: ["onBlur", "onFocus", "lookChange", "colorChange", "disabledChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i2$3.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1151
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i4$1.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i2$2.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "color", "look", "fitParent", "selection"], outputs: ["onBlur", "onFocus", "lookChange", "colorChange", "disabledChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i2$2.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1296
1152
  }
1297
1153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPIconChooserPopupComponent, decorators: [{
1298
1154
  type: Component,
1299
1155
  args: [{
1300
1156
  template: `
1301
- <div class="ax-flex ax-flex-col ax-h-full ax-p-4 ax-gap-4 ax-bg-lightest">
1302
- <div class="ax-flex ax-justify-center">
1303
- <ax-search-box
1304
- class="ax-w-full md:ax-w-1/2"
1305
- (onValueChanged)="handleSearch($event)"
1306
- placeholder="Search for icons..."
1307
- ></ax-search-box>
1308
- </div>
1157
+ <div class="ax-flex ax-flex-col ax-h-full ax-bg-lightest">
1158
+ <!-- Fixed Header Section -->
1159
+ <div class="ax-sticky ax-top-0 ax-z-10 ax-bg-lightest ax-border-b ax-p-4 ax-gap-4 ax-flex ax-flex-col">
1160
+ <!-- Search Bar -->
1161
+ <div class="ax-flex ax-justify-center">
1162
+ <ax-search-box
1163
+ class="ax-w-full"
1164
+ (onValueChanged)="handleSearch($event)"
1165
+ [placeholder]="'@general:widgets.icon-chooser.search-placeholder' | translate | async"
1166
+ ></ax-search-box>
1167
+ </div>
1309
1168
 
1310
- <div class="ax-flex ax-justify-between ax-items-center ax-flex-wrap ax-gap-2">
1311
- <ax-button-group selection="single" look="outline">
1312
- @for (item of iconTypes; track item.name) {
1313
- <ax-button-group-item
1314
- [text]="item.label"
1315
- [selected]="item.name === selectedIconType"
1316
- (onClick)="handleIconTypeChange(item)"
1317
- >
1318
- </ax-button-group-item>
1319
- }
1320
- </ax-button-group>
1169
+ <!-- Controls Row -->
1170
+ <div class="ax-flex ax-justify-between ax-items-center ax-flex-wrap ax-gap-2">
1171
+ <!-- Icon Style Filter -->
1172
+ <ax-button-group selection="single" look="outline">
1173
+ @for (item of iconTypes; track item.name) {
1174
+ <ax-button-group-item
1175
+ [text]="item.label"
1176
+ [selected]="item.name === selectedIconType"
1177
+ (onClick)="handleIconTypeChange(item)"
1178
+ >
1179
+ </ax-button-group-item>
1180
+ }
1181
+ </ax-button-group>
1321
1182
 
1322
- <ax-button-group selection="single" look="outline">
1323
- @for (item of viewModes; track item.value) {
1324
- <ax-button-group-item
1325
- [title]="item.text"
1326
- [selected]="item.value === selectedViewMode"
1327
- (onClick)="handleViewModeChange(item)"
1328
- >
1329
- <ax-icon [class]="item.icon"></ax-icon>
1330
- </ax-button-group-item>
1331
- }
1332
- </ax-button-group>
1183
+ <!-- View Mode Toggle -->
1184
+ <ax-button-group selection="single" look="outline">
1185
+ @for (item of viewModes; track item.value) {
1186
+ <ax-button-group-item
1187
+ [title]="item.text | translate | async"
1188
+ [selected]="item.value === selectedViewMode"
1189
+ (onClick)="handleViewModeChange(item)"
1190
+ >
1191
+ <ax-icon [class]="item.icon"></ax-icon>
1192
+ </ax-button-group-item>
1193
+ }
1194
+ </ax-button-group>
1195
+ </div>
1333
1196
  </div>
1334
1197
 
1335
- <div class="ax-flex-1 ax-overflow-y-auto ax-pr-2">
1198
+ <!-- Scrollable Content Area -->
1199
+ <div class="ax-flex-1 ax-overflow-y-auto ax-p-4 ax-pt-2">
1336
1200
  <div
1337
1201
  class="ax-grid ax-gap-1"
1338
1202
  [ngClass]="
@@ -1365,8 +1229,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1365
1229
  </div>
1366
1230
  </div>
1367
1231
  `,
1368
- imports: [AXSearchBoxModule, AXButtonGroupModule, CommonModule, AXDecoratorModule],
1369
- providers: [AXPIconChooserService],
1232
+ imports: [AXSearchBoxModule, AXButtonGroupModule, CommonModule, AXDecoratorModule, AXTranslationModule],
1370
1233
  changeDetection: ChangeDetectionStrategy.OnPush,
1371
1234
  }]
1372
1235
  }], propDecorators: { value: [{
@@ -1508,6 +1371,546 @@ const AXPIconChooserWidget = {
1508
1371
  },
1509
1372
  };
1510
1373
 
1374
+ //#region ---- Default Icon Styles ----
1375
+ const DEFAULT_ICON_STYLES = [
1376
+ { name: 'fa-regular', label: 'Regular' },
1377
+ { name: 'fa-solid', label: 'Solid' },
1378
+ ];
1379
+ //#endregion
1380
+ //#region ---- Default Icons ----
1381
+ const DEFAULT_ICONS = [
1382
+ // Navigation & Actions
1383
+ { name: 'house', label: 'House', tags: ['home', 'building', 'house'] },
1384
+ { name: 'magnifying-glass', label: 'Search', tags: ['find', 'zoom'] },
1385
+ { name: 'user', label: 'User', tags: ['person', 'account'] },
1386
+ { name: 'users', label: 'Users', tags: ['people', 'group', 'team'] },
1387
+ { name: 'user-group', label: 'User Group', tags: ['team', 'group', 'people'] },
1388
+ { name: 'check', label: 'Check', tags: ['confirm', 'done', 'tick'] },
1389
+ { name: 'check-circle', label: 'Check Circle', tags: ['confirm', 'success', 'done'] },
1390
+ { name: 'check-double', label: 'Check Double', tags: ['verified', 'confirmed'] },
1391
+ { name: 'xmark', label: 'Close', tags: ['cancel', 'exit', 'remove'] },
1392
+ { name: 'circle-xmark', label: 'Circle Close', tags: ['cancel', 'error', 'remove'] },
1393
+ { name: 'plus', label: 'Add', tags: ['create', 'new', 'plus'] },
1394
+ { name: 'circle-plus', label: 'Circle Plus', tags: ['add', 'create', 'new'] },
1395
+ { name: 'minus', label: 'Remove', tags: ['delete', 'subtract', 'minus'] },
1396
+ { name: 'circle-minus', label: 'Circle Minus', tags: ['remove', 'subtract'] },
1397
+ { name: 'edit', label: 'Edit', tags: ['modify', 'change', 'pencil'] },
1398
+ { name: 'pen-to-square', label: 'Edit Square', tags: ['edit', 'modify', 'write'] },
1399
+ { name: 'trash', label: 'Delete', tags: ['remove', 'delete', 'bin'] },
1400
+ { name: 'trash-can', label: 'Trash Can', tags: ['delete', 'remove', 'garbage'] },
1401
+ { name: 'copy', label: 'Copy', tags: ['duplicate', 'clone'] },
1402
+ { name: 'clone', label: 'Clone', tags: ['duplicate', 'copy'] },
1403
+ { name: 'download', label: 'Download', tags: ['save', 'export'] },
1404
+ { name: 'upload', label: 'Upload', tags: ['import', 'send'] },
1405
+ { name: 'print', label: 'Print', tags: ['printer', 'document'] },
1406
+ { name: 'share', label: 'Share', tags: ['send', 'distribute'] },
1407
+ { name: 'share-nodes', label: 'Share Network', tags: ['share', 'distribute', 'network'] },
1408
+ { name: 'link', label: 'Link', tags: ['url', 'connection'] },
1409
+ { name: 'link-slash', label: 'Unlink', tags: ['disconnect', 'remove'] },
1410
+ { name: 'external-link', label: 'External Link', tags: ['open', 'external'] },
1411
+ { name: 'arrows-rotate', label: 'Refresh', tags: ['reload', 'sync', 'update'] },
1412
+ { name: 'rotate-right', label: 'Rotate Right', tags: ['refresh', 'reload'] },
1413
+ { name: 'arrows-left-right', label: 'Arrows Horizontal', tags: ['swap', 'exchange'] },
1414
+ { name: 'arrow-up', label: 'Arrow Up', tags: ['up', 'direction'] },
1415
+ { name: 'arrow-down', label: 'Arrow Down', tags: ['down', 'direction'] },
1416
+ { name: 'arrow-left', label: 'Arrow Left', tags: ['left', 'back', 'previous'] },
1417
+ { name: 'arrow-right', label: 'Arrow Right', tags: ['right', 'forward', 'next'] },
1418
+ { name: 'chevron-up', label: 'Chevron Up', tags: ['up', 'collapse'] },
1419
+ { name: 'chevron-down', label: 'Chevron Down', tags: ['down', 'expand'] },
1420
+ { name: 'chevron-left', label: 'Chevron Left', tags: ['left', 'previous'] },
1421
+ { name: 'chevron-right', label: 'Chevron Right', tags: ['right', 'next'] },
1422
+ { name: 'angle-up', label: 'Angle Up', tags: ['up', 'caret'] },
1423
+ { name: 'angle-down', label: 'Angle Down', tags: ['down', 'caret'] },
1424
+ { name: 'angle-left', label: 'Angle Left', tags: ['left', 'caret'] },
1425
+ { name: 'angle-right', label: 'Angle Right', tags: ['right', 'caret'] },
1426
+ { name: 'bars', label: 'Menu', tags: ['hamburger', 'menu', 'navigation'] },
1427
+ { name: 'ellipsis', label: 'Ellipsis', tags: ['more', 'options', 'menu'] },
1428
+ { name: 'ellipsis-vertical', label: 'Ellipsis Vertical', tags: ['more', 'options', 'menu'] },
1429
+ { name: 'grip', label: 'Grip', tags: ['drag', 'handle', 'move'] },
1430
+ { name: 'grip-vertical', label: 'Grip Vertical', tags: ['drag', 'handle', 'move'] },
1431
+ { name: 'filter', label: 'Filter', tags: ['sort', 'search', 'refine'] },
1432
+ { name: 'sliders', label: 'Settings', tags: ['adjust', 'options', 'preferences'] },
1433
+ // Media & Files
1434
+ { name: 'star', label: 'Star', tags: ['favorite', 'rate'] },
1435
+ { name: 'star-half', label: 'Star Half', tags: ['rating', 'half'] },
1436
+ { name: 'heart', label: 'Heart', tags: ['love', 'like', 'favorite'] },
1437
+ { name: 'heart-pulse', label: 'Heart Pulse', tags: ['health', 'medical', 'heartbeat'] },
1438
+ { name: 'cloud', label: 'Cloud', tags: ['weather', 'sky', 'storage'] },
1439
+ { name: 'cloud-arrow-up', label: 'Cloud Upload', tags: ['upload', 'backup', 'save'] },
1440
+ { name: 'cloud-arrow-down', label: 'Cloud Download', tags: ['download', 'restore'] },
1441
+ { name: 'envelope', label: 'Envelope', tags: ['mail', 'message', 'email'] },
1442
+ { name: 'envelope-open', label: 'Envelope Open', tags: ['mail', 'read', 'message'] },
1443
+ { name: 'paper-plane', label: 'Send', tags: ['send', 'message', 'email'] },
1444
+ { name: 'folder', label: 'Folder', tags: ['directory', 'files'] },
1445
+ { name: 'folder-open', label: 'Folder Open', tags: ['directory', 'files', 'open'] },
1446
+ { name: 'folder-plus', label: 'New Folder', tags: ['create', 'directory', 'add'] },
1447
+ { name: 'folder-tree', label: 'Folder Tree', tags: ['structure', 'hierarchy', 'files'] },
1448
+ { name: 'gear', label: 'Gear', tags: ['settings', 'options', 'config'] },
1449
+ { name: 'gears', label: 'Gears', tags: ['settings', 'configuration', 'system'] },
1450
+ { name: 'camera', label: 'Camera', tags: ['photo', 'image', 'picture'] },
1451
+ { name: 'camera-retro', label: 'Camera Retro', tags: ['photo', 'vintage'] },
1452
+ { name: 'video', label: 'Video', tags: ['film', 'movie', 'camera'] },
1453
+ { name: 'video-slash', label: 'Video Off', tags: ['disabled', 'mute', 'off'] },
1454
+ { name: 'music', label: 'Music', tags: ['sound', 'audio', 'song'] },
1455
+ { name: 'file', label: 'File', tags: ['document', 'file'] },
1456
+ { name: 'file-lines', label: 'File Text', tags: ['document', 'text'] },
1457
+ { name: 'file-pdf', label: 'PDF', tags: ['document', 'pdf'] },
1458
+ { name: 'file-word', label: 'Word Document', tags: ['document', 'word', 'doc'] },
1459
+ { name: 'file-excel', label: 'Excel', tags: ['spreadsheet', 'excel', 'xls'] },
1460
+ { name: 'file-powerpoint', label: 'PowerPoint', tags: ['presentation', 'powerpoint', 'ppt'] },
1461
+ { name: 'file-image', label: 'Image File', tags: ['picture', 'photo', 'image'] },
1462
+ { name: 'file-video', label: 'Video File', tags: ['movie', 'clip', 'video'] },
1463
+ { name: 'file-audio', label: 'Audio File', tags: ['sound', 'music', 'audio'] },
1464
+ { name: 'file-code', label: 'Code File', tags: ['code', 'programming', 'source'] },
1465
+ { name: 'file-zipper', label: 'Archive', tags: ['zip', 'compressed', 'archive'] },
1466
+ { name: 'file-csv', label: 'CSV File', tags: ['spreadsheet', 'data', 'csv'] },
1467
+ { name: 'image', label: 'Image', tags: ['picture', 'photo'] },
1468
+ { name: 'images', label: 'Images', tags: ['gallery', 'photos', 'pictures'] },
1469
+ { name: 'photo-film', label: 'Photo Film', tags: ['gallery', 'images', 'media'] },
1470
+ { name: 'microphone', label: 'Microphone', tags: ['audio', 'voice', 'record'] },
1471
+ { name: 'microphone-slash', label: 'Microphone Off', tags: ['mute', 'audio', 'off'] },
1472
+ { name: 'volume-high', label: 'Volume High', tags: ['sound', 'audio', 'loud'] },
1473
+ { name: 'volume-low', label: 'Volume Low', tags: ['sound', 'audio', 'quiet'] },
1474
+ { name: 'volume-xmark', label: 'Mute', tags: ['mute', 'silent', 'off'] },
1475
+ // Communication & Social
1476
+ { name: 'phone', label: 'Phone', tags: ['call', 'telephone', 'contact'] },
1477
+ { name: 'phone-flip', label: 'Phone Flip', tags: ['call', 'mobile', 'flip'] },
1478
+ { name: 'mobile', label: 'Mobile', tags: ['cell', 'smartphone', 'phone'] },
1479
+ { name: 'mobile-screen', label: 'Mobile Screen', tags: ['smartphone', 'device'] },
1480
+ { name: 'fax', label: 'Fax', tags: ['document', 'send', 'print'] },
1481
+ { name: 'comment', label: 'Comment', tags: ['message', 'chat', 'text'] },
1482
+ { name: 'comments', label: 'Comments', tags: ['messages', 'discussion', 'chat'] },
1483
+ { name: 'comment-dots', label: 'Comment Typing', tags: ['message', 'typing', 'chat'] },
1484
+ { name: 'message', label: 'Message', tags: ['chat', 'text', 'communication'] },
1485
+ { name: 'inbox', label: 'Inbox', tags: ['mail', 'messages', 'receive'] },
1486
+ { name: 'at', label: 'At Symbol', tags: ['email', 'mention', 'tag'] },
1487
+ { name: 'hashtag', label: 'Hashtag', tags: ['tag', 'social', 'topic'] },
1488
+ { name: 'thumbs-up', label: 'Like', tags: ['approve', 'good', 'positive'] },
1489
+ { name: 'thumbs-down', label: 'Dislike', tags: ['disapprove', 'bad', 'negative'] },
1490
+ { name: 'bell', label: 'Notification', tags: ['alert', 'reminder', 'notification'] },
1491
+ { name: 'bell-slash', label: 'Notifications Off', tags: ['mute', 'silent', 'off'] },
1492
+ { name: 'flag', label: 'Flag', tags: ['mark', 'report', 'bookmark'] },
1493
+ { name: 'flag-checkered', label: 'Flag Checkered', tags: ['finish', 'end', 'goal'] },
1494
+ { name: 'bookmark', label: 'Bookmark', tags: ['save', 'favorite', 'mark'] },
1495
+ { name: 'calendar', label: 'Calendar', tags: ['date', 'schedule', 'event'] },
1496
+ { name: 'calendar-days', label: 'Calendar Days', tags: ['date', 'month', 'schedule'] },
1497
+ { name: 'calendar-check', label: 'Calendar Check', tags: ['event', 'confirmed', 'scheduled'] },
1498
+ { name: 'calendar-plus', label: 'Calendar Add', tags: ['event', 'create', 'schedule'] },
1499
+ { name: 'clock', label: 'Clock', tags: ['time', 'schedule', 'hour'] },
1500
+ { name: 'hourglass', label: 'Hourglass', tags: ['time', 'waiting', 'timer'] },
1501
+ { name: 'stopwatch', label: 'Stopwatch', tags: ['timer', 'time', 'track'] },
1502
+ { name: 'rss', label: 'RSS', tags: ['feed', 'news', 'subscribe'] },
1503
+ // Business & Finance
1504
+ { name: 'chart-line', label: 'Chart Line', tags: ['graph', 'analytics', 'trending'] },
1505
+ { name: 'chart-bar', label: 'Bar Chart', tags: ['graph', 'statistics', 'data'] },
1506
+ { name: 'chart-pie', label: 'Pie Chart', tags: ['graph', 'percentage', 'data'] },
1507
+ { name: 'chart-area', label: 'Area Chart', tags: ['graph', 'analytics', 'data'] },
1508
+ { name: 'chart-column', label: 'Column Chart', tags: ['graph', 'statistics'] },
1509
+ { name: 'chart-simple', label: 'Simple Chart', tags: ['graph', 'data', 'analytics'] },
1510
+ { name: 'calculator', label: 'Calculator', tags: ['math', 'compute', 'calculate'] },
1511
+ { name: 'percent', label: 'Percent', tags: ['percentage', 'discount', 'rate'] },
1512
+ { name: 'dollar-sign', label: 'Dollar', tags: ['money', 'currency', 'usd'] },
1513
+ { name: 'euro-sign', label: 'Euro', tags: ['money', 'currency', 'eur'] },
1514
+ { name: 'sterling-sign', label: 'Pound', tags: ['money', 'currency', 'gbp'] },
1515
+ { name: 'yen-sign', label: 'Yen', tags: ['money', 'currency', 'jpy'] },
1516
+ { name: 'coins', label: 'Coins', tags: ['money', 'cash', 'currency'] },
1517
+ { name: 'money-bill', label: 'Money Bill', tags: ['cash', 'currency', 'payment'] },
1518
+ { name: 'wallet', label: 'Wallet', tags: ['money', 'payment', 'cash'] },
1519
+ { name: 'credit-card', label: 'Credit Card', tags: ['payment', 'card', 'bank'] },
1520
+ { name: 'money-check', label: 'Check', tags: ['payment', 'bank', 'check'] },
1521
+ { name: 'receipt', label: 'Receipt', tags: ['bill', 'invoice', 'payment'] },
1522
+ { name: 'file-invoice', label: 'Invoice', tags: ['bill', 'receipt', 'document'] },
1523
+ { name: 'file-invoice-dollar', label: 'Invoice Dollar', tags: ['bill', 'payment', 'money'] },
1524
+ { name: 'briefcase', label: 'Briefcase', tags: ['business', 'work', 'professional'] },
1525
+ { name: 'suitcase', label: 'Suitcase', tags: ['travel', 'business', 'luggage'] },
1526
+ { name: 'building', label: 'Building', tags: ['office', 'company', 'business'] },
1527
+ { name: 'building-columns', label: 'Bank', tags: ['bank', 'government', 'institution'] },
1528
+ { name: 'store', label: 'Store', tags: ['shop', 'retail', 'business'] },
1529
+ { name: 'handshake', label: 'Handshake', tags: ['agreement', 'partnership', 'deal'] },
1530
+ { name: 'scale-balanced', label: 'Balance', tags: ['law', 'justice', 'legal'] },
1531
+ { name: 'gavel', label: 'Gavel', tags: ['law', 'court', 'legal'] },
1532
+ // Technology & Tools
1533
+ { name: 'laptop', label: 'Laptop', tags: ['computer', 'notebook', 'device'] },
1534
+ { name: 'laptop-code', label: 'Laptop Code', tags: ['programming', 'development'] },
1535
+ { name: 'desktop', label: 'Desktop', tags: ['computer', 'monitor', 'screen'] },
1536
+ { name: 'tablet', label: 'Tablet', tags: ['ipad', 'device', 'mobile'] },
1537
+ { name: 'tablet-screen-button', label: 'Tablet Button', tags: ['device', 'touch'] },
1538
+ { name: 'keyboard', label: 'Keyboard', tags: ['input', 'typing', 'keys'] },
1539
+ { name: 'mouse', label: 'Mouse', tags: ['pointer', 'click', 'input'] },
1540
+ { name: 'display', label: 'Display', tags: ['monitor', 'screen', 'computer'] },
1541
+ { name: 'wifi', label: 'WiFi', tags: ['internet', 'connection', 'wireless'] },
1542
+ { name: 'ethernet', label: 'Ethernet', tags: ['network', 'connection', 'cable'] },
1543
+ { name: 'signal', label: 'Signal', tags: ['network', 'connection', 'wifi'] },
1544
+ { name: 'network-wired', label: 'Network', tags: ['connection', 'lan', 'ethernet'] },
1545
+ { name: 'database', label: 'Database', tags: ['data', 'storage', 'sql'] },
1546
+ { name: 'hard-drive', label: 'Hard Drive', tags: ['storage', 'disk', 'hdd'] },
1547
+ { name: 'server', label: 'Server', tags: ['hosting', 'backend', 'computer'] },
1548
+ { name: 'memory', label: 'Memory', tags: ['ram', 'chip', 'hardware'] },
1549
+ { name: 'microchip', label: 'Microchip', tags: ['chip', 'processor', 'cpu'] },
1550
+ { name: 'code', label: 'Code', tags: ['programming', 'development', 'coding'] },
1551
+ { name: 'code-branch', label: 'Git Branch', tags: ['version', 'git', 'branch'] },
1552
+ { name: 'code-commit', label: 'Commit', tags: ['git', 'version', 'save'] },
1553
+ { name: 'code-merge', label: 'Merge', tags: ['git', 'branch', 'combine'] },
1554
+ { name: 'code-pull-request', label: 'Pull Request', tags: ['git', 'pr', 'review'] },
1555
+ { name: 'terminal', label: 'Terminal', tags: ['console', 'command', 'cli'] },
1556
+ { name: 'window-maximize', label: 'Maximize', tags: ['window', 'expand', 'fullscreen'] },
1557
+ { name: 'window-minimize', label: 'Minimize', tags: ['window', 'collapse'] },
1558
+ { name: 'window-restore', label: 'Restore', tags: ['window', 'resize'] },
1559
+ { name: 'bug', label: 'Bug', tags: ['error', 'debug', 'issue'] },
1560
+ { name: 'wrench', label: 'Wrench', tags: ['tools', 'settings', 'fix'] },
1561
+ { name: 'screwdriver-wrench', label: 'Tools', tags: ['repair', 'fix', 'settings'] },
1562
+ { name: 'hammer', label: 'Hammer', tags: ['tool', 'build', 'construct'] },
1563
+ { name: 'shield', label: 'Shield', tags: ['security', 'protection', 'defense'] },
1564
+ { name: 'shield-halved', label: 'Shield Half', tags: ['security', 'protection'] },
1565
+ { name: 'lock', label: 'Lock', tags: ['security', 'private', 'secure'] },
1566
+ { name: 'lock-open', label: 'Lock Open', tags: ['unlocked', 'open'] },
1567
+ { name: 'unlock', label: 'Unlock', tags: ['open', 'access', 'unlock'] },
1568
+ { name: 'key', label: 'Key', tags: ['access', 'password', 'security'] },
1569
+ { name: 'user-lock', label: 'User Lock', tags: ['security', 'private', 'protected'] },
1570
+ { name: 'user-shield', label: 'User Shield', tags: ['security', 'protected', 'admin'] },
1571
+ { name: 'qrcode', label: 'QR Code', tags: ['code', 'scan', 'barcode'] },
1572
+ { name: 'barcode', label: 'Barcode', tags: ['scan', 'code', 'product'] },
1573
+ // Transportation & Location
1574
+ { name: 'car', label: 'Car', tags: ['vehicle', 'automobile', 'transport'] },
1575
+ { name: 'car-side', label: 'Car Side', tags: ['vehicle', 'automobile'] },
1576
+ { name: 'taxi', label: 'Taxi', tags: ['cab', 'transport', 'vehicle'] },
1577
+ { name: 'bus', label: 'Bus', tags: ['transport', 'public', 'vehicle'] },
1578
+ { name: 'van-shuttle', label: 'Van', tags: ['transport', 'vehicle'] },
1579
+ { name: 'truck', label: 'Truck', tags: ['vehicle', 'delivery', 'transport'] },
1580
+ { name: 'truck-fast', label: 'Fast Delivery', tags: ['shipping', 'express', 'delivery'] },
1581
+ { name: 'motorcycle', label: 'Motorcycle', tags: ['bike', 'vehicle', 'transport'] },
1582
+ { name: 'plane', label: 'Plane', tags: ['aircraft', 'travel', 'flight'] },
1583
+ { name: 'plane-departure', label: 'Departure', tags: ['flight', 'travel', 'takeoff'] },
1584
+ { name: 'plane-arrival', label: 'Arrival', tags: ['flight', 'travel', 'landing'] },
1585
+ { name: 'helicopter', label: 'Helicopter', tags: ['aircraft', 'flight'] },
1586
+ { name: 'rocket', label: 'Rocket', tags: ['space', 'launch', 'fast'] },
1587
+ { name: 'train', label: 'Train', tags: ['railway', 'transport', 'travel'] },
1588
+ { name: 'subway', label: 'Subway', tags: ['metro', 'underground', 'transport'] },
1589
+ { name: 'ship', label: 'Ship', tags: ['boat', 'vessel', 'water'] },
1590
+ { name: 'anchor', label: 'Anchor', tags: ['ship', 'marine', 'boat'] },
1591
+ { name: 'bicycle', label: 'Bicycle', tags: ['bike', 'cycle', 'transport'] },
1592
+ { name: 'road', label: 'Road', tags: ['street', 'path', 'route'] },
1593
+ { name: 'map', label: 'Map', tags: ['location', 'navigation', 'directions'] },
1594
+ { name: 'map-location', label: 'Map Location', tags: ['pin', 'marker', 'place'] },
1595
+ { name: 'map-pin', label: 'Location Pin', tags: ['pin', 'marker', 'place'] },
1596
+ { name: 'location-dot', label: 'Location', tags: ['pin', 'marker', 'gps'] },
1597
+ { name: 'location-crosshairs', label: 'GPS', tags: ['location', 'position', 'gps'] },
1598
+ { name: 'route', label: 'Route', tags: ['directions', 'path', 'navigation'] },
1599
+ { name: 'globe', label: 'Globe', tags: ['world', 'earth', 'global'] },
1600
+ { name: 'earth-americas', label: 'Americas', tags: ['world', 'global', 'earth'] },
1601
+ { name: 'earth-europe', label: 'Europe', tags: ['world', 'global', 'earth'] },
1602
+ { name: 'earth-asia', label: 'Asia', tags: ['world', 'global', 'earth'] },
1603
+ { name: 'compass', label: 'Compass', tags: ['direction', 'navigation', 'north'] },
1604
+ { name: 'street-view', label: 'Street View', tags: ['location', 'map', 'view'] },
1605
+ // Health & Medical
1606
+ { name: 'heart-pulse', label: 'Heart Rate', tags: ['health', 'medical', 'heartbeat'] },
1607
+ { name: 'heart-circle-plus', label: 'Heart Plus', tags: ['health', 'add', 'medical'] },
1608
+ { name: 'stethoscope', label: 'Stethoscope', tags: ['medical', 'doctor', 'health'] },
1609
+ { name: 'user-doctor', label: 'Doctor', tags: ['medical', 'physician', 'healthcare'] },
1610
+ { name: 'user-nurse', label: 'Nurse', tags: ['medical', 'healthcare', 'hospital'] },
1611
+ { name: 'pills', label: 'Pills', tags: ['medicine', 'drugs', 'medication'] },
1612
+ { name: 'capsules', label: 'Capsules', tags: ['medicine', 'pills', 'medication'] },
1613
+ { name: 'prescription-bottle', label: 'Prescription', tags: ['medicine', 'pharmacy'] },
1614
+ { name: 'syringe', label: 'Syringe', tags: ['injection', 'medical', 'vaccine'] },
1615
+ { name: 'vial', label: 'Vial', tags: ['medicine', 'vaccine', 'medical'] },
1616
+ { name: 'bandage', label: 'Bandage', tags: ['first aid', 'wound', 'medical'] },
1617
+ { name: 'thermometer', label: 'Thermometer', tags: ['temperature', 'health', 'medical'] },
1618
+ { name: 'hospital', label: 'Hospital', tags: ['medical', 'healthcare', 'building'] },
1619
+ { name: 'hospital-user', label: 'Patient', tags: ['medical', 'healthcare', 'patient'] },
1620
+ { name: 'bed-pulse', label: 'Hospital Bed', tags: ['medical', 'patient', 'hospital'] },
1621
+ { name: 'wheelchair', label: 'Wheelchair', tags: ['accessibility', 'medical', 'disabled'] },
1622
+ { name: 'crutch', label: 'Crutch', tags: ['medical', 'injury', 'support'] },
1623
+ { name: 'smoking', label: 'Smoking', tags: ['cigarette', 'health', 'no-smoking'] },
1624
+ { name: 'smoking-ban', label: 'No Smoking', tags: ['prohibited', 'health'] },
1625
+ // Education & Learning
1626
+ { name: 'graduation-cap', label: 'Graduation', tags: ['education', 'degree', 'graduate'] },
1627
+ { name: 'user-graduate', label: 'Graduate', tags: ['student', 'education', 'degree'] },
1628
+ { name: 'chalkboard-user', label: 'Teacher', tags: ['education', 'teaching', 'classroom'] },
1629
+ { name: 'school', label: 'School', tags: ['education', 'building', 'learning'] },
1630
+ { name: 'book', label: 'Book', tags: ['reading', 'education', 'library'] },
1631
+ { name: 'book-open', label: 'Open Book', tags: ['reading', 'study', 'learn'] },
1632
+ { name: 'book-bookmark', label: 'Bookmark', tags: ['reading', 'save', 'mark'] },
1633
+ { name: 'books', label: 'Books', tags: ['reading', 'library', 'education'] },
1634
+ { name: 'bookmark', label: 'Bookmark', tags: ['save', 'mark', 'reading'] },
1635
+ { name: 'pen', label: 'Pen', tags: ['write', 'draw', 'writing'] },
1636
+ { name: 'pen-fancy', label: 'Fancy Pen', tags: ['write', 'signature'] },
1637
+ { name: 'pen-nib', label: 'Pen Nib', tags: ['write', 'calligraphy'] },
1638
+ { name: 'pencil', label: 'Pencil', tags: ['write', 'draw', 'edit'] },
1639
+ { name: 'highlighter', label: 'Highlighter', tags: ['mark', 'emphasize', 'note'] },
1640
+ { name: 'marker', label: 'Marker', tags: ['write', 'draw', 'mark'] },
1641
+ { name: 'eraser', label: 'Eraser', tags: ['delete', 'remove', 'erase'] },
1642
+ { name: 'ruler', label: 'Ruler', tags: ['measure', 'straight', 'tool'] },
1643
+ { name: 'ruler-combined', label: 'Rulers', tags: ['measure', 'geometry'] },
1644
+ { name: 'calculator', label: 'Calculator', tags: ['math', 'calculate', 'compute'] },
1645
+ { name: 'square-root-variable', label: 'Math', tags: ['mathematics', 'equation'] },
1646
+ { name: 'microscope', label: 'Microscope', tags: ['science', 'research', 'lab'] },
1647
+ { name: 'flask', label: 'Flask', tags: ['science', 'chemistry', 'lab'] },
1648
+ { name: 'atom', label: 'Atom', tags: ['science', 'physics', 'chemistry'] },
1649
+ { name: 'dna', label: 'DNA', tags: ['science', 'biology', 'genetics'] },
1650
+ { name: 'brain', label: 'Brain', tags: ['mind', 'think', 'intelligence'] },
1651
+ { name: 'certificate', label: 'Certificate', tags: ['award', 'achievement', 'diploma'] },
1652
+ { name: 'award', label: 'Award', tags: ['trophy', 'achievement', 'prize'] },
1653
+ { name: 'medal', label: 'Medal', tags: ['award', 'achievement', 'winner'] },
1654
+ { name: 'trophy', label: 'Trophy', tags: ['award', 'winner', 'achievement'] },
1655
+ // Food & Dining
1656
+ { name: 'utensils', label: 'Utensils', tags: ['food', 'dining', 'restaurant'] },
1657
+ { name: 'fork-knife', label: 'Fork Knife', tags: ['food', 'dining', 'restaurant'] },
1658
+ { name: 'plate-utensils', label: 'Plate', tags: ['food', 'dining', 'meal'] },
1659
+ { name: 'pizza-slice', label: 'Pizza', tags: ['food', 'slice', 'italian'] },
1660
+ { name: 'burger', label: 'Burger', tags: ['food', 'fast', 'hamburger'] },
1661
+ { name: 'hotdog', label: 'Hotdog', tags: ['food', 'fast'] },
1662
+ { name: 'drumstick-bite', label: 'Chicken', tags: ['food', 'meat', 'poultry'] },
1663
+ { name: 'ice-cream', label: 'Ice Cream', tags: ['dessert', 'sweet', 'frozen'] },
1664
+ { name: 'mug-hot', label: 'Hot Beverage', tags: ['drink', 'coffee', 'tea'] },
1665
+ { name: 'coffee', label: 'Coffee', tags: ['drink', 'beverage', 'cafe'] },
1666
+ { name: 'mug-saucer', label: 'Coffee Cup', tags: ['drink', 'coffee', 'tea'] },
1667
+ { name: 'glass-water', label: 'Water', tags: ['drink', 'beverage', 'glass'] },
1668
+ { name: 'wine-glass', label: 'Wine', tags: ['drink', 'alcohol', 'beverage'] },
1669
+ { name: 'champagne-glasses', label: 'Champagne', tags: ['celebrate', 'drink', 'toast'] },
1670
+ { name: 'martini-glass', label: 'Martini', tags: ['drink', 'alcohol', 'cocktail'] },
1671
+ { name: 'beer-mug-empty', label: 'Beer', tags: ['drink', 'alcohol', 'beverage'] },
1672
+ { name: 'cake', label: 'Cake', tags: ['dessert', 'sweet', 'birthday'] },
1673
+ { name: 'cake-candles', label: 'Birthday Cake', tags: ['birthday', 'celebration', 'party'] },
1674
+ { name: 'cookie', label: 'Cookie', tags: ['food', 'dessert', 'sweet'] },
1675
+ { name: 'candy-cane', label: 'Candy Cane', tags: ['candy', 'sweet', 'christmas'] },
1676
+ { name: 'apple-whole', label: 'Apple', tags: ['fruit', 'healthy', 'food'] },
1677
+ { name: 'lemon', label: 'Lemon', tags: ['fruit', 'citrus', 'food'] },
1678
+ { name: 'carrot', label: 'Carrot', tags: ['vegetable', 'healthy', 'food'] },
1679
+ { name: 'pepper-hot', label: 'Pepper', tags: ['spicy', 'food', 'hot'] },
1680
+ // Sports & Recreation
1681
+ { name: 'football', label: 'Football', tags: ['sport', 'soccer', 'game'] },
1682
+ { name: 'futbol', label: 'Soccer Ball', tags: ['sport', 'football', 'ball'] },
1683
+ { name: 'basketball', label: 'Basketball', tags: ['sport', 'ball', 'game'] },
1684
+ { name: 'baseball', label: 'Baseball', tags: ['sport', 'ball', 'game'] },
1685
+ { name: 'baseball-bat-ball', label: 'Baseball Bat', tags: ['sport', 'baseball'] },
1686
+ { name: 'volleyball', label: 'Volleyball', tags: ['sport', 'ball', 'game'] },
1687
+ { name: 'table-tennis-paddle-ball', label: 'Table Tennis', tags: ['sport', 'ping-pong'] },
1688
+ { name: 'golf-ball-tee', label: 'Golf', tags: ['sport', 'golf', 'game'] },
1689
+ { name: 'hockey-puck', label: 'Hockey', tags: ['sport', 'ice', 'game'] },
1690
+ { name: 'bowling-ball', label: 'Bowling', tags: ['sport', 'game', 'ball'] },
1691
+ { name: 'person-running', label: 'Running', tags: ['sport', 'exercise', 'fitness'] },
1692
+ { name: 'person-biking', label: 'Biking', tags: ['sport', 'exercise', 'cycling'] },
1693
+ { name: 'person-swimming', label: 'Swimming', tags: ['sport', 'water', 'exercise'] },
1694
+ { name: 'person-skiing', label: 'Skiing', tags: ['sport', 'winter', 'snow'] },
1695
+ { name: 'dumbbell', label: 'Dumbbell', tags: ['fitness', 'weight', 'gym'] },
1696
+ { name: 'weight-hanging', label: 'Weight', tags: ['fitness', 'gym', 'exercise'] },
1697
+ { name: 'heart', label: 'Heart', tags: ['health', 'fitness', 'cardio'] },
1698
+ { name: 'stopwatch-20', label: 'Timer', tags: ['time', 'sport', 'track'] },
1699
+ // Weather & Nature
1700
+ { name: 'sun', label: 'Sun', tags: ['weather', 'bright', 'sunny'] },
1701
+ { name: 'moon', label: 'Moon', tags: ['night', 'dark', 'lunar'] },
1702
+ { name: 'star', label: 'Star', tags: ['night', 'sky', 'favorite'] },
1703
+ { name: 'cloud', label: 'Cloud', tags: ['weather', 'sky', 'cloudy'] },
1704
+ { name: 'cloud-sun', label: 'Partly Cloudy', tags: ['weather', 'mixed'] },
1705
+ { name: 'cloud-moon', label: 'Cloudy Night', tags: ['weather', 'night'] },
1706
+ { name: 'cloud-rain', label: 'Rain', tags: ['weather', 'precipitation', 'rainy'] },
1707
+ { name: 'cloud-showers-heavy', label: 'Heavy Rain', tags: ['weather', 'storm', 'rain'] },
1708
+ { name: 'umbrella', label: 'Umbrella', tags: ['rain', 'weather', 'protection'] },
1709
+ { name: 'snowflake', label: 'Snow', tags: ['weather', 'cold', 'winter'] },
1710
+ { name: 'icicles', label: 'Icicles', tags: ['winter', 'cold', 'ice'] },
1711
+ { name: 'temperature-high', label: 'Hot', tags: ['weather', 'temperature', 'heat'] },
1712
+ { name: 'temperature-low', label: 'Cold', tags: ['weather', 'temperature', 'cool'] },
1713
+ { name: 'bolt', label: 'Lightning', tags: ['weather', 'storm', 'thunder'] },
1714
+ { name: 'bolt-lightning', label: 'Thunder', tags: ['weather', 'storm', 'lightning'] },
1715
+ { name: 'wind', label: 'Wind', tags: ['weather', 'breeze', 'air'] },
1716
+ { name: 'tornado', label: 'Tornado', tags: ['weather', 'storm', 'cyclone'] },
1717
+ { name: 'water', label: 'Water', tags: ['nature', 'liquid', 'sea'] },
1718
+ { name: 'droplet', label: 'Droplet', tags: ['water', 'liquid', 'drop'] },
1719
+ { name: 'fire', label: 'Fire', tags: ['hot', 'burn', 'flame'] },
1720
+ { name: 'fire-flame-curved', label: 'Flame', tags: ['fire', 'hot', 'burn'] },
1721
+ { name: 'tree', label: 'Tree', tags: ['nature', 'plant', 'forest'] },
1722
+ { name: 'seedling', label: 'Seedling', tags: ['plant', 'grow', 'nature'] },
1723
+ { name: 'leaf', label: 'Leaf', tags: ['nature', 'plant', 'green'] },
1724
+ { name: 'clover', label: 'Clover', tags: ['nature', 'plant', 'lucky'] },
1725
+ { name: 'flower', label: 'Flower', tags: ['nature', 'plant', 'blossom'] },
1726
+ { name: 'feather', label: 'Feather', tags: ['nature', 'bird', 'light'] },
1727
+ { name: 'mountain', label: 'Mountain', tags: ['nature', 'landscape', 'peak'] },
1728
+ // Shopping & Commerce
1729
+ { name: 'shopping-cart', label: 'Shopping Cart', tags: ['buy', 'purchase', 'shop'] },
1730
+ { name: 'cart-plus', label: 'Add to Cart', tags: ['shopping', 'add', 'buy'] },
1731
+ { name: 'cart-shopping', label: 'Cart', tags: ['shop', 'buy', 'store'] },
1732
+ { name: 'bag-shopping', label: 'Shopping Bag', tags: ['buy', 'store', 'retail'] },
1733
+ { name: 'basket-shopping', label: 'Basket', tags: ['shopping', 'buy', 'cart'] },
1734
+ { name: 'store', label: 'Store', tags: ['shop', 'retail', 'business'] },
1735
+ { name: 'shop', label: 'Shop', tags: ['store', 'retail', 'business'] },
1736
+ { name: 'cash-register', label: 'Cash Register', tags: ['payment', 'checkout', 'pos'] },
1737
+ { name: 'tags', label: 'Tags', tags: ['price', 'label', 'sale'] },
1738
+ { name: 'tag', label: 'Tag', tags: ['price', 'label', 'sale'] },
1739
+ { name: 'barcode', label: 'Barcode', tags: ['scan', 'product', 'price'] },
1740
+ { name: 'percent', label: 'Percent', tags: ['discount', 'sale', 'offer'] },
1741
+ { name: 'gift', label: 'Gift', tags: ['present', 'surprise', 'celebration'] },
1742
+ { name: 'gifts', label: 'Gifts', tags: ['presents', 'celebration'] },
1743
+ { name: 'box', label: 'Box', tags: ['package', 'container', 'shipping'] },
1744
+ { name: 'box-open', label: 'Open Box', tags: ['unpack', 'delivery', 'package'] },
1745
+ { name: 'boxes-stacked', label: 'Boxes', tags: ['inventory', 'storage', 'warehouse'] },
1746
+ // Security & Safety
1747
+ { name: 'eye', label: 'Eye', tags: ['view', 'watch', 'visible'] },
1748
+ { name: 'eye-slash', label: 'Hide', tags: ['hidden', 'invisible', 'password'] },
1749
+ { name: 'eye-low-vision', label: 'Low Vision', tags: ['accessibility', 'vision'] },
1750
+ { name: 'user-secret', label: 'Secret User', tags: ['anonymous', 'hidden', 'spy'] },
1751
+ { name: 'fingerprint', label: 'Fingerprint', tags: ['biometric', 'identity', 'security'] },
1752
+ { name: 'id-card', label: 'ID Card', tags: ['identity', 'badge', 'credential'] },
1753
+ { name: 'id-badge', label: 'Badge', tags: ['identity', 'credential', 'staff'] },
1754
+ { name: 'fire', label: 'Fire', tags: ['hot', 'burn', 'danger'] },
1755
+ { name: 'fire-extinguisher', label: 'Fire Extinguisher', tags: ['safety', 'emergency'] },
1756
+ { name: 'triangle-exclamation', label: 'Warning', tags: ['alert', 'caution', 'danger'] },
1757
+ { name: 'exclamation', label: 'Exclamation', tags: ['alert', 'important', 'warning'] },
1758
+ { name: 'circle-exclamation', label: 'Alert', tags: ['warning', 'important'] },
1759
+ { name: 'ban', label: 'Ban', tags: ['prohibited', 'forbidden', 'stop'] },
1760
+ { name: 'circle-radiation', label: 'Radiation', tags: ['danger', 'hazard', 'warning'] },
1761
+ { name: 'skull-crossbones', label: 'Danger', tags: ['hazard', 'poison', 'warning'] },
1762
+ { name: 'biohazard', label: 'Biohazard', tags: ['danger', 'hazard', 'warning'] },
1763
+ // Miscellaneous
1764
+ { name: 'circle', label: 'Circle', tags: ['shape', 'round', 'dot'] },
1765
+ { name: 'square', label: 'Square', tags: ['shape', 'box'] },
1766
+ { name: 'square-full', label: 'Full Square', tags: ['shape', 'filled'] },
1767
+ { name: 'circle-dot', label: 'Dot', tags: ['point', 'marker', 'bullet'] },
1768
+ { name: 'question', label: 'Question', tags: ['help', 'ask', 'faq'] },
1769
+ { name: 'circle-question', label: 'Help', tags: ['question', 'support', 'info'] },
1770
+ { name: 'circle-info', label: 'Info', tags: ['information', 'details', 'about'] },
1771
+ { name: 'info', label: 'Information', tags: ['info', 'details', 'help'] },
1772
+ { name: 'lightbulb', label: 'Lightbulb', tags: ['idea', 'bright', 'innovation'] },
1773
+ { name: 'bolt', label: 'Bolt', tags: ['lightning', 'fast', 'power'] },
1774
+ { name: 'wand-magic', label: 'Magic Wand', tags: ['magic', 'wizard', 'sparkle'] },
1775
+ { name: 'wand-magic-sparkles', label: 'Magic', tags: ['wizard', 'sparkle', 'enchant'] },
1776
+ { name: 'puzzle-piece', label: 'Puzzle', tags: ['piece', 'solve', 'game'] },
1777
+ { name: 'gamepad', label: 'Gamepad', tags: ['gaming', 'controller', 'play'] },
1778
+ { name: 'dice', label: 'Dice', tags: ['game', 'random', 'chance'] },
1779
+ { name: 'dice-d20', label: 'D20 Dice', tags: ['game', 'tabletop', 'rpg'] },
1780
+ { name: 'chess', label: 'Chess', tags: ['game', 'strategy', 'board'] },
1781
+ { name: 'spade', label: 'Spade', tags: ['cards', 'game', 'suit'] },
1782
+ { name: 'heart', label: 'Heart Card', tags: ['cards', 'game', 'suit'] },
1783
+ { name: 'diamond', label: 'Diamond', tags: ['cards', 'game', 'suit'] },
1784
+ { name: 'club', label: 'Club', tags: ['cards', 'game', 'suit'] },
1785
+ { name: 'palette', label: 'Palette', tags: ['color', 'art', 'paint'] },
1786
+ { name: 'brush', label: 'Brush', tags: ['paint', 'art', 'draw'] },
1787
+ { name: 'paintbrush', label: 'Paintbrush', tags: ['art', 'paint', 'draw'] },
1788
+ { name: 'scissors', label: 'Scissors', tags: ['cut', 'trim', 'tool'] },
1789
+ { name: 'crown', label: 'Crown', tags: ['king', 'royal', 'premium'] },
1790
+ { name: 'gem', label: 'Gem', tags: ['diamond', 'jewel', 'precious'] },
1791
+ { name: 'ring', label: 'Ring', tags: ['jewelry', 'wedding', 'engagement'] },
1792
+ { name: 'mug-hot', label: 'Hot Drink', tags: ['coffee', 'tea', 'beverage'] },
1793
+ { name: 'battery-full', label: 'Battery Full', tags: ['power', 'charge', 'energy'] },
1794
+ { name: 'battery-half', label: 'Battery Half', tags: ['power', 'charge'] },
1795
+ { name: 'battery-empty', label: 'Battery Empty', tags: ['power', 'low', 'charge'] },
1796
+ { name: 'plug', label: 'Plug', tags: ['power', 'electricity', 'connect'] },
1797
+ { name: 'magnet', label: 'Magnet', tags: ['attract', 'magnetic', 'pull'] },
1798
+ { name: 'compass-drafting', label: 'Drafting Compass', tags: ['geometry', 'draw', 'circle'] },
1799
+ { name: 'rotate', label: 'Rotate', tags: ['spin', 'turn', 'refresh'] },
1800
+ { name: 'infinity', label: 'Infinity', tags: ['unlimited', 'endless', 'loop'] },
1801
+ ];
1802
+ //#endregion
1803
+ //#region ---- Default Providers ----
1804
+ /**
1805
+ * Default icon provider that provides the base set of FontAwesome icons.
1806
+ */
1807
+ class AXPIconProviderDefault extends AXPIconProvider {
1808
+ async provide() {
1809
+ return DEFAULT_ICONS;
1810
+ }
1811
+ }
1812
+ /**
1813
+ * Default icon style provider that provides the base set of FontAwesome styles.
1814
+ */
1815
+ class AXPIconStyleProviderDefault extends AXPIconStyleProvider {
1816
+ async provide() {
1817
+ return DEFAULT_ICON_STYLES;
1818
+ }
1819
+ }
1820
+ //#endregion
1821
+
1822
+ //#region ---- Provider Functions ----
1823
+ /**
1824
+ * Provides the default icon provider to the application.
1825
+ * This should be registered in your app module or config.
1826
+ */
1827
+ function provideDefaultIconProvider() {
1828
+ return {
1829
+ provide: AXP_ICON_PROVIDER,
1830
+ useClass: AXPIconProviderDefault,
1831
+ multi: true,
1832
+ };
1833
+ }
1834
+ /**
1835
+ * Provides the default icon style provider to the application.
1836
+ * This should be registered in your app module or config.
1837
+ */
1838
+ function provideDefaultIconStyleProvider() {
1839
+ return {
1840
+ provide: AXP_ICON_STYLE_PROVIDER,
1841
+ useClass: AXPIconStyleProviderDefault,
1842
+ multi: true,
1843
+ };
1844
+ }
1845
+ /**
1846
+ * Provides both default icon and style providers to the application.
1847
+ * This is a convenience function that combines provideDefaultIconProvider() and provideDefaultIconStyleProvider().
1848
+ */
1849
+ function provideDefaultIconChooser() {
1850
+ return [provideDefaultIconProvider(), provideDefaultIconStyleProvider()];
1851
+ }
1852
+ /**
1853
+ * Provides a custom icon provider to the application.
1854
+ * This ADDS additional icons alongside the default icon set.
1855
+ *
1856
+ * @param providerClass - The custom icon provider class
1857
+ *
1858
+ * @example
1859
+ * ```typescript
1860
+ * class MyCustomIconProvider extends AXPIconProvider {
1861
+ * async provide(): Promise<AXPFontAwesomeIcon[]> {
1862
+ * return [
1863
+ * { name: 'custom-icon', label: 'Custom Icon' }
1864
+ * ];
1865
+ * }
1866
+ * }
1867
+ *
1868
+ * export const appConfig: ApplicationConfig = {
1869
+ * providers: [
1870
+ * provideCustomIconProvider(MyCustomIconProvider),
1871
+ * ]
1872
+ * };
1873
+ * ```
1874
+ */
1875
+ function provideCustomIconProvider(providerClass) {
1876
+ return {
1877
+ provide: AXP_ICON_PROVIDER,
1878
+ useClass: providerClass,
1879
+ multi: true,
1880
+ };
1881
+ }
1882
+ /**
1883
+ * Provides a custom icon style provider to the application.
1884
+ * This ADDS additional icon styles alongside the default styles.
1885
+ *
1886
+ * @param providerClass - The custom icon style provider class
1887
+ *
1888
+ * @example
1889
+ * ```typescript
1890
+ * class MyCustomIconStyleProvider extends AXPIconStyleProvider {
1891
+ * async provide(): Promise<AXPFontAwesomeIconStyle[]> {
1892
+ * return [
1893
+ * { name: 'fa-custom', label: 'Custom' }
1894
+ * ];
1895
+ * }
1896
+ * }
1897
+ *
1898
+ * export const appConfig: ApplicationConfig = {
1899
+ * providers: [
1900
+ * provideCustomIconStyleProvider(MyCustomIconStyleProvider),
1901
+ * ]
1902
+ * };
1903
+ * ```
1904
+ */
1905
+ function provideCustomIconStyleProvider(providerClass) {
1906
+ return {
1907
+ provide: AXP_ICON_STYLE_PROVIDER,
1908
+ useClass: providerClass,
1909
+ multi: true,
1910
+ };
1911
+ }
1912
+ //#endregion
1913
+
1511
1914
  class AXPMenuOrientationChooserWidgetComponent extends AXPValueWidgetComponent {
1512
1915
  constructor() {
1513
1916
  super(...arguments);
@@ -1536,7 +1939,7 @@ class AXPMenuOrientationChooserWidgetComponent extends AXPValueWidgetComponent {
1536
1939
  <span>{{ '@layout:menu-modes.' + orientation.id | translate | async }}</span>
1537
1940
  </div>
1538
1941
  }
1539
- `, isInline: true, styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}:host>div{display:flex;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}:host>div:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-surface));color:rgb(var(--ax-sys-color-on-surface));border-color:rgb(var(--ax-sys-color-border-surface))}:host>div{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}:host>div:hover{background-color:rgb(var(--ax-sys-color-dark-surface));color:rgb(var(--ax-sys-color-on-dark-surface));border-color:rgb(var(--ax-sys-color-border-dark-surface))}:host>div.--selected{background-color:rgb(var(--ax-sys-color-primary-lighter-surface));color:rgb(var(--ax-sys-color-on-primary-lighter-surface));border-color:rgb(var(--ax-sys-color-border-primary-lighter-surface))}:host>div>div{display:flex;align-items:center;justify-content:center}:host>div>div i{font-size:1.25rem;line-height:1.75rem}:host>div>span{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.625}:host>div{padding-top:.25rem!important;padding-bottom:.25rem!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1942
+ `, isInline: true, styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}:host>div{display:flex;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}:host>div:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-surface));color:rgb(var(--ax-sys-color-on-surface));border-color:rgb(var(--ax-sys-color-border-surface))}:host>div{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}:host>div:hover{background-color:rgb(var(--ax-sys-color-dark-surface));color:rgb(var(--ax-sys-color-on-dark-surface));border-color:rgb(var(--ax-sys-color-border-dark-surface))}:host>div.--selected{background-color:rgb(var(--ax-sys-color-primary-lighter-surface));color:rgb(var(--ax-sys-color-on-primary-lighter-surface));border-color:rgb(var(--ax-sys-color-border-primary-lighter-surface))}:host>div>div{display:flex;align-items:center;justify-content:center}:host>div>div i{font-size:1.25rem;line-height:1.75rem}:host>div>span{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.625}:host>div{padding-top:.25rem!important;padding-bottom:.25rem!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1540
1943
  }
1541
1944
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPMenuOrientationChooserWidgetComponent, decorators: [{
1542
1945
  type: Component,
@@ -1604,7 +2007,7 @@ class AXPThemeModeChooserWidgetComponent extends AXPValueWidgetComponent {
1604
2007
  <span>{{ '@layout:theme-modes.' + mode.id | translate | async }}</span>
1605
2008
  </div>
1606
2009
  }
1607
- `, isInline: true, styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}:host>div{display:flex;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}:host>div:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-surface));color:rgb(var(--ax-sys-color-on-surface));border-color:rgb(var(--ax-sys-color-border-surface))}:host>div{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}:host>div:hover{background-color:rgb(var(--ax-sys-color-dark-surface));color:rgb(var(--ax-sys-color-on-dark-surface));border-color:rgb(var(--ax-sys-color-border-dark-surface))}:host>div.--selected{background-color:rgb(var(--ax-sys-color-primary-lighter-surface));color:rgb(var(--ax-sys-color-on-primary-lighter-surface));border-color:rgb(var(--ax-sys-color-border-primary-lighter-surface))}:host>div>div{display:flex;align-items:center;justify-content:center}:host>div>div i{font-size:1.25rem;line-height:1.75rem}:host>div>span{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.625}:host>div{padding-top:.25rem!important;padding-bottom:.25rem!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2010
+ `, isInline: true, styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}:host>div{display:flex;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem;border-radius:.5rem;padding:.5rem 1rem;background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}:host>div:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-surface));color:rgb(var(--ax-sys-color-on-surface));border-color:rgb(var(--ax-sys-color-border-surface))}:host>div{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}:host>div:hover{background-color:rgb(var(--ax-sys-color-dark-surface));color:rgb(var(--ax-sys-color-on-dark-surface));border-color:rgb(var(--ax-sys-color-border-dark-surface))}:host>div.--selected{background-color:rgb(var(--ax-sys-color-primary-lighter-surface));color:rgb(var(--ax-sys-color-on-primary-lighter-surface));border-color:rgb(var(--ax-sys-color-border-primary-lighter-surface))}:host>div>div{display:flex;align-items:center;justify-content:center}:host>div>div i{font-size:1.25rem;line-height:1.75rem}:host>div>span{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.625}:host>div{padding-top:.25rem!important;padding-bottom:.25rem!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1608
2011
  }
1609
2012
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPThemeModeChooserWidgetComponent, decorators: [{
1610
2013
  type: Component,
@@ -1732,7 +2135,7 @@ class AXPThemesSharedModule {
1732
2135
  });
1733
2136
  }
1734
2137
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPThemesSharedModule, deps: [{ token: i1$2.AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
1735
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: AXPThemesSharedModule, imports: [i2$4.AXPComponentSlotModule, i3$1.AXPWidgetCoreModule] }); }
2138
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: AXPThemesSharedModule, imports: [i2$3.AXPComponentSlotModule, i3$1.AXPWidgetCoreModule] }); }
1736
2139
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AXPThemesSharedModule, providers: [
1737
2140
  {
1738
2141
  provide: AXP_SETTING_DEFINITION_PROVIDER,
@@ -1743,6 +2146,7 @@ class AXPThemesSharedModule {
1743
2146
  },
1744
2147
  multi: true,
1745
2148
  },
2149
+ ...provideDefaultIconChooser(),
1746
2150
  ], imports: [AXPComponentSlotModule.forRoot({
1747
2151
  'root-header-end': [
1748
2152
  {
@@ -1801,6 +2205,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1801
2205
  },
1802
2206
  multi: true,
1803
2207
  },
2208
+ ...provideDefaultIconChooser(),
1804
2209
  ],
1805
2210
  }]
1806
2211
  }], ctorParameters: () => [{ type: i1$2.AXPAppStartUpService }, { type: i0.Injector }] });