@acorex-platform/framework-client 0.0.10

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 (112) hide show
  1. package/README.md +7 -0
  2. package/auth/README.md +3 -0
  3. package/common/README.md +3 -0
  4. package/core/README.md +4 -0
  5. package/fesm2022/acorex-platform-framework-client-auth.mjs +1383 -0
  6. package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -0
  7. package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CbzOYCnI.mjs +190 -0
  8. package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CbzOYCnI.mjs.map +1 -0
  9. package/fesm2022/acorex-platform-framework-client-common.mjs +9467 -0
  10. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -0
  11. package/fesm2022/acorex-platform-framework-client-core.mjs +4655 -0
  12. package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-framework-client-domain.mjs +3189 -0
  14. package/fesm2022/acorex-platform-framework-client-domain.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +3439 -0
  16. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -0
  17. package/fesm2022/acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-CWVU3wXL.mjs +134 -0
  18. package/fesm2022/acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-CWVU3wXL.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-framework-client-layout-components.mjs +9777 -0
  20. package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs +2799 -0
  22. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-framework-client-layout-entity-attachments-page.component-CxBxxpmA.mjs +376 -0
  24. package/fesm2022/acorex-platform-framework-client-layout-entity-attachments-page.component-CxBxxpmA.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-framework-client-layout-entity-file-list-popup.component-l0JAHKIH.mjs +100 -0
  26. package/fesm2022/acorex-platform-framework-client-layout-entity-file-list-popup.component-l0JAHKIH.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +26299 -0
  28. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-framework-client-layout-views.mjs +2960 -0
  30. package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +4711 -0
  32. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -0
  33. package/fesm2022/acorex-platform-framework-client-layout-widgets-button-widget-designer.component-CpkWwygb.mjs +72 -0
  34. package/fesm2022/acorex-platform-framework-client-layout-widgets-button-widget-designer.component-CpkWwygb.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-framework-client-layout-widgets-image-preview.popup-C_EPAvCU.mjs +29 -0
  36. package/fesm2022/acorex-platform-framework-client-layout-widgets-image-preview.popup-C_EPAvCU.mjs.map +1 -0
  37. package/fesm2022/acorex-platform-framework-client-layout-widgets-page-widget-designer.component-CmtTq2Mt.mjs +172 -0
  38. package/fesm2022/acorex-platform-framework-client-layout-widgets-page-widget-designer.component-CmtTq2Mt.mjs.map +1 -0
  39. package/fesm2022/acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DSx0E3NV.mjs +513 -0
  40. package/fesm2022/acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DSx0E3NV.mjs.map +1 -0
  41. package/fesm2022/acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-DdfcGV1C.mjs +274 -0
  42. package/fesm2022/acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-DdfcGV1C.mjs.map +1 -0
  43. package/fesm2022/acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-CntopmDS.mjs +64 -0
  44. package/fesm2022/acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-CntopmDS.mjs.map +1 -0
  45. package/fesm2022/acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-B5kSWxGk.mjs +34 -0
  46. package/fesm2022/acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-B5kSWxGk.mjs.map +1 -0
  47. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +28553 -0
  48. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs.map +1 -0
  49. package/fesm2022/acorex-platform-framework-client-native.mjs +155 -0
  50. package/fesm2022/acorex-platform-framework-client-native.mjs.map +1 -0
  51. package/fesm2022/acorex-platform-framework-client-runtime.mjs +911 -0
  52. package/fesm2022/acorex-platform-framework-client-runtime.mjs.map +1 -0
  53. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-create-view.component-DnTHwsDJ.mjs +160 -0
  54. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-create-view.component-DnTHwsDJ.mjs.map +1 -0
  55. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-BpR9g6QS.mjs +121 -0
  56. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-BpR9g6QS.mjs.map +1 -0
  57. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-D1a7UI71.mjs +236 -0
  58. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-D1a7UI71.mjs.map +1 -0
  59. package/fesm2022/acorex-platform-framework-client-themes-default-error-401.component-D--_MIar.mjs +48 -0
  60. package/fesm2022/acorex-platform-framework-client-themes-default-error-401.component-D--_MIar.mjs.map +1 -0
  61. package/fesm2022/acorex-platform-framework-client-themes-default-error-404.component-Byyqk8pH.mjs +42 -0
  62. package/fesm2022/acorex-platform-framework-client-themes-default-error-404.component-Byyqk8pH.mjs.map +1 -0
  63. package/fesm2022/acorex-platform-framework-client-themes-default-error-offline.component-DR6G8gPC.mjs +19 -0
  64. package/fesm2022/acorex-platform-framework-client-themes-default-error-offline.component-DR6G8gPC.mjs.map +1 -0
  65. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +4160 -0
  66. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -0
  67. package/fesm2022/acorex-platform-framework-client-themes-shared-icon-chooser-column.component-CXSGiTCK.mjs +55 -0
  68. package/fesm2022/acorex-platform-framework-client-themes-shared-icon-chooser-column.component-CXSGiTCK.mjs.map +1 -0
  69. package/fesm2022/acorex-platform-framework-client-themes-shared-icon-chooser-view.component-BY5clQ1J.mjs +57 -0
  70. package/fesm2022/acorex-platform-framework-client-themes-shared-icon-chooser-view.component-BY5clQ1J.mjs.map +1 -0
  71. package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-DEL2YOTP.mjs +234 -0
  72. package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-DEL2YOTP.mjs.map +1 -0
  73. package/fesm2022/acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-BXl8u4Yp.mjs +94 -0
  74. package/fesm2022/acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-BXl8u4Yp.mjs.map +1 -0
  75. package/fesm2022/acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-i2sOOkVj.mjs +86 -0
  76. package/fesm2022/acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-i2sOOkVj.mjs.map +1 -0
  77. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs +2375 -0
  78. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs.map +1 -0
  79. package/fesm2022/acorex-platform-framework-client-workflow.mjs +2836 -0
  80. package/fesm2022/acorex-platform-framework-client-workflow.mjs.map +1 -0
  81. package/fesm2022/acorex-platform-framework-client.mjs +6 -0
  82. package/fesm2022/acorex-platform-framework-client.mjs.map +1 -0
  83. package/layout/builder/README.md +1578 -0
  84. package/layout/components/README.md +3 -0
  85. package/layout/designer/README.md +4 -0
  86. package/layout/entity/README.md +4 -0
  87. package/layout/views/README.md +3 -0
  88. package/layout/widget-core/README.md +4 -0
  89. package/layout/widgets/README.md +3 -0
  90. package/native/README.md +4 -0
  91. package/package.json +98 -0
  92. package/runtime/README.md +3 -0
  93. package/themes/default/README.md +3 -0
  94. package/themes/shared/README.md +3 -0
  95. package/types/acorex-platform-framework-client-auth.d.ts +690 -0
  96. package/types/acorex-platform-framework-client-common.d.ts +3287 -0
  97. package/types/acorex-platform-framework-client-core.d.ts +1849 -0
  98. package/types/acorex-platform-framework-client-domain.d.ts +1968 -0
  99. package/types/acorex-platform-framework-client-layout-builder.d.ts +1058 -0
  100. package/types/acorex-platform-framework-client-layout-components.d.ts +3362 -0
  101. package/types/acorex-platform-framework-client-layout-designer.d.ts +501 -0
  102. package/types/acorex-platform-framework-client-layout-entity.d.ts +4374 -0
  103. package/types/acorex-platform-framework-client-layout-views.d.ts +975 -0
  104. package/types/acorex-platform-framework-client-layout-widget-core.d.ts +1080 -0
  105. package/types/acorex-platform-framework-client-layout-widgets.d.ts +5263 -0
  106. package/types/acorex-platform-framework-client-native.d.ts +28 -0
  107. package/types/acorex-platform-framework-client-runtime.d.ts +301 -0
  108. package/types/acorex-platform-framework-client-themes-default.d.ts +889 -0
  109. package/types/acorex-platform-framework-client-themes-shared.d.ts +202 -0
  110. package/types/acorex-platform-framework-client-workflow.d.ts +1345 -0
  111. package/types/acorex-platform-framework-client.d.ts +2 -0
  112. package/workflow/README.md +4 -0
@@ -0,0 +1,2375 @@
1
+ import * as i2 from '@acorex/components/button';
2
+ import { AXButtonModule } from '@acorex/components/button';
3
+ import * as i3 from '@acorex/components/decorators';
4
+ import { AXDecoratorModule } from '@acorex/components/decorators';
5
+ import * as i4 from '@acorex/components/dropdown';
6
+ import { AXDropdownModule } from '@acorex/components/dropdown';
7
+ import * as i1 from '@angular/common';
8
+ import { CommonModule } from '@angular/common';
9
+ import * as i0 from '@angular/core';
10
+ import { computed, inject, effect, ChangeDetectionStrategy, Component, InjectionToken, Injectable, Input, signal, Injector, NgModule } from '@angular/core';
11
+ import { AXPSettingsService, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';
12
+ import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';
13
+ import * as i1$3 from '@acorex-platform/framework-client/core';
14
+ import { AXPScreenSize, AXPDeviceService, AXPDebugService, OVERLAY_LAYOUT_TRACE_NS, AXPComponentSlotModule } from '@acorex-platform/framework-client/core';
15
+ import { HttpClient } from '@angular/common/http';
16
+ import { signalStore, withState, withComputed, withMethods, patchState, withHooks } from '@ngrx/signals';
17
+ import { timer, firstValueFrom, filter } from 'rxjs';
18
+ import * as i5 from '@acorex/core/translation';
19
+ import { AXTranslationModule } from '@acorex/core/translation';
20
+ import { AXPValueWidgetComponent, AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY, AXP_WIDGETS_LAYOUT_CATEGORY, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';
21
+ import { AXPopupService } from '@acorex/components/popup';
22
+ import * as i2$1 from '@acorex/components/button-group';
23
+ import { AXButtonGroupModule } from '@acorex/components/button-group';
24
+ import { AXBasePageComponent } from '@acorex/components/page';
25
+ import * as i1$1 from '@acorex/components/search-box';
26
+ import { AXSearchBoxModule } from '@acorex/components/search-box';
27
+ import { AXSelectionCdkModule } from '@acorex/cdk/selection';
28
+ import * as i4$1 from '@angular/forms';
29
+ import { FormsModule } from '@angular/forms';
30
+ import * as i2$2 from '@acorex/components/form';
31
+ import { AXFormModule } from '@acorex/components/form';
32
+ import * as i1$2 from '@acorex/components/select-box';
33
+ import { AXSelectBoxModule } from '@acorex/components/select-box';
34
+
35
+ var AXPThemeLayoutSetting;
36
+ (function (AXPThemeLayoutSetting) {
37
+ AXPThemeLayoutSetting["Name"] = "Common:Setting:Layout.Name";
38
+ AXPThemeLayoutSetting["Layout"] = "Common:Setting:Layout.Layout";
39
+ AXPThemeLayoutSetting["Font"] = "Common:Setting:Layout.Font.Family";
40
+ AXPThemeLayoutSetting["FontSize"] = "Common:Setting:Layout.Font.Size";
41
+ AXPThemeLayoutSetting["Palette"] = "Common:Setting:Layout.Palette";
42
+ AXPThemeLayoutSetting["Mode"] = "Common:Setting:Layout.Mode";
43
+ AXPThemeLayoutSetting["SideMenuStatus"] = "Common:Setting:Layout.SideMenu.Status";
44
+ AXPThemeLayoutSetting["SideMenuWidth"] = "Common:Setting:Layout.SideMenu.Width";
45
+ AXPThemeLayoutSetting["SideMenuCompactWidth"] = "Common:Setting:Layout.SideMenu.CompactWidth";
46
+ AXPThemeLayoutSetting["MenuOrientation"] = "Common:Setting:Layout.RootMenu.Direction";
47
+ AXPThemeLayoutSetting["MenuVerticalMode"] = "Common:Setting:Layout.RootMenu.VerticalMode";
48
+ AXPThemeLayoutSetting["MenuBadgeVisible"] = "Common:Setting:Layout.RootMenu.Badge";
49
+ })(AXPThemeLayoutSetting || (AXPThemeLayoutSetting = {}));
50
+
51
+ // Theme Enum
52
+ var AXPThemeMode;
53
+ (function (AXPThemeMode) {
54
+ AXPThemeMode["Light"] = "light";
55
+ AXPThemeMode["Dark"] = "dark";
56
+ AXPThemeMode["System"] = "system";
57
+ })(AXPThemeMode || (AXPThemeMode = {}));
58
+ // Side Menu State Enum
59
+ var AXPSideMenuState;
60
+ (function (AXPSideMenuState) {
61
+ AXPSideMenuState["Opened"] = "opened";
62
+ AXPSideMenuState["Closed"] = "closed";
63
+ })(AXPSideMenuState || (AXPSideMenuState = {}));
64
+ // Menu Orientation Enum
65
+ var AXPMenuOrientation;
66
+ (function (AXPMenuOrientation) {
67
+ AXPMenuOrientation["Vertical"] = "vertical";
68
+ AXPMenuOrientation["Horizontal"] = "horizontal";
69
+ })(AXPMenuOrientation || (AXPMenuOrientation = {}));
70
+ // Vertical side menu display mode
71
+ var AXPMenuVerticalMode;
72
+ (function (AXPMenuVerticalMode) {
73
+ AXPMenuVerticalMode["Compact"] = "compact";
74
+ AXPMenuVerticalMode["Full"] = "full";
75
+ })(AXPMenuVerticalMode || (AXPMenuVerticalMode = {}));
76
+ const AXP_SIDE_MENU_FULL_DEFAULT_WIDTH = 300;
77
+ const AXP_SIDE_MENU_COMPACT_WIDTH = 80;
78
+
79
+ function normalizeMenuVerticalMode(value, fallback) {
80
+ if (value === AXPMenuVerticalMode.Compact || value === AXPMenuVerticalMode.Full) {
81
+ return value;
82
+ }
83
+ if (typeof value === 'object' && value !== null && 'id' in value) {
84
+ const id = value.id;
85
+ if (id === AXPMenuVerticalMode.Compact || id === AXPMenuVerticalMode.Full) {
86
+ return id;
87
+ }
88
+ }
89
+ return fallback;
90
+ }
91
+ // ThemeStore - Manages theme settings, system changes, and loading states
92
+ const AXPLayoutThemeService = signalStore({ providedIn: 'root' },
93
+ // Initial State
94
+ withState(() => {
95
+ const isSystemDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
96
+ // Helper function to get the initial screen size for side menu initialization
97
+ const getInitialScreenSize = () => {
98
+ const width = window.innerWidth;
99
+ if (width <= 600)
100
+ return AXPScreenSize.Small;
101
+ if (width <= 1024)
102
+ return AXPScreenSize.Medium;
103
+ return AXPScreenSize.Large;
104
+ };
105
+ const state = {
106
+ currentMode: AXPThemeMode.System,
107
+ currentPalette: 'default',
108
+ systemThemeMode: (isSystemDark ? AXPThemeMode.Dark : AXPThemeMode.Light),
109
+ font: {
110
+ family: 'system-ui',
111
+ size: 'medium',
112
+ },
113
+ overlayLoading: false,
114
+ navigationLoading: false,
115
+ overlayLoadingTaskCount: 0,
116
+ navigationLoadingTaskCount: 0,
117
+ sideMenuState: (getInitialScreenSize() === AXPScreenSize.Large
118
+ ? AXPSideMenuState.Opened
119
+ : AXPSideMenuState.Closed),
120
+ /** Ephemeral overlay drawer state on small/medium viewports; never persisted. */
121
+ overlaySideMenuOpen: false,
122
+ sideMenuWidth: AXP_SIDE_MENU_FULL_DEFAULT_WIDTH,
123
+ sideMenuCompactWidth: AXP_SIDE_MENU_COMPACT_WIDTH,
124
+ menuVerticalMode: AXPMenuVerticalMode.Full,
125
+ menuOrientation: 'vertical',
126
+ _listener: null,
127
+ isPrinting: false,
128
+ };
129
+ return state;
130
+ }),
131
+ // Computed Signals
132
+ withComputed(({ currentMode: currentTheme, systemThemeMode: systemTheme, sideMenuState, overlaySideMenuOpen, overlayLoading, navigationLoading, overlayLoadingTaskCount, menuOrientation, menuVerticalMode, sideMenuWidth, sideMenuCompactWidth, isPrinting, }, deviceService = inject(AXPDeviceService)) => {
133
+ const effectiveMenuVerticalMode = computed(() => {
134
+ if (!deviceService.isLarge()) {
135
+ return AXPMenuVerticalMode.Full;
136
+ }
137
+ return normalizeMenuVerticalMode(menuVerticalMode(), AXPMenuVerticalMode.Full);
138
+ }, ...(ngDevMode ? [{ debugName: "effectiveMenuVerticalMode" }] : /* istanbul ignore next */ []));
139
+ return {
140
+ isDarkMode: computed(() => {
141
+ if (isPrinting()) {
142
+ return false;
143
+ }
144
+ return (currentTheme() === AXPThemeMode.Dark ||
145
+ (currentTheme() === AXPThemeMode.System && systemTheme() === AXPThemeMode.Dark));
146
+ }),
147
+ isLightMode: computed(() => currentTheme() === AXPThemeMode.Light ||
148
+ (currentTheme() === AXPThemeMode.System && systemTheme() === AXPThemeMode.Light)),
149
+ isSystemMode: computed(() => currentTheme() === AXPThemeMode.System),
150
+ isSideMenuOpen: computed(() => deviceService.isLarge()
151
+ ? sideMenuState() === AXPSideMenuState.Opened
152
+ : overlaySideMenuOpen()),
153
+ isOverlayLoading: computed(() => overlayLoading()),
154
+ overlayTaskCount: computed(() => overlayLoadingTaskCount()),
155
+ isNavigationLoading: computed(() => navigationLoading()),
156
+ isMenuHorizontal: computed(() => menuOrientation() === AXPMenuOrientation.Horizontal),
157
+ effectiveMenuVerticalMode,
158
+ sideMenuDrawerWidth: computed(() => effectiveMenuVerticalMode() === AXPMenuVerticalMode.Compact ? sideMenuCompactWidth() : sideMenuWidth()),
159
+ };
160
+ }),
161
+ // Methods for State Management
162
+ withMethods((store, http = inject(HttpClient), settingsService = inject(AXPSettingsService), deviceService = inject(AXPDeviceService)) => {
163
+ const _applySettings = async () => {
164
+ // Initialize theme and side menu setting from storage
165
+ const settingThemeMode = (await settingsService.get(AXPThemeLayoutSetting.Mode)) ?? AXPThemeMode.Light;
166
+ patchState(store, { currentMode: settingThemeMode });
167
+ //
168
+ const settingThemePallete = (await settingsService.get(AXPThemeLayoutSetting.Palette)) ?? 'default';
169
+ patchState(store, { currentPalette: settingThemePallete });
170
+ //
171
+ const settingSideMenu = (await settingsService.get(AXPThemeLayoutSetting.SideMenuStatus)) ?? store.sideMenuState();
172
+ patchState(store, { sideMenuState: settingSideMenu });
173
+ //
174
+ const settingMenuOrientation = (await settingsService.get(AXPThemeLayoutSetting.MenuOrientation)) ??
175
+ store.menuOrientation();
176
+ patchState(store, { menuOrientation: settingMenuOrientation });
177
+ //
178
+ const settingMenuVerticalMode = normalizeMenuVerticalMode(await settingsService.get(AXPThemeLayoutSetting.MenuVerticalMode), store.menuVerticalMode());
179
+ patchState(store, { menuVerticalMode: settingMenuVerticalMode });
180
+ //
181
+ const fontFamily = await settingsService.get(AXPThemeLayoutSetting.Font);
182
+ const fontSize = await settingsService.get(AXPThemeLayoutSetting.FontSize);
183
+ patchState(store, { font: { family: fontFamily, size: fontSize } });
184
+ //
185
+ const sideMenuWidth = (await settingsService.get(AXPThemeLayoutSetting.SideMenuWidth)) ?? store.sideMenuWidth();
186
+ patchState(store, { sideMenuWidth });
187
+ //
188
+ const sideMenuCompactWidth = (await settingsService.get(AXPThemeLayoutSetting.SideMenuCompactWidth)) ??
189
+ store.sideMenuCompactWidth();
190
+ patchState(store, { sideMenuCompactWidth });
191
+ await _updateHtmlClass();
192
+ };
193
+ // Update HTML class based on theme
194
+ const _updateHtmlClass = async () => {
195
+ const html = document.getElementsByTagName('html')[0];
196
+ //
197
+ store.isDarkMode() ? html.classList.add('ax-dark') : html.classList.remove('ax-dark');
198
+ //
199
+ html.style.fontFamily = store.font().family;
200
+ html.style.fontSize = store.font().size;
201
+ //
202
+ await _applyThemePalette(store.currentPalette());
203
+ };
204
+ const _setOverlayLoading = async (value, delay = 0) => {
205
+ if (value) {
206
+ let timeoutId = null;
207
+ if (delay > 0) {
208
+ timeoutId = window.setTimeout(() => {
209
+ patchState(store, { overlayLoadingTaskCount: store.overlayLoadingTaskCount() + 1 });
210
+ patchState(store, { overlayLoading: true });
211
+ }, delay);
212
+ }
213
+ else {
214
+ const prevCount = store.overlayLoadingTaskCount();
215
+ patchState(store, { overlayLoadingTaskCount: prevCount + 1 });
216
+ patchState(store, { overlayLoading: true });
217
+ if (prevCount === 0) {
218
+ AXPDebugService.instance?.trace(OVERLAY_LAYOUT_TRACE_NS, 'theme', 'overlay ON', () => ({
219
+ taskCount: prevCount + 1,
220
+ overlayLoading: true,
221
+ note: 'First overlay loading task started',
222
+ }));
223
+ }
224
+ }
225
+ // Store timeout ID to clear it if the loading ends before delay
226
+ store._loadingTimeoutId = timeoutId;
227
+ }
228
+ else {
229
+ if (store.overlayLoadingTaskCount() > 0) {
230
+ patchState(store, { overlayLoadingTaskCount: store.overlayLoadingTaskCount() - 1 });
231
+ }
232
+ if (store.overlayLoadingTaskCount() === 0) {
233
+ const timeoutId = store._loadingTimeoutId;
234
+ if (timeoutId) {
235
+ clearTimeout(timeoutId);
236
+ store._loadingTimeoutId = null;
237
+ }
238
+ timer(minimumDisplayTime).subscribe(() => {
239
+ if (store.overlayLoadingTaskCount() === 0) {
240
+ patchState(store, { overlayLoading: false });
241
+ }
242
+ });
243
+ }
244
+ }
245
+ };
246
+ const _clearOverlayLoading = () => {
247
+ const prevCount = store.overlayLoadingTaskCount();
248
+ const timeoutId = store._loadingTimeoutId;
249
+ if (timeoutId) {
250
+ clearTimeout(timeoutId);
251
+ store._loadingTimeoutId = null;
252
+ }
253
+ patchState(store, { overlayLoadingTaskCount: 0, overlayLoading: false });
254
+ AXPDebugService.instance?.trace(OVERLAY_LAYOUT_TRACE_NS, 'theme', 'overlay CLEARED (force)', () => ({
255
+ prevTaskCount: prevCount,
256
+ taskCount: 0,
257
+ note: 'Overlay loading force-cleared',
258
+ }));
259
+ };
260
+ const _setNavigationLoading = (value, delay) => {
261
+ if (value) {
262
+ patchState(store, { navigationLoadingTaskCount: store.navigationLoadingTaskCount() + 1 });
263
+ patchState(store, { navigationLoading: true });
264
+ }
265
+ else {
266
+ if (store.navigationLoadingTaskCount() > 0) {
267
+ patchState(store, { navigationLoadingTaskCount: store.navigationLoadingTaskCount() - 1 });
268
+ }
269
+ if (store.navigationLoadingTaskCount() === 0) {
270
+ timer(minimumDisplayTime).subscribe(() => {
271
+ if (store.navigationLoadingTaskCount() === 0) {
272
+ patchState(store, { navigationLoading: false });
273
+ }
274
+ });
275
+ }
276
+ }
277
+ };
278
+ // Helper method to apply a cached theme palette
279
+ const _applyThemePalette = async (name) => {
280
+ // TODO: Get the path from the palette provider token
281
+ const path = `/assets/themes/palettes/css/${name}.css`;
282
+ // Check if the current theme is already applied
283
+ const existingStyle = document.querySelector(`style[data-theme="${name}"]`);
284
+ if (existingStyle) {
285
+ return; // Theme is already applied, no need to reapply
286
+ }
287
+ _setNavigationLoading(true);
288
+ try {
289
+ // Fetch the CSS file via HttpClient
290
+ const cssText = await firstValueFrom(http.get(path, { responseType: 'text' }));
291
+ // Create a new <style> tag and apply the CSS
292
+ const style = document.createElement('style');
293
+ style.setAttribute('data-theme', name);
294
+ style.textContent = cssText;
295
+ document.head.appendChild(style);
296
+ // Remove any other outdated theme styles
297
+ document.querySelectorAll('style[data-theme]').forEach((existing) => {
298
+ if (existing !== style) {
299
+ existing.remove();
300
+ }
301
+ });
302
+ }
303
+ catch (error) {
304
+ console.error(`Error loading theme CSS:`, error);
305
+ }
306
+ finally {
307
+ _setNavigationLoading(false);
308
+ }
309
+ };
310
+ const minimumDisplayTime = 500; // milliseconds
311
+ const setSideMenuOpen = (opened) => {
312
+ if (!deviceService.isLarge()) {
313
+ patchState(store, { overlaySideMenuOpen: opened });
314
+ return;
315
+ }
316
+ const sideMenuState = opened ? AXPSideMenuState.Opened : AXPSideMenuState.Closed;
317
+ patchState(store, { sideMenuState });
318
+ settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuStatus, sideMenuState);
319
+ };
320
+ return {
321
+ // Change theme and update HTML class
322
+ changeThemeMode(theme) {
323
+ settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.Mode, theme);
324
+ patchState(store, { currentMode: theme });
325
+ _updateHtmlClass();
326
+ },
327
+ // Open side menu
328
+ openSideMenu() {
329
+ setSideMenuOpen(true);
330
+ },
331
+ // Close side menu
332
+ closeSideMenu() {
333
+ setSideMenuOpen(false);
334
+ },
335
+ // Set side menu width in full vertical mode
336
+ setSideMenuWidth(width) {
337
+ patchState(store, { sideMenuWidth: width });
338
+ settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuWidth, width);
339
+ },
340
+ // Set side menu width in compact vertical mode
341
+ setSideMenuCompactWidth(width) {
342
+ patchState(store, { sideMenuCompactWidth: width });
343
+ settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuCompactWidth, width);
344
+ },
345
+ // Persist drawer width for the active vertical menu mode
346
+ setSideMenuDrawerWidth(width) {
347
+ if (normalizeMenuVerticalMode(store.menuVerticalMode(), AXPMenuVerticalMode.Full) === AXPMenuVerticalMode.Compact) {
348
+ patchState(store, { sideMenuCompactWidth: width });
349
+ settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuCompactWidth, width);
350
+ }
351
+ else {
352
+ patchState(store, { sideMenuWidth: width });
353
+ settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuWidth, width);
354
+ }
355
+ },
356
+ // Toggle side menu state
357
+ toggleSideMenu() {
358
+ setSideMenuOpen(!store.isSideMenuOpen());
359
+ },
360
+ // Set navigation loading state with a task counter
361
+ setNavigationLoading(value, delay) {
362
+ _setNavigationLoading(value, delay);
363
+ },
364
+ // Set overlay loading state with a task counter
365
+ setOverlayLoading(value, delay) {
366
+ _setOverlayLoading(value, delay);
367
+ },
368
+ /** Resets overlay task count and hides overlay (page-ready / destroy). */
369
+ clearOverlayLoading() {
370
+ _clearOverlayLoading();
371
+ },
372
+ async loadSettings() {
373
+ await _applySettings();
374
+ },
375
+ // This is for internal use to react to print mode changes
376
+ _internal_updateHtmlClass: _updateHtmlClass,
377
+ // Set up event listener for system theme changes
378
+ _setupSystemColorListener() {
379
+ const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
380
+ const listener = (e) => {
381
+ patchState(store, { systemThemeMode: e.matches ? AXPThemeMode.Dark : AXPThemeMode.Light });
382
+ _updateHtmlClass();
383
+ };
384
+ mediaQueryList.addEventListener('change', listener);
385
+ return listener;
386
+ },
387
+ // Remove event listener for system theme changes
388
+ _removeSystemColorListener(listener) {
389
+ const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
390
+ mediaQueryList.removeEventListener('change', listener);
391
+ },
392
+ };
393
+ }),
394
+ // Lifecycle Hooks
395
+ withHooks((store, settingsService = inject(AXPSettingsService), deviceService = inject(AXPDeviceService)) => ({
396
+ onInit() {
397
+ effect(() => {
398
+ if (!deviceService.isLarge()) {
399
+ patchState(store, { overlaySideMenuOpen: false });
400
+ }
401
+ });
402
+ settingsService.onChanged
403
+ .pipe(filter((c) => [AXPPlatformScope.Platform, AXPPlatformScope.Tenant, AXPPlatformScope.User].includes(c.scope)))
404
+ .subscribe(async (changes) => {
405
+ const keys = Object.values(AXPThemeLayoutSetting);
406
+ if (!changes.keys.some((key) => keys.includes(key))) {
407
+ return;
408
+ }
409
+ if (changes.keys.includes(AXPThemeLayoutSetting.MenuVerticalMode)) {
410
+ patchState(store, {
411
+ menuVerticalMode: normalizeMenuVerticalMode(changes.values[AXPThemeLayoutSetting.MenuVerticalMode], store.menuVerticalMode()),
412
+ });
413
+ }
414
+ const shouldReloadSettings = changes.keys.some((key) => keys.includes(key) &&
415
+ key !== AXPThemeLayoutSetting.MenuVerticalMode);
416
+ if (shouldReloadSettings) {
417
+ await store['loadSettings']();
418
+ }
419
+ });
420
+ //
421
+ settingsService.onLoaded.subscribe(async () => {
422
+ await store['loadSettings']();
423
+ });
424
+ // Set up event listener for system theme changes
425
+ const listener = store['_setupSystemColorListener']();
426
+ patchState(store, { _listener: listener });
427
+ window.addEventListener('beforeprint', () => {
428
+ patchState(store, { isPrinting: true });
429
+ store._internal_updateHtmlClass();
430
+ });
431
+ window.addEventListener('afterprint', () => {
432
+ patchState(store, { isPrinting: false });
433
+ store._internal_updateHtmlClass();
434
+ });
435
+ },
436
+ onDestroy() {
437
+ // Clean up event listeners when store is destroyed
438
+ const { _listener: listener } = store;
439
+ if (listener) {
440
+ store['_removeSystemColorListener'](listener);
441
+ }
442
+ },
443
+ })));
444
+
445
+ class AXPThemeSlotComponent {
446
+ constructor() {
447
+ this.store = inject(AXPLayoutThemeService);
448
+ this.variants = AXPThemeMode;
449
+ }
450
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemeSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
451
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPThemeSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
452
+ <ax-button color="primary">
453
+ <ax-icon
454
+ class="fa-regular "
455
+ [ngClass]="{
456
+ 'fa-desktop':store.isSystemMode(),
457
+ 'fa-moon':!store.isSystemMode() && store.isDarkMode(),
458
+ 'fa-brightness':!store.isSystemMode() && !store.isDarkMode(),
459
+ }"
460
+ >
461
+ </ax-icon>
462
+ <ax-dropdown-panel *translate="let t">
463
+ <ax-button-item-list>
464
+ <ax-button-item
465
+ (onClick)="store.changeThemeMode(variants.Light)"
466
+ [text]="('@layout:terms.theme-modes.light' | translate | async)!"
467
+ [selected]="!store.isSystemMode() && !store.isDarkMode()"
468
+ >
469
+ <ax-prefix>
470
+ <ax-icon icon="fa-light fa-brightness"> </ax-icon>
471
+ </ax-prefix>
472
+ </ax-button-item>
473
+ <ax-button-item
474
+ (onClick)="store.changeThemeMode(variants.Dark)"
475
+ [text]="('@layout:terms.theme-modes.dark' | translate | async)!"
476
+ [selected]="!store.isSystemMode() && store.isDarkMode()"
477
+ >
478
+ <ax-prefix>
479
+ <ax-icon icon="fa-light fa-moon"> </ax-icon>
480
+ </ax-prefix>
481
+ </ax-button-item>
482
+ <ax-button-item
483
+ (onClick)="store.changeThemeMode(variants.System)"
484
+ [text]="('@layout:terms.theme-modes.system' | translate | async)!"
485
+ [selected]="store.isSystemMode()"
486
+ >
487
+ <ax-prefix>
488
+ <ax-icon icon="fa-light fa-desktop"> </ax-icon>
489
+ </ax-prefix>
490
+ </ax-button-item>
491
+ </ax-button-item-list>
492
+ </ax-dropdown-panel>
493
+ </ax-button>
494
+ `, 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", "closeParentOnClick", "lockOnLoading"], 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
495
+ }
496
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemeSlotComponent, decorators: [{
497
+ type: Component,
498
+ args: [{
499
+ template: `
500
+ <ax-button color="primary">
501
+ <ax-icon
502
+ class="fa-regular "
503
+ [ngClass]="{
504
+ 'fa-desktop':store.isSystemMode(),
505
+ 'fa-moon':!store.isSystemMode() && store.isDarkMode(),
506
+ 'fa-brightness':!store.isSystemMode() && !store.isDarkMode(),
507
+ }"
508
+ >
509
+ </ax-icon>
510
+ <ax-dropdown-panel *translate="let t">
511
+ <ax-button-item-list>
512
+ <ax-button-item
513
+ (onClick)="store.changeThemeMode(variants.Light)"
514
+ [text]="('@layout:terms.theme-modes.light' | translate | async)!"
515
+ [selected]="!store.isSystemMode() && !store.isDarkMode()"
516
+ >
517
+ <ax-prefix>
518
+ <ax-icon icon="fa-light fa-brightness"> </ax-icon>
519
+ </ax-prefix>
520
+ </ax-button-item>
521
+ <ax-button-item
522
+ (onClick)="store.changeThemeMode(variants.Dark)"
523
+ [text]="('@layout:terms.theme-modes.dark' | translate | async)!"
524
+ [selected]="!store.isSystemMode() && store.isDarkMode()"
525
+ >
526
+ <ax-prefix>
527
+ <ax-icon icon="fa-light fa-moon"> </ax-icon>
528
+ </ax-prefix>
529
+ </ax-button-item>
530
+ <ax-button-item
531
+ (onClick)="store.changeThemeMode(variants.System)"
532
+ [text]="('@layout:terms.theme-modes.system' | translate | async)!"
533
+ [selected]="store.isSystemMode()"
534
+ >
535
+ <ax-prefix>
536
+ <ax-icon icon="fa-light fa-desktop"> </ax-icon>
537
+ </ax-prefix>
538
+ </ax-button-item>
539
+ </ax-button-item-list>
540
+ </ax-dropdown-panel>
541
+ </ax-button>
542
+ `,
543
+ imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXDropdownModule, AXTranslationModule],
544
+ changeDetection: ChangeDetectionStrategy.OnPush,
545
+ }]
546
+ }] });
547
+
548
+ const AXP_THEME_PALETTE_PROVIDER = new InjectionToken('AXP_THEME_PALETTE_PROVIDER', {
549
+ providedIn: 'root',
550
+ factory: async () => {
551
+ return new AXPThemePaletteProviderDefault();
552
+ },
553
+ });
554
+ class AXPThemePaletteProviderDefault {
555
+ getList() {
556
+ return Promise.resolve([
557
+ {
558
+ name: 'default',
559
+ title: 'Default',
560
+ path: '/assets/themes/palletes/default.css',
561
+ colors: {
562
+ primary: '#113b53',
563
+ secondary: '#1a6ab1',
564
+ neutral: '#606c76',
565
+ success: '#2d9c67',
566
+ warning: '#e9a01b',
567
+ danger: '#c02f1d',
568
+ accents: ['#d6a7a6', '#a0897e', '#8bf4d9'],
569
+ dark: '#2a2d30',
570
+ light: '#ffffff',
571
+ },
572
+ },
573
+ ]);
574
+ }
575
+ }
576
+
577
+ //#region ---- Contracts barrel ----
578
+ //#endregion
579
+
580
+ //#region ---- Injection Tokens ----
581
+ /**
582
+ * Injection token for icon providers.
583
+ * Use multi: true to register multiple providers.
584
+ */
585
+ const AXP_ICON_PROVIDER = new InjectionToken('AXP_ICON_PROVIDER');
586
+ /**
587
+ * Injection token for icon style providers.
588
+ * Use multi: true to register multiple providers.
589
+ */
590
+ const AXP_ICON_STYLE_PROVIDER = new InjectionToken('AXP_ICON_STYLE_PROVIDER');
591
+ //#endregion
592
+
593
+ //#endregion
594
+ //#region ---- Abstract Providers ----
595
+ class AXPIconProvider {
596
+ }
597
+ class AXPIconStyleProvider {
598
+ }
599
+ //#endregion
600
+ //#region ---- Service ----
601
+ class AXPIconChooserService {
602
+ constructor() {
603
+ //#region ---- Properties ----
604
+ this.iconProviders = inject(AXP_ICON_PROVIDER, { optional: true }) ?? [];
605
+ this.styleProviders = inject(AXP_ICON_STYLE_PROVIDER, { optional: true }) ?? [];
606
+ this.iconsCache = null;
607
+ this.stylesCache = null;
608
+ }
609
+ //#endregion
610
+ //#region ---- Public Methods ----
611
+ /**
612
+ * Get all available icon styles from registered providers.
613
+ * Results are cached after first call.
614
+ */
615
+ async getStyles() {
616
+ if (this.stylesCache) {
617
+ return this.stylesCache;
618
+ }
619
+ const allStyles = [];
620
+ for (const provider of this.styleProviders) {
621
+ const result = await provider.provide();
622
+ allStyles.push(...result);
623
+ }
624
+ // Remove duplicates based on style name
625
+ const uniqueStyles = allStyles.filter((style, index, self) => index === self.findIndex((s) => s.name === style.name));
626
+ this.stylesCache = uniqueStyles;
627
+ return uniqueStyles;
628
+ }
629
+ /**
630
+ * Get all available icons from registered providers.
631
+ * Icons from multiple providers are merged, with duplicates removed.
632
+ * Results are cached after first call.
633
+ */
634
+ async getIcons() {
635
+ if (this.iconsCache) {
636
+ return this.iconsCache;
637
+ }
638
+ const allIcons = [];
639
+ for (const provider of this.iconProviders) {
640
+ const result = await provider.provide();
641
+ allIcons.push(...result);
642
+ }
643
+ // Remove duplicates based on icon name, keeping first occurrence
644
+ const uniqueIcons = allIcons.filter((icon, index, self) => index === self.findIndex((i) => i.name === icon.name));
645
+ this.iconsCache = uniqueIcons;
646
+ return uniqueIcons;
647
+ }
648
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIconChooserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
649
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIconChooserService, providedIn: 'root' }); }
650
+ }
651
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIconChooserService, decorators: [{
652
+ type: Injectable,
653
+ args: [{ providedIn: 'root' }]
654
+ }] });
655
+
656
+ class AXPIconChooserPopupComponent extends AXBasePageComponent {
657
+ constructor() {
658
+ super(...arguments);
659
+ this.icons = [];
660
+ this.filteredIcons = [];
661
+ this.searchQuery = '';
662
+ this.viewModes = [
663
+ { value: 'square', text: '@general:widgets.icon-chooser.view-mode.square', icon: 'fa-solid fa-border-all' },
664
+ {
665
+ value: 'rectangle',
666
+ text: '@general:widgets.icon-chooser.view-mode.rectangle',
667
+ icon: 'fa-solid fa-list',
668
+ },
669
+ ];
670
+ this.selectedViewMode = 'square';
671
+ this.iconTypes = [];
672
+ this.selectedIconType = 'fa-solid';
673
+ this.popupService = inject(AXPIconChooserService);
674
+ }
675
+ async ngOnInit() {
676
+ this.iconTypes = await this.popupService.getStyles();
677
+ this.icons = await this.popupService.getIcons();
678
+ this.applyFilters();
679
+ this.cdr.detectChanges();
680
+ }
681
+ handleSearch(event) {
682
+ this.searchQuery = event.value?.toLowerCase();
683
+ this.applyFilters();
684
+ }
685
+ handleViewModeChange(mode) {
686
+ this.selectedViewMode = mode.value;
687
+ }
688
+ handleIconTypeChange(type) {
689
+ this.selectedIconType = type.name;
690
+ this.applyFilters();
691
+ }
692
+ applyFilters() {
693
+ let result = this.icons;
694
+ if (this.searchQuery) {
695
+ result = result.filter((icon) => icon.label.toLowerCase().includes(this.searchQuery) ||
696
+ icon.tags?.some((tag) => tag.toLowerCase().includes(this.searchQuery)));
697
+ }
698
+ result = result.filter((icon) => {
699
+ if (!icon.supportedStyle || icon.supportedStyle.length === 0) {
700
+ return true;
701
+ }
702
+ return icon.supportedStyle.includes(this.selectedIconType);
703
+ });
704
+ this.filteredIcons = result;
705
+ }
706
+ selectIcon(icon) {
707
+ this.close({
708
+ label: icon.label,
709
+ styleClass: this.selectedIconType,
710
+ iconClass: `fa-${icon.name}`,
711
+ });
712
+ }
713
+ getIconClass(icon) {
714
+ return `${this.selectedIconType} fa-${icon.name}`;
715
+ }
716
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIconChooserPopupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
717
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPIconChooserPopupComponent, isStandalone: true, selector: "ng-component", inputs: { value: "value" }, usesInheritance: true, ngImport: i0, template: `
718
+ <div class="ax-flex ax-flex-col ax-h-full ax-bg-lightest">
719
+ <!-- Fixed Header Section -->
720
+ <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">
721
+ <!-- Search Bar -->
722
+ <div class="ax-flex ax-justify-center">
723
+ <ax-search-box
724
+ class="ax-w-full"
725
+ (onValueChanged)="handleSearch($event)"
726
+ [placeholder]="'@general:widgets.icon-chooser.search-placeholder' | translate | async"
727
+ ></ax-search-box>
728
+ </div>
729
+
730
+ <!-- Controls Row -->
731
+ <div class="ax-flex ax-justify-between ax-items-center ax-flex-wrap ax-gap-2">
732
+ <!-- Icon Style Filter -->
733
+ <ax-button-group selection="single" look="outline">
734
+ @for (item of iconTypes; track item.name) {
735
+ <ax-button-group-item
736
+ [text]="item.label"
737
+ [selected]="item.name === selectedIconType"
738
+ (onClick)="handleIconTypeChange(item)"
739
+ >
740
+ </ax-button-group-item>
741
+ }
742
+ </ax-button-group>
743
+
744
+ <!-- View Mode Toggle -->
745
+ <ax-button-group selection="single" look="outline">
746
+ @for (item of viewModes; track item.value) {
747
+ <ax-button-group-item
748
+ [title]="item.text | translate | async"
749
+ [selected]="item.value === selectedViewMode"
750
+ (onClick)="handleViewModeChange(item)"
751
+ >
752
+ <ax-icon [class]="item.icon"></ax-icon>
753
+ </ax-button-group-item>
754
+ }
755
+ </ax-button-group>
756
+ </div>
757
+ </div>
758
+
759
+ <!-- Scrollable Content Area -->
760
+ <div class="ax-flex-1 ax-overflow-y-auto ax-p-4 ax-pt-2">
761
+ <div
762
+ class="ax-grid ax-gap-1"
763
+ [ngClass]="
764
+ selectedViewMode === 'square'
765
+ ? 'ax-grid-cols-[repeat(auto-fill,minmax(6rem,1fr))]'
766
+ : 'ax-grid-cols-1 md:ax-grid-cols-2'
767
+ "
768
+ >
769
+ @for (icon of filteredIcons; track icon) {
770
+ <div
771
+ class="ax-p-4 ax-border ax-border-transparent ax-rounded-lg ax-flex ax-items-center ax-justify-center ax-gap-2 ax-cursor-pointer ax-transition-all ax-duration-200 ax-ease-in-out hover:ax-border-primary hover:ax-shadow-md"
772
+ [ngClass]="{
773
+ 'ax-flex-col': selectedViewMode === 'square',
774
+ 'ax-flex-row ax-justify-start': selectedViewMode === 'rectangle',
775
+ }"
776
+ (click)="selectIcon(icon)"
777
+ >
778
+ <i [class]="getIconClass(icon) + ' ax-text-3xl'"></i>
779
+ <span
780
+ class="ax-text-xs ax-w-full ax-overflow-hidden ax-text-ellipsis ax-whitespace-nowrap"
781
+ [ngClass]="{
782
+ 'ax-text-center': selectedViewMode === 'square',
783
+ 'ax-text-left': selectedViewMode === 'rectangle',
784
+ }"
785
+ >{{ icon.label }}</span
786
+ >
787
+ </div>
788
+ }
789
+ </div>
790
+ </div>
791
+ </div>
792
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i1$1.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i2$1.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "color", "look", "fitParent", "selection"], outputs: ["onBlur", "onFocus", "lookChange", "colorChange", "disabledChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i2$1.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 }); }
793
+ }
794
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIconChooserPopupComponent, decorators: [{
795
+ type: Component,
796
+ args: [{
797
+ template: `
798
+ <div class="ax-flex ax-flex-col ax-h-full ax-bg-lightest">
799
+ <!-- Fixed Header Section -->
800
+ <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">
801
+ <!-- Search Bar -->
802
+ <div class="ax-flex ax-justify-center">
803
+ <ax-search-box
804
+ class="ax-w-full"
805
+ (onValueChanged)="handleSearch($event)"
806
+ [placeholder]="'@general:widgets.icon-chooser.search-placeholder' | translate | async"
807
+ ></ax-search-box>
808
+ </div>
809
+
810
+ <!-- Controls Row -->
811
+ <div class="ax-flex ax-justify-between ax-items-center ax-flex-wrap ax-gap-2">
812
+ <!-- Icon Style Filter -->
813
+ <ax-button-group selection="single" look="outline">
814
+ @for (item of iconTypes; track item.name) {
815
+ <ax-button-group-item
816
+ [text]="item.label"
817
+ [selected]="item.name === selectedIconType"
818
+ (onClick)="handleIconTypeChange(item)"
819
+ >
820
+ </ax-button-group-item>
821
+ }
822
+ </ax-button-group>
823
+
824
+ <!-- View Mode Toggle -->
825
+ <ax-button-group selection="single" look="outline">
826
+ @for (item of viewModes; track item.value) {
827
+ <ax-button-group-item
828
+ [title]="item.text | translate | async"
829
+ [selected]="item.value === selectedViewMode"
830
+ (onClick)="handleViewModeChange(item)"
831
+ >
832
+ <ax-icon [class]="item.icon"></ax-icon>
833
+ </ax-button-group-item>
834
+ }
835
+ </ax-button-group>
836
+ </div>
837
+ </div>
838
+
839
+ <!-- Scrollable Content Area -->
840
+ <div class="ax-flex-1 ax-overflow-y-auto ax-p-4 ax-pt-2">
841
+ <div
842
+ class="ax-grid ax-gap-1"
843
+ [ngClass]="
844
+ selectedViewMode === 'square'
845
+ ? 'ax-grid-cols-[repeat(auto-fill,minmax(6rem,1fr))]'
846
+ : 'ax-grid-cols-1 md:ax-grid-cols-2'
847
+ "
848
+ >
849
+ @for (icon of filteredIcons; track icon) {
850
+ <div
851
+ class="ax-p-4 ax-border ax-border-transparent ax-rounded-lg ax-flex ax-items-center ax-justify-center ax-gap-2 ax-cursor-pointer ax-transition-all ax-duration-200 ax-ease-in-out hover:ax-border-primary hover:ax-shadow-md"
852
+ [ngClass]="{
853
+ 'ax-flex-col': selectedViewMode === 'square',
854
+ 'ax-flex-row ax-justify-start': selectedViewMode === 'rectangle',
855
+ }"
856
+ (click)="selectIcon(icon)"
857
+ >
858
+ <i [class]="getIconClass(icon) + ' ax-text-3xl'"></i>
859
+ <span
860
+ class="ax-text-xs ax-w-full ax-overflow-hidden ax-text-ellipsis ax-whitespace-nowrap"
861
+ [ngClass]="{
862
+ 'ax-text-center': selectedViewMode === 'square',
863
+ 'ax-text-left': selectedViewMode === 'rectangle',
864
+ }"
865
+ >{{ icon.label }}</span
866
+ >
867
+ </div>
868
+ }
869
+ </div>
870
+ </div>
871
+ </div>
872
+ `,
873
+ imports: [AXSearchBoxModule, AXButtonGroupModule, CommonModule, AXDecoratorModule, AXTranslationModule],
874
+ changeDetection: ChangeDetectionStrategy.OnPush,
875
+ }]
876
+ }], propDecorators: { value: [{
877
+ type: Input
878
+ }] } });
879
+
880
+ class AXPIconChooserWidgetEditComponent extends AXPValueWidgetComponent {
881
+ constructor() {
882
+ super(...arguments);
883
+ this.popupService = inject(AXPopupService);
884
+ this.computedValue = computed(() => {
885
+ const value = this.getValue();
886
+ if (typeof value === 'string') {
887
+ const parts = value.split(' ');
888
+ if (parts.length === 1) {
889
+ return { styleClass: 'fa-solid', iconClass: parts[0] };
890
+ }
891
+ else if (parts.length === 2) {
892
+ return { styleClass: parts[0], iconClass: parts[1] };
893
+ }
894
+ else {
895
+ throw new Error(`Invalid icon format: "${value}". Expected format: "icon-class" or "style-class icon-class"`);
896
+ }
897
+ }
898
+ return value;
899
+ }, ...(ngDevMode ? [{ debugName: "computedValue" }] : /* istanbul ignore next */ []));
900
+ }
901
+ async openPopup() {
902
+ const result = await this.popupService.open(AXPIconChooserPopupComponent, {
903
+ title: 'Choose Icon',
904
+ size: 'md',
905
+ data: {
906
+ value: this.getValue(),
907
+ },
908
+ });
909
+ if (result?.data) {
910
+ this.setValue(result.data.styleClass + ' ' + result.data.iconClass);
911
+ }
912
+ }
913
+ addIcon() {
914
+ if (!this.getValue()) {
915
+ this.openPopup();
916
+ }
917
+ }
918
+ deleteIcon() {
919
+ this.setValue(undefined);
920
+ }
921
+ editIcon() {
922
+ this.openPopup();
923
+ }
924
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIconChooserWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
925
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPIconChooserWidgetEditComponent, isStandalone: true, selector: "ax-icon-chooser-edit", usesInheritance: true, ngImport: i0, template: `
926
+ <div
927
+ class="ax-grid ax-grid-cols-[6rem_auto] ax-items-center ax-rounded-md ax-text-3xl ax-w-fit"
928
+ [class.ax-border]="getValue()"
929
+ >
930
+ <!-- Left: Add or Selected Icon -->
931
+ <div
932
+ class="ax-grid ax-place-items-center ax-w-24 ax-h-24 "
933
+ [class]="getValue() ? 'ax-border-e ax-cursor-default' : 'icon-container ax-cursor-pointer'"
934
+ (click)="addIcon()"
935
+ >
936
+ <i [class]="getValue() ? computedValue().styleClass + ' ' + computedValue().iconClass : 'fa-solid fa-plus'"></i>
937
+ </div>
938
+
939
+ <!-- Right: Edit & Delete (only if value exists) -->
940
+ @if (getValue()) {
941
+ <div class="ax-flex ax-flex-col ax-w-16 ax-text-2xl">
942
+ <div class="ax-h-12 ax-grid ax-place-items-center ax-cursor-pointer hover:ax-bg-surface" (click)="editIcon()">
943
+ <i class="fa-light fa-edit ax-text-primary-400"></i>
944
+ </div>
945
+ <div
946
+ class="ax-h-12 ax-grid ax-place-items-center ax-cursor-pointer ax-border-t hover:ax-bg-surface"
947
+ (click)="deleteIcon()"
948
+ >
949
+ <i class="fa-light fa-trash-can ax-text-danger-400"></i>
950
+ </div>
951
+ </div>
952
+ }
953
+ </div>
954
+ `, isInline: true, styles: [".icon-container{background-color:rgba(var(--ax-sys-color-primary-300),10%);background-image:linear-gradient(135deg,rgba(var(--ax-sys-color-primary-300),50%) 10%,transparent 0,transparent 50%,rgba(var(--ax-sys-color-primary-300),50%) 0,rgba(var(--ax-sys-color-primary-300),50%) 60%,transparent 0,transparent);background-size:7.5px 7.5px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
955
+ }
956
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIconChooserWidgetEditComponent, decorators: [{
957
+ type: Component,
958
+ args: [{ selector: 'ax-icon-chooser-edit', template: `
959
+ <div
960
+ class="ax-grid ax-grid-cols-[6rem_auto] ax-items-center ax-rounded-md ax-text-3xl ax-w-fit"
961
+ [class.ax-border]="getValue()"
962
+ >
963
+ <!-- Left: Add or Selected Icon -->
964
+ <div
965
+ class="ax-grid ax-place-items-center ax-w-24 ax-h-24 "
966
+ [class]="getValue() ? 'ax-border-e ax-cursor-default' : 'icon-container ax-cursor-pointer'"
967
+ (click)="addIcon()"
968
+ >
969
+ <i [class]="getValue() ? computedValue().styleClass + ' ' + computedValue().iconClass : 'fa-solid fa-plus'"></i>
970
+ </div>
971
+
972
+ <!-- Right: Edit & Delete (only if value exists) -->
973
+ @if (getValue()) {
974
+ <div class="ax-flex ax-flex-col ax-w-16 ax-text-2xl">
975
+ <div class="ax-h-12 ax-grid ax-place-items-center ax-cursor-pointer hover:ax-bg-surface" (click)="editIcon()">
976
+ <i class="fa-light fa-edit ax-text-primary-400"></i>
977
+ </div>
978
+ <div
979
+ class="ax-h-12 ax-grid ax-place-items-center ax-cursor-pointer ax-border-t hover:ax-bg-surface"
980
+ (click)="deleteIcon()"
981
+ >
982
+ <i class="fa-light fa-trash-can ax-text-danger-400"></i>
983
+ </div>
984
+ </div>
985
+ }
986
+ </div>
987
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".icon-container{background-color:rgba(var(--ax-sys-color-primary-300),10%);background-image:linear-gradient(135deg,rgba(var(--ax-sys-color-primary-300),50%) 10%,transparent 0,transparent 50%,rgba(var(--ax-sys-color-primary-300),50%) 0,rgba(var(--ax-sys-color-primary-300),50%) 60%,transparent 0,transparent);background-size:7.5px 7.5px}\n"] }]
988
+ }] });
989
+
990
+ var iconChooserEdit_component = /*#__PURE__*/Object.freeze({
991
+ __proto__: null,
992
+ AXPIconChooserWidgetEditComponent: AXPIconChooserWidgetEditComponent
993
+ });
994
+
995
+ const AXPIconChooserWidget = {
996
+ name: 'icon-chooser',
997
+ title: 'Icon Chooser',
998
+ icon: 'fa-light fa-icons',
999
+ type: 'editor',
1000
+ categories: AXP_WIDGETS_LAYOUT_CATEGORY,
1001
+ properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
1002
+ components: {
1003
+ edit: {
1004
+ component: () => Promise.resolve().then(function () { return iconChooserEdit_component; }).then((c) => c.AXPIconChooserWidgetEditComponent),
1005
+ },
1006
+ column: {
1007
+ component: () => import('./acorex-platform-framework-client-themes-shared-icon-chooser-column.component-CXSGiTCK.mjs').then((c) => c.AXPIconChooserWidgetColumnComponent),
1008
+ },
1009
+ view: {
1010
+ component: () => import('./acorex-platform-framework-client-themes-shared-icon-chooser-view.component-BY5clQ1J.mjs').then((c) => c.AXPIconChooserWidgetViewComponent),
1011
+ },
1012
+ },
1013
+ };
1014
+
1015
+ //#region ---- Default Icon Styles ----
1016
+ const DEFAULT_ICON_STYLES = [
1017
+ { name: 'fa-regular', label: 'Regular' },
1018
+ { name: 'fa-solid', label: 'Solid' },
1019
+ ];
1020
+ //#endregion
1021
+ //#region ---- Default Icons ----
1022
+ const DEFAULT_ICONS = [
1023
+ // Navigation & Actions
1024
+ { name: 'house', label: 'House', tags: ['home', 'building', 'house'] },
1025
+ { name: 'magnifying-glass', label: 'Search', tags: ['find', 'zoom'] },
1026
+ { name: 'user', label: 'User', tags: ['person', 'account'] },
1027
+ { name: 'users', label: 'Users', tags: ['people', 'group', 'team'] },
1028
+ { name: 'user-group', label: 'User Group', tags: ['team', 'group', 'people'] },
1029
+ { name: 'check', label: 'Check', tags: ['confirm', 'done', 'tick'] },
1030
+ { name: 'check-circle', label: 'Check Circle', tags: ['confirm', 'success', 'done'] },
1031
+ { name: 'check-double', label: 'Check Double', tags: ['verified', 'confirmed'] },
1032
+ { name: 'xmark', label: 'Close', tags: ['cancel', 'exit', 'remove'] },
1033
+ { name: 'circle-xmark', label: 'Circle Close', tags: ['cancel', 'error', 'remove'] },
1034
+ { name: 'plus', label: 'Add', tags: ['create', 'new', 'plus'] },
1035
+ { name: 'circle-plus', label: 'Circle Plus', tags: ['add', 'create', 'new'] },
1036
+ { name: 'minus', label: 'Remove', tags: ['delete', 'subtract', 'minus'] },
1037
+ { name: 'circle-minus', label: 'Circle Minus', tags: ['remove', 'subtract'] },
1038
+ { name: 'edit', label: 'Edit', tags: ['modify', 'change', 'pencil'] },
1039
+ { name: 'pen-to-square', label: 'Edit Square', tags: ['edit', 'modify', 'write'] },
1040
+ { name: 'trash', label: 'Delete', tags: ['remove', 'delete', 'bin'] },
1041
+ { name: 'trash-can', label: 'Trash Can', tags: ['delete', 'remove', 'garbage'] },
1042
+ { name: 'copy', label: 'Copy', tags: ['duplicate', 'clone'] },
1043
+ { name: 'clone', label: 'Clone', tags: ['duplicate', 'copy'] },
1044
+ { name: 'download', label: 'Download', tags: ['save', 'export'] },
1045
+ { name: 'upload', label: 'Upload', tags: ['import', 'send'] },
1046
+ { name: 'print', label: 'Print', tags: ['printer', 'document'] },
1047
+ { name: 'share', label: 'Share', tags: ['send', 'distribute'] },
1048
+ { name: 'share-nodes', label: 'Share Network', tags: ['share', 'distribute', 'network'] },
1049
+ { name: 'link', label: 'Link', tags: ['url', 'connection'] },
1050
+ { name: 'link-slash', label: 'Unlink', tags: ['disconnect', 'remove'] },
1051
+ { name: 'external-link', label: 'External Link', tags: ['open', 'external'] },
1052
+ { name: 'arrows-rotate', label: 'Refresh', tags: ['reload', 'sync', 'update'] },
1053
+ { name: 'rotate-right', label: 'Rotate Right', tags: ['refresh', 'reload'] },
1054
+ { name: 'arrows-left-right', label: 'Arrows Horizontal', tags: ['swap', 'exchange'] },
1055
+ { name: 'arrow-up', label: 'Arrow Up', tags: ['up', 'direction'] },
1056
+ { name: 'arrow-down', label: 'Arrow Down', tags: ['down', 'direction'] },
1057
+ { name: 'arrow-left', label: 'Arrow Left', tags: ['left', 'back', 'previous'] },
1058
+ { name: 'arrow-right', label: 'Arrow Right', tags: ['right', 'forward', 'next'] },
1059
+ { name: 'chevron-up', label: 'Chevron Up', tags: ['up', 'collapse'] },
1060
+ { name: 'chevron-down', label: 'Chevron Down', tags: ['down', 'expand'] },
1061
+ { name: 'chevron-left', label: 'Chevron Left', tags: ['left', 'previous'] },
1062
+ { name: 'chevron-right', label: 'Chevron Right', tags: ['right', 'next'] },
1063
+ { name: 'angle-up', label: 'Angle Up', tags: ['up', 'caret'] },
1064
+ { name: 'angle-down', label: 'Angle Down', tags: ['down', 'caret'] },
1065
+ { name: 'angle-left', label: 'Angle Left', tags: ['left', 'caret'] },
1066
+ { name: 'angle-right', label: 'Angle Right', tags: ['right', 'caret'] },
1067
+ { name: 'bars', label: 'Menu', tags: ['hamburger', 'menu', 'navigation'] },
1068
+ { name: 'ellipsis', label: 'Ellipsis', tags: ['more', 'options', 'menu'] },
1069
+ { name: 'ellipsis-vertical', label: 'Ellipsis Vertical', tags: ['more', 'options', 'menu'] },
1070
+ { name: 'grip', label: 'Grip', tags: ['drag', 'handle', 'move'] },
1071
+ { name: 'grip-vertical', label: 'Grip Vertical', tags: ['drag', 'handle', 'move'] },
1072
+ { name: 'filter', label: 'Filter', tags: ['sort', 'search', 'refine'] },
1073
+ { name: 'sliders', label: 'Settings', tags: ['adjust', 'options', 'preferences'] },
1074
+ // Media & Files
1075
+ { name: 'star', label: 'Star', tags: ['favorite', 'rate'] },
1076
+ { name: 'star-half', label: 'Star Half', tags: ['rating', 'half'] },
1077
+ { name: 'heart', label: 'Heart', tags: ['love', 'like', 'favorite'] },
1078
+ { name: 'heart-pulse', label: 'Heart Pulse', tags: ['health', 'medical', 'heartbeat'] },
1079
+ { name: 'cloud', label: 'Cloud', tags: ['weather', 'sky', 'storage'] },
1080
+ { name: 'cloud-arrow-up', label: 'Cloud Upload', tags: ['upload', 'backup', 'save'] },
1081
+ { name: 'cloud-arrow-down', label: 'Cloud Download', tags: ['download', 'restore'] },
1082
+ { name: 'envelope', label: 'Envelope', tags: ['mail', 'message', 'email'] },
1083
+ { name: 'envelope-open', label: 'Envelope Open', tags: ['mail', 'read', 'message'] },
1084
+ { name: 'paper-plane', label: 'Send', tags: ['send', 'message', 'email'] },
1085
+ { name: 'folder', label: 'Folder', tags: ['directory', 'files'] },
1086
+ { name: 'folder-open', label: 'Folder Open', tags: ['directory', 'files', 'open'] },
1087
+ { name: 'folder-plus', label: 'New Folder', tags: ['create', 'directory', 'add'] },
1088
+ { name: 'folder-tree', label: 'Folder Tree', tags: ['structure', 'hierarchy', 'files'] },
1089
+ { name: 'gear', label: 'Gear', tags: ['settings', 'options', 'config'] },
1090
+ { name: 'gears', label: 'Gears', tags: ['settings', 'configuration', 'system'] },
1091
+ { name: 'camera', label: 'Camera', tags: ['photo', 'image', 'picture'] },
1092
+ { name: 'camera-retro', label: 'Camera Retro', tags: ['photo', 'vintage'] },
1093
+ { name: 'video', label: 'Video', tags: ['film', 'movie', 'camera'] },
1094
+ { name: 'video-slash', label: 'Video Off', tags: ['disabled', 'mute', 'off'] },
1095
+ { name: 'music', label: 'Music', tags: ['sound', 'audio', 'song'] },
1096
+ { name: 'file', label: 'File', tags: ['document', 'file'] },
1097
+ { name: 'file-lines', label: 'File Text', tags: ['document', 'text'] },
1098
+ { name: 'file-pdf', label: 'PDF', tags: ['document', 'pdf'] },
1099
+ { name: 'file-word', label: 'Word Document', tags: ['document', 'word', 'doc'] },
1100
+ { name: 'file-excel', label: 'Excel', tags: ['spreadsheet', 'excel', 'xls'] },
1101
+ { name: 'file-powerpoint', label: 'PowerPoint', tags: ['presentation', 'powerpoint', 'ppt'] },
1102
+ { name: 'file-image', label: 'Image File', tags: ['picture', 'photo', 'image'] },
1103
+ { name: 'file-video', label: 'Video File', tags: ['movie', 'clip', 'video'] },
1104
+ { name: 'file-audio', label: 'Audio File', tags: ['sound', 'music', 'audio'] },
1105
+ { name: 'file-code', label: 'Code File', tags: ['code', 'programming', 'source'] },
1106
+ { name: 'file-zipper', label: 'Archive', tags: ['zip', 'compressed', 'archive'] },
1107
+ { name: 'file-csv', label: 'CSV File', tags: ['spreadsheet', 'data', 'csv'] },
1108
+ { name: 'image', label: 'Image', tags: ['picture', 'photo'] },
1109
+ { name: 'images', label: 'Images', tags: ['gallery', 'photos', 'pictures'] },
1110
+ { name: 'photo-film', label: 'Photo Film', tags: ['gallery', 'images', 'media'] },
1111
+ { name: 'microphone', label: 'Microphone', tags: ['audio', 'voice', 'record'] },
1112
+ { name: 'microphone-slash', label: 'Microphone Off', tags: ['mute', 'audio', 'off'] },
1113
+ { name: 'volume-high', label: 'Volume High', tags: ['sound', 'audio', 'loud'] },
1114
+ { name: 'volume-low', label: 'Volume Low', tags: ['sound', 'audio', 'quiet'] },
1115
+ { name: 'volume-xmark', label: 'Mute', tags: ['mute', 'silent', 'off'] },
1116
+ // Communication & Social
1117
+ { name: 'phone', label: 'Phone', tags: ['call', 'telephone', 'contact'] },
1118
+ { name: 'phone-flip', label: 'Phone Flip', tags: ['call', 'mobile', 'flip'] },
1119
+ { name: 'mobile', label: 'Mobile', tags: ['cell', 'smartphone', 'phone'] },
1120
+ { name: 'mobile-screen', label: 'Mobile Screen', tags: ['smartphone', 'device'] },
1121
+ { name: 'fax', label: 'Fax', tags: ['document', 'send', 'print'] },
1122
+ { name: 'comment', label: 'Comment', tags: ['message', 'chat', 'text'] },
1123
+ { name: 'comments', label: 'Comments', tags: ['messages', 'discussion', 'chat'] },
1124
+ { name: 'comment-dots', label: 'Comment Typing', tags: ['message', 'typing', 'chat'] },
1125
+ { name: 'message', label: 'Message', tags: ['chat', 'text', 'communication'] },
1126
+ { name: 'inbox', label: 'Inbox', tags: ['mail', 'messages', 'receive'] },
1127
+ { name: 'at', label: 'At Symbol', tags: ['email', 'mention', 'tag'] },
1128
+ { name: 'hashtag', label: 'Hashtag', tags: ['tag', 'social', 'topic'] },
1129
+ { name: 'thumbs-up', label: 'Like', tags: ['approve', 'good', 'positive'] },
1130
+ { name: 'thumbs-down', label: 'Dislike', tags: ['disapprove', 'bad', 'negative'] },
1131
+ { name: 'bell', label: 'Notification', tags: ['alert', 'reminder', 'notification'] },
1132
+ { name: 'bell-slash', label: 'Notifications Off', tags: ['mute', 'silent', 'off'] },
1133
+ { name: 'flag', label: 'Flag', tags: ['mark', 'report', 'bookmark'] },
1134
+ { name: 'flag-checkered', label: 'Flag Checkered', tags: ['finish', 'end', 'goal'] },
1135
+ { name: 'bookmark', label: 'Bookmark', tags: ['save', 'favorite', 'mark'] },
1136
+ { name: 'calendar', label: 'Calendar', tags: ['date', 'schedule', 'event'] },
1137
+ { name: 'calendar-days', label: 'Calendar Days', tags: ['date', 'month', 'schedule'] },
1138
+ { name: 'calendar-check', label: 'Calendar Check', tags: ['event', 'confirmed', 'scheduled'] },
1139
+ { name: 'calendar-plus', label: 'Calendar Add', tags: ['event', 'create', 'schedule'] },
1140
+ { name: 'clock', label: 'Clock', tags: ['time', 'schedule', 'hour'] },
1141
+ { name: 'hourglass', label: 'Hourglass', tags: ['time', 'waiting', 'timer'] },
1142
+ { name: 'stopwatch', label: 'Stopwatch', tags: ['timer', 'time', 'track'] },
1143
+ { name: 'rss', label: 'RSS', tags: ['feed', 'news', 'subscribe'] },
1144
+ // Business & Finance
1145
+ { name: 'chart-line', label: 'Chart Line', tags: ['graph', 'analytics', 'trending'] },
1146
+ { name: 'chart-bar', label: 'Bar Chart', tags: ['graph', 'statistics', 'data'] },
1147
+ { name: 'chart-pie', label: 'Pie Chart', tags: ['graph', 'percentage', 'data'] },
1148
+ { name: 'chart-area', label: 'Area Chart', tags: ['graph', 'analytics', 'data'] },
1149
+ { name: 'chart-column', label: 'Column Chart', tags: ['graph', 'statistics'] },
1150
+ { name: 'chart-simple', label: 'Simple Chart', tags: ['graph', 'data', 'analytics'] },
1151
+ { name: 'calculator', label: 'Calculator', tags: ['math', 'compute', 'calculate'] },
1152
+ { name: 'percent', label: 'Percent', tags: ['percentage', 'discount', 'rate'] },
1153
+ { name: 'dollar-sign', label: 'Dollar', tags: ['money', 'currency', 'usd'] },
1154
+ { name: 'euro-sign', label: 'Euro', tags: ['money', 'currency', 'eur'] },
1155
+ { name: 'sterling-sign', label: 'Pound', tags: ['money', 'currency', 'gbp'] },
1156
+ { name: 'yen-sign', label: 'Yen', tags: ['money', 'currency', 'jpy'] },
1157
+ { name: 'coins', label: 'Coins', tags: ['money', 'cash', 'currency'] },
1158
+ { name: 'money-bill', label: 'Money Bill', tags: ['cash', 'currency', 'payment'] },
1159
+ { name: 'wallet', label: 'Wallet', tags: ['money', 'payment', 'cash'] },
1160
+ { name: 'credit-card', label: 'Credit Card', tags: ['payment', 'card', 'bank'] },
1161
+ { name: 'money-check', label: 'Check', tags: ['payment', 'bank', 'check'] },
1162
+ { name: 'receipt', label: 'Receipt', tags: ['bill', 'invoice', 'payment'] },
1163
+ { name: 'file-invoice', label: 'Invoice', tags: ['bill', 'receipt', 'document'] },
1164
+ { name: 'file-invoice-dollar', label: 'Invoice Dollar', tags: ['bill', 'payment', 'money'] },
1165
+ { name: 'briefcase', label: 'Briefcase', tags: ['business', 'work', 'professional'] },
1166
+ { name: 'suitcase', label: 'Suitcase', tags: ['travel', 'business', 'luggage'] },
1167
+ { name: 'building', label: 'Building', tags: ['office', 'company', 'business'] },
1168
+ { name: 'building-columns', label: 'Bank', tags: ['bank', 'government', 'institution'] },
1169
+ { name: 'store', label: 'Store', tags: ['shop', 'retail', 'business'] },
1170
+ { name: 'handshake', label: 'Handshake', tags: ['agreement', 'partnership', 'deal'] },
1171
+ { name: 'scale-balanced', label: 'Balance', tags: ['law', 'justice', 'legal'] },
1172
+ { name: 'gavel', label: 'Gavel', tags: ['law', 'court', 'legal'] },
1173
+ // Technology & Tools
1174
+ { name: 'laptop', label: 'Laptop', tags: ['computer', 'notebook', 'device'] },
1175
+ { name: 'laptop-code', label: 'Laptop Code', tags: ['programming', 'development'] },
1176
+ { name: 'desktop', label: 'Desktop', tags: ['computer', 'monitor', 'screen'] },
1177
+ { name: 'tablet', label: 'Tablet', tags: ['ipad', 'device', 'mobile'] },
1178
+ { name: 'tablet-screen-button', label: 'Tablet Button', tags: ['device', 'touch'] },
1179
+ { name: 'keyboard', label: 'Keyboard', tags: ['input', 'typing', 'keys'] },
1180
+ { name: 'mouse', label: 'Mouse', tags: ['pointer', 'click', 'input'] },
1181
+ { name: 'display', label: 'Display', tags: ['monitor', 'screen', 'computer'] },
1182
+ { name: 'wifi', label: 'WiFi', tags: ['internet', 'connection', 'wireless'] },
1183
+ { name: 'ethernet', label: 'Ethernet', tags: ['network', 'connection', 'cable'] },
1184
+ { name: 'signal', label: 'Signal', tags: ['network', 'connection', 'wifi'] },
1185
+ { name: 'network-wired', label: 'Network', tags: ['connection', 'lan', 'ethernet'] },
1186
+ { name: 'database', label: 'Database', tags: ['data', 'storage', 'sql'] },
1187
+ { name: 'hard-drive', label: 'Hard Drive', tags: ['storage', 'disk', 'hdd'] },
1188
+ { name: 'server', label: 'Server', tags: ['hosting', 'backend', 'computer'] },
1189
+ { name: 'memory', label: 'Memory', tags: ['ram', 'chip', 'hardware'] },
1190
+ { name: 'microchip', label: 'Microchip', tags: ['chip', 'processor', 'cpu'] },
1191
+ { name: 'code', label: 'Code', tags: ['programming', 'development', 'coding'] },
1192
+ { name: 'code-branch', label: 'Git Branch', tags: ['version', 'git', 'branch'] },
1193
+ { name: 'code-commit', label: 'Commit', tags: ['git', 'version', 'save'] },
1194
+ { name: 'code-merge', label: 'Merge', tags: ['git', 'branch', 'combine'] },
1195
+ { name: 'code-pull-request', label: 'Pull Request', tags: ['git', 'pr', 'review'] },
1196
+ { name: 'terminal', label: 'Terminal', tags: ['console', 'command', 'cli'] },
1197
+ { name: 'window-maximize', label: 'Maximize', tags: ['window', 'expand', 'fullscreen'] },
1198
+ { name: 'window-minimize', label: 'Minimize', tags: ['window', 'collapse'] },
1199
+ { name: 'window-restore', label: 'Restore', tags: ['window', 'resize'] },
1200
+ { name: 'bug', label: 'Bug', tags: ['error', 'debug', 'issue'] },
1201
+ { name: 'wrench', label: 'Wrench', tags: ['tools', 'settings', 'fix'] },
1202
+ { name: 'screwdriver-wrench', label: 'Tools', tags: ['repair', 'fix', 'settings'] },
1203
+ { name: 'hammer', label: 'Hammer', tags: ['tool', 'build', 'construct'] },
1204
+ { name: 'shield', label: 'Shield', tags: ['security', 'protection', 'defense'] },
1205
+ { name: 'shield-halved', label: 'Shield Half', tags: ['security', 'protection'] },
1206
+ { name: 'lock', label: 'Lock', tags: ['security', 'private', 'secure'] },
1207
+ { name: 'lock-open', label: 'Lock Open', tags: ['unlocked', 'open'] },
1208
+ { name: 'unlock', label: 'Unlock', tags: ['open', 'access', 'unlock'] },
1209
+ { name: 'key', label: 'Key', tags: ['access', 'password', 'security'] },
1210
+ { name: 'user-lock', label: 'User Lock', tags: ['security', 'private', 'protected'] },
1211
+ { name: 'user-shield', label: 'User Shield', tags: ['security', 'protected', 'admin'] },
1212
+ { name: 'qrcode', label: 'QR Code', tags: ['code', 'scan', 'barcode'] },
1213
+ { name: 'barcode', label: 'Barcode', tags: ['scan', 'code', 'product'] },
1214
+ // Transportation & Location
1215
+ { name: 'car', label: 'Car', tags: ['vehicle', 'automobile', 'transport'] },
1216
+ { name: 'car-side', label: 'Car Side', tags: ['vehicle', 'automobile'] },
1217
+ { name: 'taxi', label: 'Taxi', tags: ['cab', 'transport', 'vehicle'] },
1218
+ { name: 'bus', label: 'Bus', tags: ['transport', 'public', 'vehicle'] },
1219
+ { name: 'van-shuttle', label: 'Van', tags: ['transport', 'vehicle'] },
1220
+ { name: 'truck', label: 'Truck', tags: ['vehicle', 'delivery', 'transport'] },
1221
+ { name: 'truck-fast', label: 'Fast Delivery', tags: ['shipping', 'express', 'delivery'] },
1222
+ { name: 'motorcycle', label: 'Motorcycle', tags: ['bike', 'vehicle', 'transport'] },
1223
+ { name: 'plane', label: 'Plane', tags: ['aircraft', 'travel', 'flight'] },
1224
+ { name: 'plane-departure', label: 'Departure', tags: ['flight', 'travel', 'takeoff'] },
1225
+ { name: 'plane-arrival', label: 'Arrival', tags: ['flight', 'travel', 'landing'] },
1226
+ { name: 'helicopter', label: 'Helicopter', tags: ['aircraft', 'flight'] },
1227
+ { name: 'rocket', label: 'Rocket', tags: ['space', 'launch', 'fast'] },
1228
+ { name: 'train', label: 'Train', tags: ['railway', 'transport', 'travel'] },
1229
+ { name: 'subway', label: 'Subway', tags: ['metro', 'underground', 'transport'] },
1230
+ { name: 'ship', label: 'Ship', tags: ['boat', 'vessel', 'water'] },
1231
+ { name: 'anchor', label: 'Anchor', tags: ['ship', 'marine', 'boat'] },
1232
+ { name: 'bicycle', label: 'Bicycle', tags: ['bike', 'cycle', 'transport'] },
1233
+ { name: 'road', label: 'Road', tags: ['street', 'path', 'route'] },
1234
+ { name: 'map', label: 'Map', tags: ['location', 'navigation', 'directions'] },
1235
+ { name: 'map-location', label: 'Map Location', tags: ['pin', 'marker', 'place'] },
1236
+ { name: 'map-pin', label: 'Location Pin', tags: ['pin', 'marker', 'place'] },
1237
+ { name: 'location-dot', label: 'Location', tags: ['pin', 'marker', 'gps'] },
1238
+ { name: 'location-crosshairs', label: 'GPS', tags: ['location', 'position', 'gps'] },
1239
+ { name: 'route', label: 'Route', tags: ['directions', 'path', 'navigation'] },
1240
+ { name: 'globe', label: 'Globe', tags: ['world', 'earth', 'global'] },
1241
+ { name: 'earth-americas', label: 'Americas', tags: ['world', 'global', 'earth'] },
1242
+ { name: 'earth-europe', label: 'Europe', tags: ['world', 'global', 'earth'] },
1243
+ { name: 'earth-asia', label: 'Asia', tags: ['world', 'global', 'earth'] },
1244
+ { name: 'compass', label: 'Compass', tags: ['direction', 'navigation', 'north'] },
1245
+ { name: 'street-view', label: 'Street View', tags: ['location', 'map', 'view'] },
1246
+ // Health & Medical
1247
+ { name: 'heart-pulse', label: 'Heart Rate', tags: ['health', 'medical', 'heartbeat'] },
1248
+ { name: 'heart-circle-plus', label: 'Heart Plus', tags: ['health', 'add', 'medical'] },
1249
+ { name: 'stethoscope', label: 'Stethoscope', tags: ['medical', 'doctor', 'health'] },
1250
+ { name: 'user-doctor', label: 'Doctor', tags: ['medical', 'physician', 'healthcare'] },
1251
+ { name: 'user-nurse', label: 'Nurse', tags: ['medical', 'healthcare', 'hospital'] },
1252
+ { name: 'pills', label: 'Pills', tags: ['medicine', 'drugs', 'medication'] },
1253
+ { name: 'capsules', label: 'Capsules', tags: ['medicine', 'pills', 'medication'] },
1254
+ { name: 'prescription-bottle', label: 'Prescription', tags: ['medicine', 'pharmacy'] },
1255
+ { name: 'syringe', label: 'Syringe', tags: ['injection', 'medical', 'vaccine'] },
1256
+ { name: 'vial', label: 'Vial', tags: ['medicine', 'vaccine', 'medical'] },
1257
+ { name: 'bandage', label: 'Bandage', tags: ['first aid', 'wound', 'medical'] },
1258
+ { name: 'thermometer', label: 'Thermometer', tags: ['temperature', 'health', 'medical'] },
1259
+ { name: 'hospital', label: 'Hospital', tags: ['medical', 'healthcare', 'building'] },
1260
+ { name: 'hospital-user', label: 'Patient', tags: ['medical', 'healthcare', 'patient'] },
1261
+ { name: 'bed-pulse', label: 'Hospital Bed', tags: ['medical', 'patient', 'hospital'] },
1262
+ { name: 'wheelchair', label: 'Wheelchair', tags: ['accessibility', 'medical', 'disabled'] },
1263
+ { name: 'crutch', label: 'Crutch', tags: ['medical', 'injury', 'support'] },
1264
+ { name: 'smoking', label: 'Smoking', tags: ['cigarette', 'health', 'no-smoking'] },
1265
+ { name: 'smoking-ban', label: 'No Smoking', tags: ['prohibited', 'health'] },
1266
+ // Education & Learning
1267
+ { name: 'graduation-cap', label: 'Graduation', tags: ['education', 'degree', 'graduate'] },
1268
+ { name: 'user-graduate', label: 'Graduate', tags: ['student', 'education', 'degree'] },
1269
+ { name: 'chalkboard-user', label: 'Teacher', tags: ['education', 'teaching', 'classroom'] },
1270
+ { name: 'school', label: 'School', tags: ['education', 'building', 'learning'] },
1271
+ { name: 'book', label: 'Book', tags: ['reading', 'education', 'library'] },
1272
+ { name: 'book-open', label: 'Open Book', tags: ['reading', 'study', 'learn'] },
1273
+ { name: 'book-bookmark', label: 'Bookmark', tags: ['reading', 'save', 'mark'] },
1274
+ { name: 'books', label: 'Books', tags: ['reading', 'library', 'education'] },
1275
+ { name: 'bookmark', label: 'Bookmark', tags: ['save', 'mark', 'reading'] },
1276
+ { name: 'pen', label: 'Pen', tags: ['write', 'draw', 'writing'] },
1277
+ { name: 'pen-fancy', label: 'Fancy Pen', tags: ['write', 'signature'] },
1278
+ { name: 'pen-nib', label: 'Pen Nib', tags: ['write', 'calligraphy'] },
1279
+ { name: 'pencil', label: 'Pencil', tags: ['write', 'draw', 'edit'] },
1280
+ { name: 'highlighter', label: 'Highlighter', tags: ['mark', 'emphasize', 'note'] },
1281
+ { name: 'marker', label: 'Marker', tags: ['write', 'draw', 'mark'] },
1282
+ { name: 'eraser', label: 'Eraser', tags: ['delete', 'remove', 'erase'] },
1283
+ { name: 'ruler', label: 'Ruler', tags: ['measure', 'straight', 'tool'] },
1284
+ { name: 'ruler-combined', label: 'Rulers', tags: ['measure', 'geometry'] },
1285
+ { name: 'calculator', label: 'Calculator', tags: ['math', 'calculate', 'compute'] },
1286
+ { name: 'square-root-variable', label: 'Math', tags: ['mathematics', 'equation'] },
1287
+ { name: 'microscope', label: 'Microscope', tags: ['science', 'research', 'lab'] },
1288
+ { name: 'flask', label: 'Flask', tags: ['science', 'chemistry', 'lab'] },
1289
+ { name: 'atom', label: 'Atom', tags: ['science', 'physics', 'chemistry'] },
1290
+ { name: 'dna', label: 'DNA', tags: ['science', 'biology', 'genetics'] },
1291
+ { name: 'brain', label: 'Brain', tags: ['mind', 'think', 'intelligence'] },
1292
+ { name: 'certificate', label: 'Certificate', tags: ['award', 'achievement', 'diploma'] },
1293
+ { name: 'award', label: 'Award', tags: ['trophy', 'achievement', 'prize'] },
1294
+ { name: 'medal', label: 'Medal', tags: ['award', 'achievement', 'winner'] },
1295
+ { name: 'trophy', label: 'Trophy', tags: ['award', 'winner', 'achievement'] },
1296
+ // Food & Dining
1297
+ { name: 'utensils', label: 'Utensils', tags: ['food', 'dining', 'restaurant'] },
1298
+ { name: 'fork-knife', label: 'Fork Knife', tags: ['food', 'dining', 'restaurant'] },
1299
+ { name: 'plate-utensils', label: 'Plate', tags: ['food', 'dining', 'meal'] },
1300
+ { name: 'pizza-slice', label: 'Pizza', tags: ['food', 'slice', 'italian'] },
1301
+ { name: 'burger', label: 'Burger', tags: ['food', 'fast', 'hamburger'] },
1302
+ { name: 'hotdog', label: 'Hotdog', tags: ['food', 'fast'] },
1303
+ { name: 'drumstick-bite', label: 'Chicken', tags: ['food', 'meat', 'poultry'] },
1304
+ { name: 'ice-cream', label: 'Ice Cream', tags: ['dessert', 'sweet', 'frozen'] },
1305
+ { name: 'mug-hot', label: 'Hot Beverage', tags: ['drink', 'coffee', 'tea'] },
1306
+ { name: 'coffee', label: 'Coffee', tags: ['drink', 'beverage', 'cafe'] },
1307
+ { name: 'mug-saucer', label: 'Coffee Cup', tags: ['drink', 'coffee', 'tea'] },
1308
+ { name: 'glass-water', label: 'Water', tags: ['drink', 'beverage', 'glass'] },
1309
+ { name: 'wine-glass', label: 'Wine', tags: ['drink', 'alcohol', 'beverage'] },
1310
+ { name: 'champagne-glasses', label: 'Champagne', tags: ['celebrate', 'drink', 'toast'] },
1311
+ { name: 'martini-glass', label: 'Martini', tags: ['drink', 'alcohol', 'cocktail'] },
1312
+ { name: 'beer-mug-empty', label: 'Beer', tags: ['drink', 'alcohol', 'beverage'] },
1313
+ { name: 'cake', label: 'Cake', tags: ['dessert', 'sweet', 'birthday'] },
1314
+ { name: 'cake-candles', label: 'Birthday Cake', tags: ['birthday', 'celebration', 'party'] },
1315
+ { name: 'cookie', label: 'Cookie', tags: ['food', 'dessert', 'sweet'] },
1316
+ { name: 'candy-cane', label: 'Candy Cane', tags: ['candy', 'sweet', 'christmas'] },
1317
+ { name: 'apple-whole', label: 'Apple', tags: ['fruit', 'healthy', 'food'] },
1318
+ { name: 'lemon', label: 'Lemon', tags: ['fruit', 'citrus', 'food'] },
1319
+ { name: 'carrot', label: 'Carrot', tags: ['vegetable', 'healthy', 'food'] },
1320
+ { name: 'pepper-hot', label: 'Pepper', tags: ['spicy', 'food', 'hot'] },
1321
+ // Sports & Recreation
1322
+ { name: 'football', label: 'Football', tags: ['sport', 'soccer', 'game'] },
1323
+ { name: 'futbol', label: 'Soccer Ball', tags: ['sport', 'football', 'ball'] },
1324
+ { name: 'basketball', label: 'Basketball', tags: ['sport', 'ball', 'game'] },
1325
+ { name: 'baseball', label: 'Baseball', tags: ['sport', 'ball', 'game'] },
1326
+ { name: 'baseball-bat-ball', label: 'Baseball Bat', tags: ['sport', 'baseball'] },
1327
+ { name: 'volleyball', label: 'Volleyball', tags: ['sport', 'ball', 'game'] },
1328
+ { name: 'table-tennis-paddle-ball', label: 'Table Tennis', tags: ['sport', 'ping-pong'] },
1329
+ { name: 'golf-ball-tee', label: 'Golf', tags: ['sport', 'golf', 'game'] },
1330
+ { name: 'hockey-puck', label: 'Hockey', tags: ['sport', 'ice', 'game'] },
1331
+ { name: 'bowling-ball', label: 'Bowling', tags: ['sport', 'game', 'ball'] },
1332
+ { name: 'person-running', label: 'Running', tags: ['sport', 'exercise', 'fitness'] },
1333
+ { name: 'person-biking', label: 'Biking', tags: ['sport', 'exercise', 'cycling'] },
1334
+ { name: 'person-swimming', label: 'Swimming', tags: ['sport', 'water', 'exercise'] },
1335
+ { name: 'person-skiing', label: 'Skiing', tags: ['sport', 'winter', 'snow'] },
1336
+ { name: 'dumbbell', label: 'Dumbbell', tags: ['fitness', 'weight', 'gym'] },
1337
+ { name: 'weight-hanging', label: 'Weight', tags: ['fitness', 'gym', 'exercise'] },
1338
+ { name: 'heart', label: 'Heart', tags: ['health', 'fitness', 'cardio'] },
1339
+ { name: 'stopwatch-20', label: 'Timer', tags: ['time', 'sport', 'track'] },
1340
+ // Weather & Nature
1341
+ { name: 'sun', label: 'Sun', tags: ['weather', 'bright', 'sunny'] },
1342
+ { name: 'moon', label: 'Moon', tags: ['night', 'dark', 'lunar'] },
1343
+ { name: 'star', label: 'Star', tags: ['night', 'sky', 'favorite'] },
1344
+ { name: 'cloud', label: 'Cloud', tags: ['weather', 'sky', 'cloudy'] },
1345
+ { name: 'cloud-sun', label: 'Partly Cloudy', tags: ['weather', 'mixed'] },
1346
+ { name: 'cloud-moon', label: 'Cloudy Night', tags: ['weather', 'night'] },
1347
+ { name: 'cloud-rain', label: 'Rain', tags: ['weather', 'precipitation', 'rainy'] },
1348
+ { name: 'cloud-showers-heavy', label: 'Heavy Rain', tags: ['weather', 'storm', 'rain'] },
1349
+ { name: 'umbrella', label: 'Umbrella', tags: ['rain', 'weather', 'protection'] },
1350
+ { name: 'snowflake', label: 'Snow', tags: ['weather', 'cold', 'winter'] },
1351
+ { name: 'icicles', label: 'Icicles', tags: ['winter', 'cold', 'ice'] },
1352
+ { name: 'temperature-high', label: 'Hot', tags: ['weather', 'temperature', 'heat'] },
1353
+ { name: 'temperature-low', label: 'Cold', tags: ['weather', 'temperature', 'cool'] },
1354
+ { name: 'bolt', label: 'Lightning', tags: ['weather', 'storm', 'thunder'] },
1355
+ { name: 'bolt-lightning', label: 'Thunder', tags: ['weather', 'storm', 'lightning'] },
1356
+ { name: 'wind', label: 'Wind', tags: ['weather', 'breeze', 'air'] },
1357
+ { name: 'tornado', label: 'Tornado', tags: ['weather', 'storm', 'cyclone'] },
1358
+ { name: 'water', label: 'Water', tags: ['nature', 'liquid', 'sea'] },
1359
+ { name: 'droplet', label: 'Droplet', tags: ['water', 'liquid', 'drop'] },
1360
+ { name: 'fire', label: 'Fire', tags: ['hot', 'burn', 'flame'] },
1361
+ { name: 'fire-flame-curved', label: 'Flame', tags: ['fire', 'hot', 'burn'] },
1362
+ { name: 'tree', label: 'Tree', tags: ['nature', 'plant', 'forest'] },
1363
+ { name: 'seedling', label: 'Seedling', tags: ['plant', 'grow', 'nature'] },
1364
+ { name: 'leaf', label: 'Leaf', tags: ['nature', 'plant', 'green'] },
1365
+ { name: 'clover', label: 'Clover', tags: ['nature', 'plant', 'lucky'] },
1366
+ { name: 'flower', label: 'Flower', tags: ['nature', 'plant', 'blossom'] },
1367
+ { name: 'feather', label: 'Feather', tags: ['nature', 'bird', 'light'] },
1368
+ { name: 'mountain', label: 'Mountain', tags: ['nature', 'landscape', 'peak'] },
1369
+ // Shopping & Commerce
1370
+ { name: 'shopping-cart', label: 'Shopping Cart', tags: ['buy', 'purchase', 'shop'] },
1371
+ { name: 'cart-plus', label: 'Add to Cart', tags: ['shopping', 'add', 'buy'] },
1372
+ { name: 'cart-shopping', label: 'Cart', tags: ['shop', 'buy', 'store'] },
1373
+ { name: 'bag-shopping', label: 'Shopping Bag', tags: ['buy', 'store', 'retail'] },
1374
+ { name: 'basket-shopping', label: 'Basket', tags: ['shopping', 'buy', 'cart'] },
1375
+ { name: 'store', label: 'Store', tags: ['shop', 'retail', 'business'] },
1376
+ { name: 'shop', label: 'Shop', tags: ['store', 'retail', 'business'] },
1377
+ { name: 'cash-register', label: 'Cash Register', tags: ['payment', 'checkout', 'pos'] },
1378
+ { name: 'tags', label: 'Tags', tags: ['price', 'label', 'sale'] },
1379
+ { name: 'tag', label: 'Tag', tags: ['price', 'label', 'sale'] },
1380
+ { name: 'barcode', label: 'Barcode', tags: ['scan', 'product', 'price'] },
1381
+ { name: 'percent', label: 'Percent', tags: ['discount', 'sale', 'offer'] },
1382
+ { name: 'gift', label: 'Gift', tags: ['present', 'surprise', 'celebration'] },
1383
+ { name: 'gifts', label: 'Gifts', tags: ['presents', 'celebration'] },
1384
+ { name: 'box', label: 'Box', tags: ['package', 'container', 'shipping'] },
1385
+ { name: 'box-open', label: 'Open Box', tags: ['unpack', 'delivery', 'package'] },
1386
+ { name: 'boxes-stacked', label: 'Boxes', tags: ['inventory', 'storage', 'warehouse'] },
1387
+ // Security & Safety
1388
+ { name: 'eye', label: 'Eye', tags: ['view', 'watch', 'visible'] },
1389
+ { name: 'eye-slash', label: 'Hide', tags: ['hidden', 'invisible', 'password'] },
1390
+ { name: 'eye-low-vision', label: 'Low Vision', tags: ['accessibility', 'vision'] },
1391
+ { name: 'user-secret', label: 'Secret User', tags: ['anonymous', 'hidden', 'spy'] },
1392
+ { name: 'fingerprint', label: 'Fingerprint', tags: ['biometric', 'identity', 'security'] },
1393
+ { name: 'id-card', label: 'ID Card', tags: ['identity', 'badge', 'credential'] },
1394
+ { name: 'id-badge', label: 'Badge', tags: ['identity', 'credential', 'staff'] },
1395
+ { name: 'fire', label: 'Fire', tags: ['hot', 'burn', 'danger'] },
1396
+ { name: 'fire-extinguisher', label: 'Fire Extinguisher', tags: ['safety', 'emergency'] },
1397
+ { name: 'triangle-exclamation', label: 'Warning', tags: ['alert', 'caution', 'danger'] },
1398
+ { name: 'exclamation', label: 'Exclamation', tags: ['alert', 'important', 'warning'] },
1399
+ { name: 'circle-exclamation', label: 'Alert', tags: ['warning', 'important'] },
1400
+ { name: 'ban', label: 'Ban', tags: ['prohibited', 'forbidden', 'stop'] },
1401
+ { name: 'circle-radiation', label: 'Radiation', tags: ['danger', 'hazard', 'warning'] },
1402
+ { name: 'skull-crossbones', label: 'Danger', tags: ['hazard', 'poison', 'warning'] },
1403
+ { name: 'biohazard', label: 'Biohazard', tags: ['danger', 'hazard', 'warning'] },
1404
+ // Miscellaneous
1405
+ { name: 'circle', label: 'Circle', tags: ['shape', 'round', 'dot'] },
1406
+ { name: 'square', label: 'Square', tags: ['shape', 'box'] },
1407
+ { name: 'square-full', label: 'Full Square', tags: ['shape', 'filled'] },
1408
+ { name: 'circle-dot', label: 'Dot', tags: ['point', 'marker', 'bullet'] },
1409
+ { name: 'question', label: 'Question', tags: ['help', 'ask', 'faq'] },
1410
+ { name: 'circle-question', label: 'Help', tags: ['question', 'support', 'info'] },
1411
+ { name: 'circle-info', label: 'Info', tags: ['information', 'details', 'about'] },
1412
+ { name: 'info', label: 'Information', tags: ['info', 'details', 'help'] },
1413
+ { name: 'lightbulb', label: 'Lightbulb', tags: ['idea', 'bright', 'innovation'] },
1414
+ { name: 'bolt', label: 'Bolt', tags: ['lightning', 'fast', 'power'] },
1415
+ { name: 'wand-magic', label: 'Magic Wand', tags: ['magic', 'wizard', 'sparkle'] },
1416
+ { name: 'wand-magic-sparkles', label: 'Magic', tags: ['wizard', 'sparkle', 'enchant'] },
1417
+ { name: 'puzzle-piece', label: 'Puzzle', tags: ['piece', 'solve', 'game'] },
1418
+ { name: 'gamepad', label: 'Gamepad', tags: ['gaming', 'controller', 'play'] },
1419
+ { name: 'dice', label: 'Dice', tags: ['game', 'random', 'chance'] },
1420
+ { name: 'dice-d20', label: 'D20 Dice', tags: ['game', 'tabletop', 'rpg'] },
1421
+ { name: 'chess', label: 'Chess', tags: ['game', 'strategy', 'board'] },
1422
+ { name: 'spade', label: 'Spade', tags: ['cards', 'game', 'suit'] },
1423
+ { name: 'heart', label: 'Heart Card', tags: ['cards', 'game', 'suit'] },
1424
+ { name: 'diamond', label: 'Diamond', tags: ['cards', 'game', 'suit'] },
1425
+ { name: 'club', label: 'Club', tags: ['cards', 'game', 'suit'] },
1426
+ { name: 'palette', label: 'Palette', tags: ['color', 'art', 'paint'] },
1427
+ { name: 'brush', label: 'Brush', tags: ['paint', 'art', 'draw'] },
1428
+ { name: 'paintbrush', label: 'Paintbrush', tags: ['art', 'paint', 'draw'] },
1429
+ { name: 'scissors', label: 'Scissors', tags: ['cut', 'trim', 'tool'] },
1430
+ { name: 'crown', label: 'Crown', tags: ['king', 'royal', 'premium'] },
1431
+ { name: 'gem', label: 'Gem', tags: ['diamond', 'jewel', 'precious'] },
1432
+ { name: 'ring', label: 'Ring', tags: ['jewelry', 'wedding', 'engagement'] },
1433
+ { name: 'mug-hot', label: 'Hot Drink', tags: ['coffee', 'tea', 'beverage'] },
1434
+ { name: 'battery-full', label: 'Battery Full', tags: ['power', 'charge', 'energy'] },
1435
+ { name: 'battery-half', label: 'Battery Half', tags: ['power', 'charge'] },
1436
+ { name: 'battery-empty', label: 'Battery Empty', tags: ['power', 'low', 'charge'] },
1437
+ { name: 'plug', label: 'Plug', tags: ['power', 'electricity', 'connect'] },
1438
+ { name: 'magnet', label: 'Magnet', tags: ['attract', 'magnetic', 'pull'] },
1439
+ { name: 'compass-drafting', label: 'Drafting Compass', tags: ['geometry', 'draw', 'circle'] },
1440
+ { name: 'rotate', label: 'Rotate', tags: ['spin', 'turn', 'refresh'] },
1441
+ { name: 'infinity', label: 'Infinity', tags: ['unlimited', 'endless', 'loop'] },
1442
+ ];
1443
+ //#endregion
1444
+ //#region ---- Default Providers ----
1445
+ /**
1446
+ * Default icon provider that provides the base set of FontAwesome icons.
1447
+ */
1448
+ class AXPIconProviderDefault extends AXPIconProvider {
1449
+ async provide() {
1450
+ return DEFAULT_ICONS;
1451
+ }
1452
+ }
1453
+ /**
1454
+ * Default icon style provider that provides the base set of FontAwesome styles.
1455
+ */
1456
+ class AXPIconStyleProviderDefault extends AXPIconStyleProvider {
1457
+ async provide() {
1458
+ return DEFAULT_ICON_STYLES;
1459
+ }
1460
+ }
1461
+ //#endregion
1462
+
1463
+ //#region ---- Provider Functions ----
1464
+ /**
1465
+ * Provides the default icon provider to the application.
1466
+ * This should be registered in your app module or config.
1467
+ */
1468
+ function provideDefaultIconProvider() {
1469
+ return {
1470
+ provide: AXP_ICON_PROVIDER,
1471
+ useClass: AXPIconProviderDefault,
1472
+ multi: true,
1473
+ };
1474
+ }
1475
+ /**
1476
+ * Provides the default icon style provider to the application.
1477
+ * This should be registered in your app module or config.
1478
+ */
1479
+ function provideDefaultIconStyleProvider() {
1480
+ return {
1481
+ provide: AXP_ICON_STYLE_PROVIDER,
1482
+ useClass: AXPIconStyleProviderDefault,
1483
+ multi: true,
1484
+ };
1485
+ }
1486
+ /**
1487
+ * Provides both default icon and style providers to the application.
1488
+ * This is a convenience function that combines provideDefaultIconProvider() and provideDefaultIconStyleProvider().
1489
+ */
1490
+ function provideDefaultIconChooser() {
1491
+ return [provideDefaultIconProvider(), provideDefaultIconStyleProvider()];
1492
+ }
1493
+ /**
1494
+ * Provides a custom icon provider to the application.
1495
+ * This ADDS additional icons alongside the default icon set.
1496
+ *
1497
+ * @param providerClass - The custom icon provider class
1498
+ *
1499
+ * @example
1500
+ * ```typescript
1501
+ * class MyCustomIconProvider extends AXPIconProvider {
1502
+ * async provide(): Promise<AXPFontAwesomeIcon[]> {
1503
+ * return [
1504
+ * { name: 'custom-icon', label: 'Custom Icon' }
1505
+ * ];
1506
+ * }
1507
+ * }
1508
+ *
1509
+ * export const appConfig: ApplicationConfig = {
1510
+ * providers: [
1511
+ * provideCustomIconProvider(MyCustomIconProvider),
1512
+ * ]
1513
+ * };
1514
+ * ```
1515
+ */
1516
+ function provideCustomIconProvider(providerClass) {
1517
+ return {
1518
+ provide: AXP_ICON_PROVIDER,
1519
+ useClass: providerClass,
1520
+ multi: true,
1521
+ };
1522
+ }
1523
+ /**
1524
+ * Provides a custom icon style provider to the application.
1525
+ * This ADDS additional icon styles alongside the default styles.
1526
+ *
1527
+ * @param providerClass - The custom icon style provider class
1528
+ *
1529
+ * @example
1530
+ * ```typescript
1531
+ * class MyCustomIconStyleProvider extends AXPIconStyleProvider {
1532
+ * async provide(): Promise<AXPFontAwesomeIconStyle[]> {
1533
+ * return [
1534
+ * { name: 'fa-custom', label: 'Custom' }
1535
+ * ];
1536
+ * }
1537
+ * }
1538
+ *
1539
+ * export const appConfig: ApplicationConfig = {
1540
+ * providers: [
1541
+ * provideCustomIconStyleProvider(MyCustomIconStyleProvider),
1542
+ * ]
1543
+ * };
1544
+ * ```
1545
+ */
1546
+ function provideCustomIconStyleProvider(providerClass) {
1547
+ return {
1548
+ provide: AXP_ICON_STYLE_PROVIDER,
1549
+ useClass: providerClass,
1550
+ multi: true,
1551
+ };
1552
+ }
1553
+ //#endregion
1554
+
1555
+ class AXPFontSizeChooserWidgetComponent extends AXPValueWidgetComponent {
1556
+ constructor() {
1557
+ super(...arguments);
1558
+ this.sizes = signal(['small', 'medium', 'large', 'x-large'], ...(ngDevMode ? [{ debugName: "sizes" }] : /* istanbul ignore next */ []));
1559
+ this.selectedSize = signal(null, ...(ngDevMode ? [{ debugName: "selectedSize" }] : /* istanbul ignore next */ []));
1560
+ this.#eff = effect(() => {
1561
+ if (this.getValue()) {
1562
+ this.selectedSize.set(this.sizes().find((s) => s === this.getValue()) ?? this.sizes()[0]);
1563
+ }
1564
+ }, ...(ngDevMode ? [{ debugName: "#eff" }] : /* istanbul ignore next */ []));
1565
+ }
1566
+ #eff;
1567
+ onSizeClick(size) {
1568
+ this.setValue(size);
1569
+ }
1570
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFontSizeChooserWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1571
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPFontSizeChooserWidgetComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
1572
+ @for (size of sizes(); track size) {
1573
+ <div (click)="onSizeClick(size)" [style.font-size]="size" [class.--selected]="size === selectedSize()">
1574
+ <div>
1575
+ <span>{{ '@layout:terms.font-sizes.' + size | translate | async }}</span>
1576
+ </div>
1577
+ </div>
1578
+ }
1579
+ `, 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 }); }
1580
+ }
1581
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFontSizeChooserWidgetComponent, decorators: [{
1582
+ type: Component,
1583
+ args: [{ template: `
1584
+ @for (size of sizes(); track size) {
1585
+ <div (click)="onSizeClick(size)" [style.font-size]="size" [class.--selected]="size === selectedSize()">
1586
+ <div>
1587
+ <span>{{ '@layout:terms.font-sizes.' + size | translate | async }}</span>
1588
+ </div>
1589
+ </div>
1590
+ }
1591
+ `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, AXSelectionCdkModule, AXTranslationModule], 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"] }]
1592
+ }] });
1593
+
1594
+ var fontSizeChooserWidget_component = /*#__PURE__*/Object.freeze({
1595
+ __proto__: null,
1596
+ AXPFontSizeChooserWidgetComponent: AXPFontSizeChooserWidgetComponent
1597
+ });
1598
+
1599
+ const AXPFontSizeChooserWidget = {
1600
+ name: "font-size-chooser",
1601
+ title: "Font Size Chooser",
1602
+ icon: "fa-light fa-text-size",
1603
+ type: 'editor',
1604
+ categories: AXP_WIDGETS_LAYOUT_CATEGORY,
1605
+ properties: [
1606
+ AXP_NAME_PROPERTY,
1607
+ AXP_DATA_PATH_PROPERTY,
1608
+ AXP_DISABLED_PROPERTY,
1609
+ ],
1610
+ components: {
1611
+ edit: {
1612
+ component: () => Promise.resolve().then(function () { return fontSizeChooserWidget_component; }).then((c) => c.AXPFontSizeChooserWidgetComponent),
1613
+ },
1614
+ }
1615
+ };
1616
+
1617
+ class AXPFontStyleChooserWidgetComponent extends AXPValueWidgetComponent {
1618
+ constructor() {
1619
+ super(...arguments);
1620
+ this.fonts = signal([
1621
+ { id: 'system-ui', title: 'Default' },
1622
+ { id: 'serif', title: 'Serif' },
1623
+ { id: 'sans-serif', title: 'Sans-serif' },
1624
+ { id: 'monospace', title: 'Monospace' },
1625
+ { id: 'arial', title: 'Arial' },
1626
+ { id: 'verdana', title: 'Verdana' },
1627
+ { id: 'tahoma', title: 'Tahoma' },
1628
+ { id: 'times-new-roman', title: 'Times New Roman' },
1629
+ { id: 'georgia', title: 'Georgia' },
1630
+ { id: 'helvetica', title: 'Helvetica' },
1631
+ { id: 'calibri', title: 'Calibri' },
1632
+ { id: 'cursive', title: 'Cursive' },
1633
+ { id: 'vazirmatn', title: 'Vazir وزیر' },
1634
+ ], ...(ngDevMode ? [{ debugName: "fonts" }] : /* istanbul ignore next */ []));
1635
+ this.selectedFont = signal(null, ...(ngDevMode ? [{ debugName: "selectedFont" }] : /* istanbul ignore next */ []));
1636
+ this.#eff = effect(() => {
1637
+ if (this.getValue()) {
1638
+ this.selectedFont.set(this.fonts().find((f) => f.id === this.getValue()) ?? this.fonts()[0]);
1639
+ }
1640
+ }, ...(ngDevMode ? [{ debugName: "#eff" }] : /* istanbul ignore next */ []));
1641
+ }
1642
+ #eff;
1643
+ onFontClick(font) {
1644
+ this.setValue(font.id);
1645
+ }
1646
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFontStyleChooserWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1647
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPFontStyleChooserWidgetComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
1648
+ @for (font of fonts(); track font.id) {
1649
+ <div
1650
+ (click)="onFontClick(font)"
1651
+ [class.--selected]="font.id === selectedFont()?.id"
1652
+ [style.font-family]="font.id"
1653
+ >
1654
+ <div>
1655
+ <span>{{ font.title }}</span>
1656
+ </div>
1657
+ </div>
1658
+ }
1659
+ `, 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: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1660
+ }
1661
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFontStyleChooserWidgetComponent, decorators: [{
1662
+ type: Component,
1663
+ args: [{ template: `
1664
+ @for (font of fonts(); track font.id) {
1665
+ <div
1666
+ (click)="onFontClick(font)"
1667
+ [class.--selected]="font.id === selectedFont()?.id"
1668
+ [style.font-family]="font.id"
1669
+ >
1670
+ <div>
1671
+ <span>{{ font.title }}</span>
1672
+ </div>
1673
+ </div>
1674
+ }
1675
+ `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, AXSelectionCdkModule], 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"] }]
1676
+ }] });
1677
+
1678
+ var fontStyleChooserWidget_component = /*#__PURE__*/Object.freeze({
1679
+ __proto__: null,
1680
+ AXPFontStyleChooserWidgetComponent: AXPFontStyleChooserWidgetComponent
1681
+ });
1682
+
1683
+ const AXPFontStyleChooserWidget = {
1684
+ name: "font-style-chooser",
1685
+ title: "Font Style Chooser",
1686
+ icon: "fa-light fa-font",
1687
+ type: 'editor',
1688
+ categories: AXP_WIDGETS_LAYOUT_CATEGORY,
1689
+ properties: [
1690
+ AXP_NAME_PROPERTY,
1691
+ AXP_DATA_PATH_PROPERTY,
1692
+ AXP_DISABLED_PROPERTY,
1693
+ ],
1694
+ components: {
1695
+ edit: {
1696
+ component: () => Promise.resolve().then(function () { return fontStyleChooserWidget_component; }).then((c) => c.AXPFontStyleChooserWidgetComponent),
1697
+ },
1698
+ }
1699
+ };
1700
+
1701
+ class AXPMenuOrientationChooserWidgetComponent extends AXPValueWidgetComponent {
1702
+ constructor() {
1703
+ super(...arguments);
1704
+ this.orientations = computed(() => {
1705
+ const chooser = this.options()['chooser'];
1706
+ if (chooser === 'vertical-mode') {
1707
+ return [
1708
+ {
1709
+ id: 'compact',
1710
+ image: '/assets/images/menu-mode/compact.svg',
1711
+ labelKey: '@layout:terms.menu-modes.compact',
1712
+ },
1713
+ {
1714
+ id: 'full',
1715
+ image: '/assets/images/menu-mode/full.svg',
1716
+ labelKey: '@layout:terms.menu-modes.full',
1717
+ },
1718
+ ];
1719
+ }
1720
+ if (chooser === 'navigation-mode') {
1721
+ return [
1722
+ {
1723
+ id: 'simple',
1724
+ image: '/assets/images/navigation-mode/simple.svg',
1725
+ labelKey: '@layout:terms.navigation-modes.simple',
1726
+ },
1727
+ {
1728
+ id: 'tabular',
1729
+ image: '/assets/images/navigation-mode/tabular.svg',
1730
+ labelKey: '@layout:terms.navigation-modes.tabular',
1731
+ },
1732
+ ];
1733
+ }
1734
+ return [
1735
+ {
1736
+ id: 'vertical',
1737
+ icon: 'fa-regular fa-square-ellipsis-vertical',
1738
+ labelKey: '@layout:terms.menu-modes.vertical',
1739
+ },
1740
+ {
1741
+ id: 'horizontal',
1742
+ icon: 'fa-regular fa-square-ellipsis',
1743
+ labelKey: '@layout:terms.menu-modes.horizontal',
1744
+ },
1745
+ ];
1746
+ }, ...(ngDevMode ? [{ debugName: "orientations" }] : /* istanbul ignore next */ []));
1747
+ this.selectedOrientation = signal(null, ...(ngDevMode ? [{ debugName: "selectedOrientation" }] : /* istanbul ignore next */ []));
1748
+ this.#eff = effect(() => {
1749
+ const options = this.orientations();
1750
+ if (this.getValue()) {
1751
+ this.selectedOrientation.set(options.find((o) => o.id === this.getValue()) ?? options[0]);
1752
+ }
1753
+ }, ...(ngDevMode ? [{ debugName: "#eff" }] : /* istanbul ignore next */ []));
1754
+ }
1755
+ #eff;
1756
+ onOrientationClick(orientation) {
1757
+ this.setValue(orientation.id);
1758
+ }
1759
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPMenuOrientationChooserWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1760
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPMenuOrientationChooserWidgetComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
1761
+ @for (orientation of orientations(); track orientation.id) {
1762
+ <div
1763
+ (click)="onOrientationClick(orientation)"
1764
+ [class.--selected]="orientation.id === selectedOrientation()?.id"
1765
+ [class.--visual]="!!orientation.image"
1766
+ >
1767
+ @if (orientation.image) {
1768
+ <img [src]="orientation.image" [alt]="orientation.labelKey | translate | async" />
1769
+ <span>{{ orientation.labelKey | translate | async }}</span>
1770
+ } @else {
1771
+ <i [class]="orientation.icon"></i>
1772
+ <span>{{ orientation.labelKey | translate | async }}</span>
1773
+ }
1774
+ </div>
1775
+ }
1776
+ `, 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.--visual{flex-direction:column;align-items:stretch;justify-content:flex-start;gap:.5rem;padding:.75rem}:host>div.--visual img{display:block;height:auto;width:100%}:host>div.--visual>span{text-align:center;font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.375}:host>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 }); }
1777
+ }
1778
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPMenuOrientationChooserWidgetComponent, decorators: [{
1779
+ type: Component,
1780
+ args: [{ template: `
1781
+ @for (orientation of orientations(); track orientation.id) {
1782
+ <div
1783
+ (click)="onOrientationClick(orientation)"
1784
+ [class.--selected]="orientation.id === selectedOrientation()?.id"
1785
+ [class.--visual]="!!orientation.image"
1786
+ >
1787
+ @if (orientation.image) {
1788
+ <img [src]="orientation.image" [alt]="orientation.labelKey | translate | async" />
1789
+ <span>{{ orientation.labelKey | translate | async }}</span>
1790
+ } @else {
1791
+ <i [class]="orientation.icon"></i>
1792
+ <span>{{ orientation.labelKey | translate | async }}</span>
1793
+ }
1794
+ </div>
1795
+ }
1796
+ `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, AXSelectionCdkModule, AXTranslationModule], 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.--visual{flex-direction:column;align-items:stretch;justify-content:flex-start;gap:.5rem;padding:.75rem}:host>div.--visual img{display:block;height:auto;width:100%}:host>div.--visual>span{text-align:center;font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1.375}:host>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"] }]
1797
+ }] });
1798
+
1799
+ var menuOrientationChooserWidget_component = /*#__PURE__*/Object.freeze({
1800
+ __proto__: null,
1801
+ AXPMenuOrientationChooserWidgetComponent: AXPMenuOrientationChooserWidgetComponent
1802
+ });
1803
+
1804
+ const AXPMenuOrientationChooserWidget = {
1805
+ name: "menu-orientation-chooser",
1806
+ title: "Menu Orientation Chooser",
1807
+ icon: "fa-light fa-bars-staggered",
1808
+ type: 'editor',
1809
+ categories: AXP_WIDGETS_LAYOUT_CATEGORY,
1810
+ properties: [
1811
+ AXP_NAME_PROPERTY,
1812
+ AXP_DATA_PATH_PROPERTY,
1813
+ AXP_DISABLED_PROPERTY,
1814
+ ],
1815
+ components: {
1816
+ edit: {
1817
+ component: () => Promise.resolve().then(function () { return menuOrientationChooserWidget_component; }).then((c) => c.AXPMenuOrientationChooserWidgetComponent),
1818
+ },
1819
+ }
1820
+ };
1821
+
1822
+ //#endregion
1823
+ //#region ---- Color utilities ----
1824
+ function hexToRgb(hex) {
1825
+ const normalized = hex.trim().replace(/^#/, '');
1826
+ const full = normalized.length === 3
1827
+ ? normalized
1828
+ .split('')
1829
+ .map((c) => c + c)
1830
+ .join('')
1831
+ : normalized;
1832
+ return [
1833
+ parseInt(full.slice(0, 2), 16),
1834
+ parseInt(full.slice(2, 4), 16),
1835
+ parseInt(full.slice(4, 6), 16),
1836
+ ];
1837
+ }
1838
+ function relativeLuminance(hex) {
1839
+ const [r, g, b] = hexToRgb(hex).map((c) => {
1840
+ const s = c / 255;
1841
+ return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
1842
+ });
1843
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
1844
+ }
1845
+ function contrastForeground(backgroundHex) {
1846
+ return relativeLuminance(backgroundHex) > 0.55 ? '#171717' : '#ffffff';
1847
+ }
1848
+ function titleCase(str) {
1849
+ return str.replace(/-/g, ' ').replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase());
1850
+ }
1851
+ //#endregion
1852
+ //#region ---- Surface variants (palette-synchronized) ----
1853
+ /**
1854
+ * Seven tonal steps per semantic color. Backgrounds are mixed in RGB using the **same palette’s**
1855
+ * canvas `light` and `dark` as poles so swatches stay aligned with `AXPThemePaletteProvider` data.
1856
+ */
1857
+ const SURFACE_VARIANTS = ['lightest', 'lighter', 'light', 'surface', 'dark', 'darker', 'darkest'];
1858
+ function styleTitlePrefix(style) {
1859
+ const accentMatch = /^accent(\d+)$/.exec(style);
1860
+ if (accentMatch) {
1861
+ return `Accent ${accentMatch[1]}`;
1862
+ }
1863
+ return titleCase(style);
1864
+ }
1865
+ function surfaceVariantTitle(style, variant) {
1866
+ if (variant === 'surface') {
1867
+ return styleTitlePrefix(style);
1868
+ }
1869
+ return `${styleTitlePrefix(style)} ${titleCase(variant)}`;
1870
+ }
1871
+ /** Tailwind utility triplet stored by theme-color-chooser and outcome display rules. */
1872
+ function buildThemeSurfaceColorTriplet(styleKey, variant) {
1873
+ return {
1874
+ color: `ax-text-${styleKey}-on-${variant}`,
1875
+ background: `ax-bg-${styleKey}-${variant}`,
1876
+ border: `ax-border-${styleKey}-${variant}`,
1877
+ };
1878
+ }
1879
+ /** Ordered `"foreground background border"` string for theme-color-chooser values. */
1880
+ function buildThemeSurfaceColorValue(styleKey, variant = 'lightest') {
1881
+ const triplet = buildThemeSurfaceColorTriplet(styleKey, variant);
1882
+ return `${triplet.color} ${triplet.background} ${triplet.border}`;
1883
+ }
1884
+ function pushVariantScale(entries, styleKey, _baseHex, _canvas) {
1885
+ for (const variant of SURFACE_VARIANTS) {
1886
+ const name = `${styleKey}-${variant}`;
1887
+ entries.push({
1888
+ title: surfaceVariantTitle(styleKey, variant),
1889
+ name,
1890
+ ...buildThemeSurfaceColorTriplet(styleKey, variant),
1891
+ });
1892
+ }
1893
+ }
1894
+ function pushFlatSwatch(entries, title, name, hex) {
1895
+ const color = contrastForeground(hex);
1896
+ entries.push({ title, name, color, background: hex, border: hex });
1897
+ }
1898
+ /**
1899
+ * Builds the full chooser list from a single `AXPThemePalette` (colors object only).
1900
+ */
1901
+ function buildColorsFromThemePalette(palette) {
1902
+ const colors = palette.colors;
1903
+ const canvas = { light: colors.light, dark: colors.dark };
1904
+ const entries = [];
1905
+ const core = ['primary', 'secondary', 'success', 'warning', 'danger'];
1906
+ for (const key of core) {
1907
+ pushVariantScale(entries, key, colors[key], canvas);
1908
+ }
1909
+ const neutral = colors.neutral;
1910
+ if (neutral) {
1911
+ pushVariantScale(entries, 'neutral', neutral, canvas);
1912
+ }
1913
+ colors.accents.forEach((hex, index) => {
1914
+ pushVariantScale(entries, `accent${index + 1}`, hex, canvas);
1915
+ });
1916
+ pushFlatSwatch(entries, 'Canvas Light', 'canvas-light', colors.light);
1917
+ pushFlatSwatch(entries, 'Canvas Dark', 'canvas-dark', colors.dark);
1918
+ return entries;
1919
+ }
1920
+ //#endregion
1921
+ //#region ---- Service ----
1922
+ class AXPColorChooserService {
1923
+ constructor() {
1924
+ this.themeStore = inject(AXPLayoutThemeService);
1925
+ this.palettePromise = inject(AXP_THEME_PALETTE_PROVIDER);
1926
+ this.cacheKey = null;
1927
+ this.cache = null;
1928
+ }
1929
+ async getColors() {
1930
+ const paletteName = this.themeStore.currentPalette();
1931
+ if (this.cache && this.cacheKey === paletteName) {
1932
+ return this.cache;
1933
+ }
1934
+ const provider = await this.palettePromise;
1935
+ const list = await provider.getList();
1936
+ const palette = list.find((p) => p.name === paletteName) ?? list.find((p) => p.name === 'default') ?? list[0] ?? null;
1937
+ const colors = palette ? buildColorsFromThemePalette(palette) : [];
1938
+ this.cacheKey = paletteName;
1939
+ this.cache = colors;
1940
+ return colors;
1941
+ }
1942
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorChooserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1943
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorChooserService, providedIn: 'root' }); }
1944
+ }
1945
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorChooserService, decorators: [{
1946
+ type: Injectable,
1947
+ args: [{
1948
+ providedIn: 'root',
1949
+ }]
1950
+ }] });
1951
+
1952
+ class AXPColorChooserWidgetEditComponent extends AXPValueWidgetComponent {
1953
+ constructor() {
1954
+ super(...arguments);
1955
+ this.colorService = inject(AXPColorChooserService);
1956
+ this.colors = signal([], ...(ngDevMode ? [{ debugName: "colors" }] : /* istanbul ignore next */ []));
1957
+ this.placeholder = computed(() => this.options()['placeholder'] ?? '', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
1958
+ this.selectedColor = computed(() => {
1959
+ const value = this.getValue();
1960
+ const fallbackName = () => this.colors()[0]?.name;
1961
+ if (!value) {
1962
+ return fallbackName();
1963
+ }
1964
+ if (typeof value === 'string') {
1965
+ const parsed = this.parseStringValue(value);
1966
+ if (parsed) {
1967
+ return parsed;
1968
+ }
1969
+ return fallbackName();
1970
+ }
1971
+ return value.name;
1972
+ }, ...(ngDevMode ? [{ debugName: "selectedColor" }] : /* istanbul ignore next */ []));
1973
+ }
1974
+ async ngOnInit() {
1975
+ const allColors = await this.colorService.getColors();
1976
+ this.colors.set(allColors);
1977
+ super.ngOnInit();
1978
+ }
1979
+ handleValueChange(event) {
1980
+ if (event.isUserInteraction) {
1981
+ if (!event.value) {
1982
+ this.setValue(undefined);
1983
+ return;
1984
+ }
1985
+ const color = event.component.selectedItems[0];
1986
+ // Always store as ordered string: "color background border"
1987
+ const stringValue = `${color.color} ${color.background} ${color.border}`;
1988
+ this.setValue(stringValue);
1989
+ }
1990
+ }
1991
+ isHexSwatch(color) {
1992
+ return color.background.startsWith('#');
1993
+ }
1994
+ parseStringValue(value) {
1995
+ const parts = value.trim().split(/\s+/);
1996
+ if (parts.length !== 3) {
1997
+ return null;
1998
+ }
1999
+ const [color, background, border] = parts;
2000
+ const exactMatch = this.colors().find((entry) => entry.color === color && entry.background === background && entry.border === border);
2001
+ if (exactMatch) {
2002
+ return exactMatch.name;
2003
+ }
2004
+ const backgroundMatch = /^ax-bg-(.+)-(.+)$/.exec(background);
2005
+ if (backgroundMatch) {
2006
+ const name = `${backgroundMatch[1]}-${backgroundMatch[2]}`;
2007
+ if (this.colors().some((entry) => entry.name === name)) {
2008
+ return name;
2009
+ }
2010
+ }
2011
+ return null;
2012
+ }
2013
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorChooserWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2014
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPColorChooserWidgetEditComponent, isStandalone: true, selector: "ax-color-chooser-widget", host: { classAttribute: "ax-block ax-flex-1 ax-w-full" }, usesInheritance: true, ngImport: i0, template: `
2015
+ <ax-form [messageStyle]="'float'" [updateOn]="'change'">
2016
+ <ax-form-field>
2017
+ <ax-select-box
2018
+ [dataSource]="colors()"
2019
+ textField="title"
2020
+ valueField="name"
2021
+ [placeholder]="placeholder()"
2022
+ [itemTemplate]="customItemTemplate"
2023
+ [ngModel]="selectedColor()"
2024
+ (onValueChanged)="handleValueChange($event)"
2025
+ [selectedTemplate]="customItemTemplate"
2026
+ >
2027
+ <ng-template #customItemTemplate let-item>
2028
+ <div class="ax-flex ax-items-center ax-gap-2 ax-p-2">
2029
+ @if (isHexSwatch(item.data)) {
2030
+ <div
2031
+ class="ax-w-6 ax-h-6 ax-rounded ax-flex ax-items-center ax-justify-center ax-border ax-border-solid"
2032
+ [style.background-color]="item.data.background"
2033
+ [style.border-color]="item.data.border"
2034
+ [style.color]="item.data.color"
2035
+ >
2036
+ <span>Aa</span>
2037
+ </div>
2038
+ } @else {
2039
+ <div
2040
+ class="ax-w-6 ax-h-6 ax-rounded ax-flex ax-items-center ax-justify-center ax-border ax-border-dashed ax-border-black dark:ax-border-white"
2041
+ [class]="item.data.background"
2042
+ >
2043
+ <span [class]="item.data.color">Aa</span>
2044
+ </div>
2045
+ }
2046
+ <span>{{ item.data.title }}</span>
2047
+ </div>
2048
+ </ng-template>
2049
+ <ax-search-box look="fill"></ax-search-box>
2050
+ <ax-validation-rule message="field can't be empty" rule="required"></ax-validation-rule>
2051
+ </ax-select-box>
2052
+ </ax-form-field>
2053
+ </ax-form>
2054
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i1$2.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$2.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i2$2.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i2$2.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i1$1.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2055
+ }
2056
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorChooserWidgetEditComponent, decorators: [{
2057
+ type: Component,
2058
+ args: [{
2059
+ selector: 'ax-color-chooser-widget',
2060
+ template: `
2061
+ <ax-form [messageStyle]="'float'" [updateOn]="'change'">
2062
+ <ax-form-field>
2063
+ <ax-select-box
2064
+ [dataSource]="colors()"
2065
+ textField="title"
2066
+ valueField="name"
2067
+ [placeholder]="placeholder()"
2068
+ [itemTemplate]="customItemTemplate"
2069
+ [ngModel]="selectedColor()"
2070
+ (onValueChanged)="handleValueChange($event)"
2071
+ [selectedTemplate]="customItemTemplate"
2072
+ >
2073
+ <ng-template #customItemTemplate let-item>
2074
+ <div class="ax-flex ax-items-center ax-gap-2 ax-p-2">
2075
+ @if (isHexSwatch(item.data)) {
2076
+ <div
2077
+ class="ax-w-6 ax-h-6 ax-rounded ax-flex ax-items-center ax-justify-center ax-border ax-border-solid"
2078
+ [style.background-color]="item.data.background"
2079
+ [style.border-color]="item.data.border"
2080
+ [style.color]="item.data.color"
2081
+ >
2082
+ <span>Aa</span>
2083
+ </div>
2084
+ } @else {
2085
+ <div
2086
+ class="ax-w-6 ax-h-6 ax-rounded ax-flex ax-items-center ax-justify-center ax-border ax-border-dashed ax-border-black dark:ax-border-white"
2087
+ [class]="item.data.background"
2088
+ >
2089
+ <span [class]="item.data.color">Aa</span>
2090
+ </div>
2091
+ }
2092
+ <span>{{ item.data.title }}</span>
2093
+ </div>
2094
+ </ng-template>
2095
+ <ax-search-box look="fill"></ax-search-box>
2096
+ <ax-validation-rule message="field can't be empty" rule="required"></ax-validation-rule>
2097
+ </ax-select-box>
2098
+ </ax-form-field>
2099
+ </ax-form>
2100
+ `,
2101
+ host: {
2102
+ class: 'ax-block ax-flex-1 ax-w-full',
2103
+ },
2104
+ imports: [AXSelectBoxModule, AXFormModule, CommonModule, AXSearchBoxModule, AXButtonModule, FormsModule],
2105
+ changeDetection: ChangeDetectionStrategy.OnPush,
2106
+ }]
2107
+ }] });
2108
+
2109
+ var themeColorChooserEdit_component = /*#__PURE__*/Object.freeze({
2110
+ __proto__: null,
2111
+ AXPColorChooserWidgetEditComponent: AXPColorChooserWidgetEditComponent
2112
+ });
2113
+
2114
+ const AXPThemeColorChooserWidgetConfig = {
2115
+ name: 'theme-color-chooser',
2116
+ title: 'Theme Color Chooser',
2117
+ icon: 'fa-light fa-palette',
2118
+ type: 'editor',
2119
+ categories: AXP_WIDGETS_LAYOUT_CATEGORY,
2120
+ properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
2121
+ components: {
2122
+ edit: {
2123
+ component: () => Promise.resolve().then(function () { return themeColorChooserEdit_component; }).then((c) => c.AXPColorChooserWidgetEditComponent),
2124
+ },
2125
+ column: {
2126
+ component: () => import('./acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-BXl8u4Yp.mjs').then((c) => c.AXPColorChooserWidgetColumnComponent),
2127
+ },
2128
+ view: {
2129
+ component: () => import('./acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-i2sOOkVj.mjs').then((c) => c.AXPColorChooserWidgetViewComponent),
2130
+ },
2131
+ },
2132
+ };
2133
+
2134
+ class AXPThemeModeChooserWidgetComponent extends AXPValueWidgetComponent {
2135
+ constructor() {
2136
+ super(...arguments);
2137
+ this.modes = signal([
2138
+ { id: AXPThemeMode.Light, icon: 'fa-light fa-brightness' },
2139
+ { id: AXPThemeMode.Dark, icon: 'fa-light fa-moon' },
2140
+ { id: AXPThemeMode.System, icon: 'fa-light fa-desktop' },
2141
+ ], ...(ngDevMode ? [{ debugName: "modes" }] : /* istanbul ignore next */ []));
2142
+ this.selectedMode = signal(null, ...(ngDevMode ? [{ debugName: "selectedMode" }] : /* istanbul ignore next */ []));
2143
+ this.#eff = effect(() => {
2144
+ if (this.getValue()) {
2145
+ this.selectedMode.set(this.modes().find((m) => m.id === this.getValue()) ?? this.modes()[0]);
2146
+ }
2147
+ }, ...(ngDevMode ? [{ debugName: "#eff" }] : /* istanbul ignore next */ []));
2148
+ }
2149
+ #eff;
2150
+ onModeClick(mode) {
2151
+ this.setValue(mode.id);
2152
+ }
2153
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemeModeChooserWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2154
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPThemeModeChooserWidgetComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
2155
+ @for (mode of modes(); track mode.id) {
2156
+ <div (click)="onModeClick(mode)" [class.--selected]="mode.id === selectedMode()?.id">
2157
+ <div>
2158
+ <i [class]="mode.icon"></i>
2159
+ </div>
2160
+ <span>{{ '@layout:terms.theme-modes.' + mode.id | translate | async }}</span>
2161
+ </div>
2162
+ }
2163
+ `, 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 }); }
2164
+ }
2165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemeModeChooserWidgetComponent, decorators: [{
2166
+ type: Component,
2167
+ args: [{ template: `
2168
+ @for (mode of modes(); track mode.id) {
2169
+ <div (click)="onModeClick(mode)" [class.--selected]="mode.id === selectedMode()?.id">
2170
+ <div>
2171
+ <i [class]="mode.icon"></i>
2172
+ </div>
2173
+ <span>{{ '@layout:terms.theme-modes.' + mode.id | translate | async }}</span>
2174
+ </div>
2175
+ }
2176
+ `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, AXSelectionCdkModule, AXTranslationModule], 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"] }]
2177
+ }] });
2178
+
2179
+ var themeModeChooserWidget_component = /*#__PURE__*/Object.freeze({
2180
+ __proto__: null,
2181
+ AXPThemeModeChooserWidgetComponent: AXPThemeModeChooserWidgetComponent
2182
+ });
2183
+
2184
+ const AXPThemeModeChooserWidget = {
2185
+ name: "theme-mode-chooser",
2186
+ title: "Theme Mode Chooser",
2187
+ icon: "fa-light fa-square",
2188
+ type: 'editor',
2189
+ categories: AXP_WIDGETS_LAYOUT_CATEGORY,
2190
+ properties: [
2191
+ AXP_NAME_PROPERTY,
2192
+ AXP_DATA_PATH_PROPERTY,
2193
+ AXP_DISABLED_PROPERTY,
2194
+ ],
2195
+ components: {
2196
+ edit: {
2197
+ component: () => Promise.resolve().then(function () { return themeModeChooserWidget_component; }).then((c) => c.AXPThemeModeChooserWidgetComponent),
2198
+ },
2199
+ }
2200
+ };
2201
+
2202
+ class AXPThemePaletteChooserWidgetComponent extends AXPValueWidgetComponent {
2203
+ constructor() {
2204
+ super(...arguments);
2205
+ this.paletteService = inject(AXP_THEME_PALETTE_PROVIDER);
2206
+ this.palettes = signal([], ...(ngDevMode ? [{ debugName: "palettes" }] : /* istanbul ignore next */ []));
2207
+ this.selectedPalette = signal(null, ...(ngDevMode ? [{ debugName: "selectedPalette" }] : /* istanbul ignore next */ []));
2208
+ this.#eff = effect(() => {
2209
+ if (this.getValue()) {
2210
+ this.selectedPalette.set(this.palettes().find((p) => p.name === this.getValue()) ??
2211
+ this.palettes().find((p) => p.name === 'default') ??
2212
+ this.palettes()[0]);
2213
+ }
2214
+ }, ...(ngDevMode ? [{ debugName: "#eff" }] : /* istanbul ignore next */ []));
2215
+ }
2216
+ #eff;
2217
+ async ngOnInit() {
2218
+ super.ngOnInit();
2219
+ const palletsProviderInstance = await this.paletteService;
2220
+ this.palettes.set(await palletsProviderInstance.getList());
2221
+ }
2222
+ onPaletteClick(palette) {
2223
+ this.setValue(palette.name);
2224
+ }
2225
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemePaletteChooserWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2226
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPThemePaletteChooserWidgetComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
2227
+ @for (palette of palettes(); track palette.name) {
2228
+ <div (click)="onPaletteClick(palette)" [class.--selected]="palette.name === selectedPalette()?.name">
2229
+ <span>{{ palette.title }}</span>
2230
+ <div>
2231
+ <div [style.background-color]="palette.colors.primary" class="ax-end-7 ax-z-[2]"></div>
2232
+ <div [style.background-color]="palette.colors.secondary" class="ax-end-3.5 ax-z-[1]"></div>
2233
+ <div [style.background-color]="palette.colors.accents[0]" class="ax-end-0 ax-z-0"></div>
2234
+ </div>
2235
+ </div>
2236
+ }
2237
+ `, isInline: true, styles: [":host{display:flex;width:100%;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{height:3rem;min-width:100%}@media(min-width:768px){:host>div{min-width:16rem}}:host>div>div{position:relative;height:100%;width:fit-content}:host>div>div div{position:absolute;height:2rem;width:2rem;border-radius:9999px;border-width:1px;border-color:#ffffff80;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectionCdkModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2238
+ }
2239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemePaletteChooserWidgetComponent, decorators: [{
2240
+ type: Component,
2241
+ args: [{ template: `
2242
+ @for (palette of palettes(); track palette.name) {
2243
+ <div (click)="onPaletteClick(palette)" [class.--selected]="palette.name === selectedPalette()?.name">
2244
+ <span>{{ palette.title }}</span>
2245
+ <div>
2246
+ <div [style.background-color]="palette.colors.primary" class="ax-end-7 ax-z-[2]"></div>
2247
+ <div [style.background-color]="palette.colors.secondary" class="ax-end-3.5 ax-z-[1]"></div>
2248
+ <div [style.background-color]="palette.colors.accents[0]" class="ax-end-0 ax-z-0"></div>
2249
+ </div>
2250
+ </div>
2251
+ }
2252
+ `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, AXSelectionCdkModule], styles: [":host{display:flex;width:100%;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{height:3rem;min-width:100%}@media(min-width:768px){:host>div{min-width:16rem}}:host>div>div{position:relative;height:100%;width:fit-content}:host>div>div div{position:absolute;height:2rem;width:2rem;border-radius:9999px;border-width:1px;border-color:#ffffff80;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}\n"] }]
2253
+ }] });
2254
+
2255
+ var themePaletteChooserWidget_component = /*#__PURE__*/Object.freeze({
2256
+ __proto__: null,
2257
+ AXPThemePaletteChooserWidgetComponent: AXPThemePaletteChooserWidgetComponent
2258
+ });
2259
+
2260
+ const AXPThemePaletteChooserWidget = {
2261
+ name: "theme-palette-chooser",
2262
+ title: "Theme Palette Chooser",
2263
+ icon: "fa-light fa-square",
2264
+ type: 'editor',
2265
+ categories: AXP_WIDGETS_LAYOUT_CATEGORY,
2266
+ properties: [
2267
+ AXP_NAME_PROPERTY,
2268
+ AXP_DATA_PATH_PROPERTY,
2269
+ AXP_DISABLED_PROPERTY,
2270
+ ],
2271
+ components: {
2272
+ edit: {
2273
+ component: () => Promise.resolve().then(function () { return themePaletteChooserWidget_component; }).then((c) => c.AXPThemePaletteChooserWidgetComponent),
2274
+ },
2275
+ }
2276
+ };
2277
+
2278
+ //#endregion
2279
+ //#region ---- Theme Widgets Provider ----
2280
+ const WIDGETS = [
2281
+ AXPThemePaletteChooserWidget,
2282
+ AXPThemeModeChooserWidget,
2283
+ AXPMenuOrientationChooserWidget,
2284
+ AXPFontSizeChooserWidget,
2285
+ AXPFontStyleChooserWidget,
2286
+ AXPIconChooserWidget,
2287
+ AXPThemeColorChooserWidgetConfig,
2288
+ ];
2289
+ class AXPThemesSharedWidgetsProvider {
2290
+ getWidgets() {
2291
+ return WIDGETS;
2292
+ }
2293
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemesSharedWidgetsProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2294
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemesSharedWidgetsProvider }); }
2295
+ }
2296
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemesSharedWidgetsProvider, decorators: [{
2297
+ type: Injectable
2298
+ }] });
2299
+
2300
+ class AXPThemesSharedModule {
2301
+ constructor(appInitService, injector) {
2302
+ const service = injector.get(AXPLayoutThemeService);
2303
+ appInitService.registerTask({
2304
+ name: 'layout-theme',
2305
+ statusText: '@layout:app-startup.applying-theme-settings',
2306
+ priority: 100,
2307
+ run: async () => {
2308
+ await service.loadSettings();
2309
+ },
2310
+ });
2311
+ }
2312
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemesSharedModule, deps: [{ token: i1$3.AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
2313
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXPThemesSharedModule, imports: [i1$3.AXPComponentSlotModule, AXPWidgetCoreModule] }); }
2314
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemesSharedModule, providers: [
2315
+ { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXPThemesSharedWidgetsProvider, multi: true },
2316
+ {
2317
+ provide: AXP_SETTING_DEFINITION_PROVIDER,
2318
+ useFactory: async () => {
2319
+ const injector = inject(Injector);
2320
+ const provider = (await import('./acorex-platform-framework-client-themes-shared-settings.provider-DEL2YOTP.mjs')).AXPThemeSettingProvider;
2321
+ return new provider(injector);
2322
+ },
2323
+ multi: true,
2324
+ },
2325
+ ...provideDefaultIconChooser(),
2326
+ ], imports: [AXPComponentSlotModule.forRoot({
2327
+ 'root-header-end': [
2328
+ {
2329
+ priority: 50,
2330
+ name: 'theme',
2331
+ component: AXPThemeSlotComponent,
2332
+ },
2333
+ ],
2334
+ }),
2335
+ AXPWidgetCoreModule] }); }
2336
+ }
2337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPThemesSharedModule, decorators: [{
2338
+ type: NgModule,
2339
+ args: [{
2340
+ imports: [
2341
+ AXPComponentSlotModule.forRoot({
2342
+ 'root-header-end': [
2343
+ {
2344
+ priority: 50,
2345
+ name: 'theme',
2346
+ component: AXPThemeSlotComponent,
2347
+ },
2348
+ ],
2349
+ }),
2350
+ AXPWidgetCoreModule,
2351
+ ],
2352
+ exports: [],
2353
+ declarations: [],
2354
+ providers: [
2355
+ { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXPThemesSharedWidgetsProvider, multi: true },
2356
+ {
2357
+ provide: AXP_SETTING_DEFINITION_PROVIDER,
2358
+ useFactory: async () => {
2359
+ const injector = inject(Injector);
2360
+ const provider = (await import('./acorex-platform-framework-client-themes-shared-settings.provider-DEL2YOTP.mjs')).AXPThemeSettingProvider;
2361
+ return new provider(injector);
2362
+ },
2363
+ multi: true,
2364
+ },
2365
+ ...provideDefaultIconChooser(),
2366
+ ],
2367
+ }]
2368
+ }], ctorParameters: () => [{ type: i1$3.AXPAppStartUpService }, { type: i0.Injector }] });
2369
+
2370
+ /**
2371
+ * Generated bundle index. Do not edit.
2372
+ */
2373
+
2374
+ export { AXPLayoutThemeService, AXPMenuOrientation, AXPMenuVerticalMode, AXPSideMenuState, AXPThemeLayoutSetting, AXPThemeMode, AXPThemePaletteProviderDefault, AXPThemeSlotComponent, AXPThemesSharedModule, AXP_SIDE_MENU_COMPACT_WIDTH, AXP_SIDE_MENU_FULL_DEFAULT_WIDTH, AXP_THEME_PALETTE_PROVIDER };
2375
+ //# sourceMappingURL=acorex-platform-framework-client-themes-shared.mjs.map