@geoit/ui 0.0.8 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/ai/AGENTS.md +4 -0
  2. package/ai/README.md +4 -1
  3. package/ai/catalog.json +202 -56
  4. package/ai/components/geo-accordion.md +92 -0
  5. package/ai/components/geo-detail-view.md +91 -0
  6. package/ai/components/geo-map-admin-filter.md +0 -1
  7. package/ai/components/geo-map-legend.md +0 -1
  8. package/ai/components/geo-map-shell.md +3 -7
  9. package/ai/components/geo-switch.md +76 -0
  10. package/ai/components/geo-tree.md +0 -2
  11. package/ai/mockup.html +2 -2
  12. package/esm2022/lib/figma/geo-accordion/geo-accordion.component.mjs +67 -0
  13. package/esm2022/lib/figma/geo-accordion/geo-accordion.types.mjs +2 -0
  14. package/esm2022/lib/figma/geo-chart/geo-chart.component.mjs +3 -14
  15. package/esm2022/lib/figma/geo-detail-view/geo-detail-view.component.mjs +47 -0
  16. package/esm2022/lib/figma/geo-detail-view/geo-detail-view.types.mjs +2 -0
  17. package/esm2022/lib/figma/geo-list-page/geo-list-page.component.mjs +3 -3
  18. package/esm2022/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.mjs +3 -5
  19. package/esm2022/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.mjs +3 -3
  20. package/esm2022/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.mjs +3 -3
  21. package/esm2022/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.mjs +3 -5
  22. package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.mjs +16 -39
  23. package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.util.mjs +38 -0
  24. package/esm2022/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.mjs +3 -3
  25. package/esm2022/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.mjs +2 -2
  26. package/esm2022/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.mjs +3 -3
  27. package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +23 -20
  28. package/esm2022/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.mjs +3 -3
  29. package/esm2022/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.mjs +3 -3
  30. package/esm2022/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.mjs +3 -3
  31. package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +5 -5
  32. package/esm2022/lib/figma/geo-switch/geo-switch.component.mjs +44 -0
  33. package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +3 -17
  34. package/esm2022/lib/figma/index.mjs +6 -1
  35. package/fesm2022/geoit-ui.mjs +262 -130
  36. package/fesm2022/geoit-ui.mjs.map +1 -1
  37. package/lib/figma/geo-accordion/geo-accordion.component.d.ts +34 -0
  38. package/lib/figma/geo-accordion/geo-accordion.types.d.ts +7 -0
  39. package/lib/figma/geo-chart/geo-chart.component.d.ts +0 -9
  40. package/lib/figma/geo-detail-view/geo-detail-view.component.d.ts +30 -0
  41. package/lib/figma/geo-detail-view/geo-detail-view.types.d.ts +8 -0
  42. package/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.d.ts +1 -3
  43. package/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.d.ts +1 -3
  44. package/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.util.d.ts +16 -0
  45. package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +6 -14
  46. package/lib/figma/geo-map/geo-map.constants.d.ts +3 -3
  47. package/lib/figma/geo-switch/geo-switch.component.d.ts +25 -0
  48. package/lib/figma/geo-tree/geo-tree.component.d.ts +1 -5
  49. package/lib/figma/index.d.ts +5 -0
  50. package/package.json +1 -1
@@ -6,11 +6,11 @@ import { NzAnchorModule } from 'ng-zorro-antd/anchor';
6
6
  import { NzAutocompleteModule } from 'ng-zorro-antd/auto-complete';
7
7
  import { NzAvatarModule } from 'ng-zorro-antd/avatar';
8
8
  import { NzBackTopModule } from 'ng-zorro-antd/back-top';
9
- import * as i1$7 from 'ng-zorro-antd/badge';
9
+ import * as i1$8 from 'ng-zorro-antd/badge';
10
10
  import { NzBadgeModule } from 'ng-zorro-antd/badge';
11
11
  import * as i2 from 'ng-zorro-antd/breadcrumb';
12
12
  import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';
13
- import * as i1$b from 'ng-zorro-antd/button';
13
+ import * as i1$d from 'ng-zorro-antd/button';
14
14
  import { NzButtonModule } from 'ng-zorro-antd/button';
15
15
  import { NzCalendarModule } from 'ng-zorro-antd/calendar';
16
16
  import { NzCardModule } from 'ng-zorro-antd/card';
@@ -18,6 +18,7 @@ import { NzCarouselModule } from 'ng-zorro-antd/carousel';
18
18
  import { NzCascaderModule } from 'ng-zorro-antd/cascader';
19
19
  import * as i1$3 from 'ng-zorro-antd/checkbox';
20
20
  import { NzCheckboxModule } from 'ng-zorro-antd/checkbox';
21
+ import * as i1$a from 'ng-zorro-antd/collapse';
21
22
  import { NzCollapseModule } from 'ng-zorro-antd/collapse';
22
23
  import { NzCommentModule } from 'ng-zorro-antd/comment';
23
24
  import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation';
@@ -26,6 +27,7 @@ import * as i3$1 from 'ng-zorro-antd/core/wave';
26
27
  import { NzWaveModule } from 'ng-zorro-antd/core/wave';
27
28
  import * as i2$1 from 'ng-zorro-antd/date-picker';
28
29
  import { NzDatePickerModule } from 'ng-zorro-antd/date-picker';
30
+ import * as i1$e from 'ng-zorro-antd/descriptions';
29
31
  import { NzDescriptionsModule } from 'ng-zorro-antd/descriptions';
30
32
  import { NzDividerModule } from 'ng-zorro-antd/divider';
31
33
  import { NzDrawerModule } from 'ng-zorro-antd/drawer';
@@ -49,7 +51,7 @@ import * as i3 from 'ng-zorro-antd/modal';
49
51
  import { NzModalModule } from 'ng-zorro-antd/modal';
50
52
  import { NzNotificationModule, NzNotificationService } from 'ng-zorro-antd/notification';
51
53
  import { NzPageHeaderModule } from 'ng-zorro-antd/page-header';
52
- import * as i1$6 from 'ng-zorro-antd/pagination';
54
+ import * as i1$7 from 'ng-zorro-antd/pagination';
53
55
  import { NzPaginationModule } from 'ng-zorro-antd/pagination';
54
56
  import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';
55
57
  import { NzPopoverModule } from 'ng-zorro-antd/popover';
@@ -66,10 +68,11 @@ import { NzSliderModule } from 'ng-zorro-antd/slider';
66
68
  import { NzSpinModule } from 'ng-zorro-antd/spin';
67
69
  import { NzStatisticModule } from 'ng-zorro-antd/statistic';
68
70
  import { NzStepsModule } from 'ng-zorro-antd/steps';
71
+ import * as i1$5 from 'ng-zorro-antd/switch';
69
72
  import { NzSwitchModule } from 'ng-zorro-antd/switch';
70
- import * as i1$9 from 'ng-zorro-antd/table';
73
+ import * as i1$b from 'ng-zorro-antd/table';
71
74
  import { NzTableModule } from 'ng-zorro-antd/table';
72
- import * as i1$8 from 'ng-zorro-antd/tabs';
75
+ import * as i1$9 from 'ng-zorro-antd/tabs';
73
76
  import { NzTabsModule } from 'ng-zorro-antd/tabs';
74
77
  import { NzTagModule } from 'ng-zorro-antd/tag';
75
78
  import { NzTimePickerModule } from 'ng-zorro-antd/time-picker';
@@ -77,7 +80,7 @@ import { NzTimelineModule } from 'ng-zorro-antd/timeline';
77
80
  import * as i1$2 from 'ng-zorro-antd/tooltip';
78
81
  import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
79
82
  import { NzTransferModule } from 'ng-zorro-antd/transfer';
80
- import * as i1$a from 'ng-zorro-antd/tree';
83
+ import * as i1$c from 'ng-zorro-antd/tree';
81
84
  import { NzTreeModule } from 'ng-zorro-antd/tree';
82
85
  import { NzTreeViewModule } from 'ng-zorro-antd/tree-view';
83
86
  import { NzTreeSelectModule } from 'ng-zorro-antd/tree-select';
@@ -93,7 +96,7 @@ import * as i1$1 from '@angular/router';
93
96
  import { RouterModule } from '@angular/router';
94
97
  import * as i1$4 from '@angular/forms';
95
98
  import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
96
- import * as i1$5 from 'ng-zorro-antd/core/transition-patch';
99
+ import * as i1$6 from 'ng-zorro-antd/core/transition-patch';
97
100
  import { Subscription } from 'rxjs';
98
101
  import { NzConfigService } from 'ng-zorro-antd/core/config';
99
102
  import GeoJSON from 'ol/format/GeoJSON';
@@ -683,6 +686,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
683
686
  args: [{ selector: 'geo-checkbox', standalone: true, imports: [NgZorroAntdModule, FormsModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<label\n nz-checkbox\n class=\"geo-checkbox\"\n [nzDisabled]=\"disabled()\"\n [nzIndeterminate]=\"indeterminate()\"\n [ngModel]=\"checked()\"\n (ngModelChange)=\"onChange($event)\"\n>{{ label() }}</label>\n", styles: ["geo-checkbox{display:inline-block;--ant-primary-color: var(--geo-color-primary-default);--ant-primary-color-hover: var(--geo-color-primary-hover);--ant-primary-color-active: var(--geo-color-primary-hover)}geo-checkbox .geo-checkbox{font-size:14px;color:var(--geo-color-neutral-900)}geo-checkbox .ant-checkbox:not(.ant-checkbox-disabled):hover .ant-checkbox-inner{border-color:var(--geo-color-primary-default)!important}geo-checkbox .ant-checkbox-checked:not(.ant-checkbox-disabled) .ant-checkbox-inner{background-color:var(--geo-color-primary-default)!important;border-color:var(--geo-color-primary-default)!important}geo-checkbox .ant-checkbox-checked:not(.ant-checkbox-disabled):after{border-color:var(--geo-color-primary-default)!important}geo-checkbox .ant-checkbox-indeterminate:not(.ant-checkbox-disabled) .ant-checkbox-inner{background-color:var(--geo-color-neutral-white)!important;border-color:var(--geo-color-primary-default)!important}geo-checkbox .ant-checkbox-indeterminate:not(.ant-checkbox-disabled) .ant-checkbox-inner:after{background-color:var(--geo-color-primary-default)!important}geo-checkbox .ant-checkbox-input:focus+.ant-checkbox-inner,geo-checkbox .ant-checkbox-input:focus-visible+.ant-checkbox-inner{border-color:var(--geo-color-primary-default)!important}geo-checkbox .ant-checkbox-checked:not(.ant-checkbox-disabled):hover .ant-checkbox-inner{background-color:var(--geo-color-primary-hover)!important;border-color:var(--geo-color-primary-hover)!important}geo-checkbox .ant-checkbox-indeterminate:not(.ant-checkbox-disabled):hover .ant-checkbox-inner{border-color:var(--geo-color-primary-hover)!important}geo-checkbox .ant-checkbox-indeterminate:not(.ant-checkbox-disabled):hover .ant-checkbox-inner:after{background-color:var(--geo-color-primary-hover)!important}geo-checkbox .ant-checkbox-disabled .ant-checkbox-inner{background-color:var(--geo-color-neutral-100)!important;border-color:var(--geo-color-neutral-300)!important}geo-checkbox .ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{border-color:#00000040!important}geo-checkbox .ant-checkbox-disabled.ant-checkbox-indeterminate .ant-checkbox-inner:after{background-color:#00000040!important}\n"] }]
684
687
  }] });
685
688
 
689
+ /**
690
+ * On/off toggle with optional trailing label.
691
+ *
692
+ * @summary Công tắc bật/tắt (nz-switch); nhãn tùy chọn bên cạnh.
693
+ * @whenToUse Bật/tắt trạng thái tức thì (không cần Lưu) — ví dụ hiển thị/ẩn, kích hoạt.
694
+ * @doNotUseWhen Lựa chọn trong form cần submit — use geo-checkbox.
695
+ */
696
+ class GeoSwitchComponent {
697
+ label = input('');
698
+ /** Two-way: `[(checked)]`. */
699
+ checked = model(false);
700
+ disabled = input(false);
701
+ loading = input(false);
702
+ size = input('default');
703
+ /** Text hiển thị trong pill khi bật. */
704
+ checkedLabel = input('');
705
+ /** Text hiển thị trong pill khi tắt. */
706
+ uncheckedLabel = input('');
707
+ onChange(value) {
708
+ this.checked.set(value);
709
+ }
710
+ onLabelClick() {
711
+ if (this.disabled() || this.loading()) {
712
+ return;
713
+ }
714
+ this.onChange(!this.checked());
715
+ }
716
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoSwitchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
717
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoSwitchComponent, isStandalone: true, selector: "geo-switch", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, checkedLabel: { classPropertyName: "checkedLabel", publicName: "checkedLabel", isSignal: true, isRequired: false, transformFunction: null }, uncheckedLabel: { classPropertyName: "uncheckedLabel", publicName: "uncheckedLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, host: { properties: { "class.geo-switch-host--disabled": "disabled()" }, classAttribute: "geo-switch-host" }, ngImport: i0, template: "<span class=\"geo-switch\">\n <nz-switch\n [ngModel]=\"checked()\"\n (ngModelChange)=\"onChange($event)\"\n [nzDisabled]=\"disabled()\"\n [nzLoading]=\"loading()\"\n [nzSize]=\"size()\"\n [nzCheckedChildren]=\"checkedLabel() || null\"\n [nzUnCheckedChildren]=\"uncheckedLabel() || null\"\n ></nz-switch>\n @if (label()) {\n <span class=\"geo-switch__label\" (click)=\"onLabelClick()\">{{ label() }}</span>\n }\n</span>\n", styles: [".geo-switch-host{display:inline-block}.geo-switch{display:inline-flex;align-items:center;gap:8px}.geo-switch__label{font-family:var(--geo-font-family);font-size:14px;line-height:20px;color:var(--geo-color-neutral-900);cursor:pointer;-webkit-user-select:none;user-select:none}.geo-switch-host--disabled .geo-switch__label{color:var(--geo-color-neutral-disabled-text);cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$5.NzSwitchComponent, selector: "nz-switch", inputs: ["nzLoading", "nzDisabled", "nzControl", "nzCheckedChildren", "nzUnCheckedChildren", "nzSize", "nzId"], exportAs: ["nzSwitch"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
718
+ }
719
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoSwitchComponent, decorators: [{
720
+ type: Component,
721
+ args: [{ selector: 'geo-switch', standalone: true, imports: [NgZorroAntdModule, FormsModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
722
+ class: 'geo-switch-host',
723
+ '[class.geo-switch-host--disabled]': 'disabled()',
724
+ }, template: "<span class=\"geo-switch\">\n <nz-switch\n [ngModel]=\"checked()\"\n (ngModelChange)=\"onChange($event)\"\n [nzDisabled]=\"disabled()\"\n [nzLoading]=\"loading()\"\n [nzSize]=\"size()\"\n [nzCheckedChildren]=\"checkedLabel() || null\"\n [nzUnCheckedChildren]=\"uncheckedLabel() || null\"\n ></nz-switch>\n @if (label()) {\n <span class=\"geo-switch__label\" (click)=\"onLabelClick()\">{{ label() }}</span>\n }\n</span>\n", styles: [".geo-switch-host{display:inline-block}.geo-switch{display:inline-flex;align-items:center;gap:8px}.geo-switch__label{font-family:var(--geo-font-family);font-size:14px;line-height:20px;color:var(--geo-color-neutral-900);cursor:pointer;-webkit-user-select:none;user-select:none}.geo-switch-host--disabled .geo-switch__label{color:var(--geo-color-neutral-disabled-text);cursor:not-allowed}\n"] }]
725
+ }] });
726
+
686
727
  class GeoConfirmModalComponent {
687
728
  visible = model(false);
688
729
  title = input('Xác nhận xoá');
@@ -712,7 +753,7 @@ class GeoConfirmModalComponent {
712
753
  this.confirm.emit();
713
754
  }
714
755
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoConfirmModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
715
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoConfirmModalComponent, isStandalone: true, selector: "geo-confirm-modal", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, highlight: { classPropertyName: "highlight", publicName: "highlight", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, cancelText: { classPropertyName: "cancelText", publicName: "cancelText", isSignal: true, isRequired: false, transformFunction: null }, confirmText: { classPropertyName: "confirmText", publicName: "confirmText", isSignal: true, isRequired: false, transformFunction: null }, confirmLoading: { classPropertyName: "confirmLoading", publicName: "confirmLoading", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, maskClosable: { classPropertyName: "maskClosable", publicName: "maskClosable", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange", confirm: "confirm", cancel: "cancel" }, ngImport: i0, template: "<nz-modal\n [nzVisible]=\"visible()\"\n [nzTitle]=\"''\"\n [nzFooter]=\"null\"\n [nzClosable]=\"false\"\n [nzMaskClosable]=\"maskClosable()\"\n [nzWidth]=\"width()\"\n nzWrapClassName=\"geo-confirm-modal-wrap\"\n nzClassName=\"geo-confirm-modal\"\n (nzVisibleChange)=\"onVisibleChange($event)\"\n>\n <ng-container *nzModalContent>\n <div class=\"geo-confirm-modal__content\">\n <div class=\"geo-confirm-modal__header\">\n <h2 class=\"geo-confirm-modal__title\">{{ title() }}</h2>\n @if (closable()) {\n <button\n type=\"button\"\n class=\"geo-confirm-modal__close\"\n aria-label=\"\u0110\u00F3ng\"\n (click)=\"onCancel()\"\n >\n <span nz-icon nzType=\"close\" nzTheme=\"outline\"></span>\n </button>\n }\n </div>\n\n <div class=\"geo-confirm-modal__body\">\n @if (hasDefaultBody()) {\n <div class=\"geo-confirm-modal__message\">\n @if (message() || highlight()) {\n <p class=\"geo-confirm-modal__paragraph\">\n @if (message()) {\n <span>{{ message() }}</span>\n }\n @if (highlight()) {\n <strong class=\"geo-confirm-modal__highlight\">\u201C{{ highlight() }}\u201D</strong>\n }\n </p>\n }\n @if (description()) {\n <p class=\"geo-confirm-modal__paragraph\">{{ description() }}</p>\n }\n </div>\n } @else {\n <div class=\"geo-confirm-modal__message\">\n <ng-content></ng-content>\n </div>\n }\n </div>\n\n <div class=\"geo-confirm-modal__footer\">\n <geo-button appearance=\"secondary\" color=\"brand\" (clicked)=\"onCancel()\">\n {{ cancelText() }}\n </geo-button>\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n [disabled]=\"confirmLoading()\"\n (clicked)=\"onConfirm()\"\n >\n {{ confirmText() }}\n </geo-button>\n </div>\n </div>\n </ng-container>\n</nz-modal>\n", styles: [".geo-confirm-modal-wrap .ant-modal-header{display:none}.geo-confirm-modal-wrap .ant-modal-content{border-radius:var(--geo-radius-lg);padding:0;overflow:hidden;box-shadow:var(--geo-shadow-md)}.geo-confirm-modal-wrap .ant-modal-body{padding:0}.geo-confirm-modal__content{display:flex;flex-direction:column;gap:17px;padding:24px;background:var(--geo-color-surface-elevated)}.geo-confirm-modal__header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:16px}.geo-confirm-modal__title{margin:0;font-size:18px;font-weight:700;line-height:normal;color:var(--geo-color-neutral-500)}.geo-confirm-modal__close{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;flex-shrink:0}.geo-confirm-modal__close:hover{color:var(--geo-color-neutral-900)}.geo-confirm-modal__body{display:flex;flex-direction:column}.geo-confirm-modal__message{display:flex;flex-direction:column;gap:8px;max-width:397px;font-size:14px;line-height:1.4;color:var(--geo-color-neutral-900)}.geo-confirm-modal__paragraph{margin:0}.geo-confirm-modal__highlight{font-weight:600}.geo-confirm-modal__footer{display:flex;align-items:center;justify-content:flex-end;gap:12px}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "directive", type: i1$5.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i1.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i3.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i3.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
756
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoConfirmModalComponent, isStandalone: true, selector: "geo-confirm-modal", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, highlight: { classPropertyName: "highlight", publicName: "highlight", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, cancelText: { classPropertyName: "cancelText", publicName: "cancelText", isSignal: true, isRequired: false, transformFunction: null }, confirmText: { classPropertyName: "confirmText", publicName: "confirmText", isSignal: true, isRequired: false, transformFunction: null }, confirmLoading: { classPropertyName: "confirmLoading", publicName: "confirmLoading", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, maskClosable: { classPropertyName: "maskClosable", publicName: "maskClosable", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange", confirm: "confirm", cancel: "cancel" }, ngImport: i0, template: "<nz-modal\n [nzVisible]=\"visible()\"\n [nzTitle]=\"''\"\n [nzFooter]=\"null\"\n [nzClosable]=\"false\"\n [nzMaskClosable]=\"maskClosable()\"\n [nzWidth]=\"width()\"\n nzWrapClassName=\"geo-confirm-modal-wrap\"\n nzClassName=\"geo-confirm-modal\"\n (nzVisibleChange)=\"onVisibleChange($event)\"\n>\n <ng-container *nzModalContent>\n <div class=\"geo-confirm-modal__content\">\n <div class=\"geo-confirm-modal__header\">\n <h2 class=\"geo-confirm-modal__title\">{{ title() }}</h2>\n @if (closable()) {\n <button\n type=\"button\"\n class=\"geo-confirm-modal__close\"\n aria-label=\"\u0110\u00F3ng\"\n (click)=\"onCancel()\"\n >\n <span nz-icon nzType=\"close\" nzTheme=\"outline\"></span>\n </button>\n }\n </div>\n\n <div class=\"geo-confirm-modal__body\">\n @if (hasDefaultBody()) {\n <div class=\"geo-confirm-modal__message\">\n @if (message() || highlight()) {\n <p class=\"geo-confirm-modal__paragraph\">\n @if (message()) {\n <span>{{ message() }}</span>\n }\n @if (highlight()) {\n <strong class=\"geo-confirm-modal__highlight\">\u201C{{ highlight() }}\u201D</strong>\n }\n </p>\n }\n @if (description()) {\n <p class=\"geo-confirm-modal__paragraph\">{{ description() }}</p>\n }\n </div>\n } @else {\n <div class=\"geo-confirm-modal__message\">\n <ng-content></ng-content>\n </div>\n }\n </div>\n\n <div class=\"geo-confirm-modal__footer\">\n <geo-button appearance=\"secondary\" color=\"brand\" (clicked)=\"onCancel()\">\n {{ cancelText() }}\n </geo-button>\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n [disabled]=\"confirmLoading()\"\n (clicked)=\"onConfirm()\"\n >\n {{ confirmText() }}\n </geo-button>\n </div>\n </div>\n </ng-container>\n</nz-modal>\n", styles: [".geo-confirm-modal-wrap .ant-modal-header{display:none}.geo-confirm-modal-wrap .ant-modal-content{border-radius:var(--geo-radius-lg);padding:0;overflow:hidden;box-shadow:var(--geo-shadow-md)}.geo-confirm-modal-wrap .ant-modal-body{padding:0}.geo-confirm-modal__content{display:flex;flex-direction:column;gap:17px;padding:24px;background:var(--geo-color-surface-elevated)}.geo-confirm-modal__header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:16px}.geo-confirm-modal__title{margin:0;font-size:18px;font-weight:700;line-height:normal;color:var(--geo-color-neutral-500)}.geo-confirm-modal__close{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;flex-shrink:0}.geo-confirm-modal__close:hover{color:var(--geo-color-neutral-900)}.geo-confirm-modal__body{display:flex;flex-direction:column}.geo-confirm-modal__message{display:flex;flex-direction:column;gap:8px;max-width:397px;font-size:14px;line-height:1.4;color:var(--geo-color-neutral-900)}.geo-confirm-modal__paragraph{margin:0}.geo-confirm-modal__highlight{font-weight:600}.geo-confirm-modal__footer{display:flex;align-items:center;justify-content:flex-end;gap:12px}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "directive", type: i1$6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i1.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i3.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i3.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
716
757
  }
717
758
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoConfirmModalComponent, decorators: [{
718
759
  type: Component,
@@ -1263,7 +1304,7 @@ class GeoFormModalComponent {
1263
1304
  }
1264
1305
  }
1265
1306
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoFormModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1266
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoFormModalComponent, isStandalone: true, selector: "geo-form-modal", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, titleUppercase: { classPropertyName: "titleUppercase", publicName: "titleUppercase", isSignal: true, isRequired: false, transformFunction: null }, okText: { classPropertyName: "okText", publicName: "okText", isSignal: true, isRequired: false, transformFunction: null }, cancelText: { classPropertyName: "cancelText", publicName: "cancelText", isSignal: true, isRequired: false, transformFunction: null }, cancelIcon: { classPropertyName: "cancelIcon", publicName: "cancelIcon", isSignal: true, isRequired: false, transformFunction: null }, cancelIconPlacement: { classPropertyName: "cancelIconPlacement", publicName: "cancelIconPlacement", isSignal: true, isRequired: false, transformFunction: null }, okIcon: { classPropertyName: "okIcon", publicName: "okIcon", isSignal: true, isRequired: false, transformFunction: null }, okIconPlacement: { classPropertyName: "okIconPlacement", publicName: "okIconPlacement", isSignal: true, isRequired: false, transformFunction: null }, secondaryOkText: { classPropertyName: "secondaryOkText", publicName: "secondaryOkText", isSignal: true, isRequired: false, transformFunction: null }, confirmLoading: { classPropertyName: "confirmLoading", publicName: "confirmLoading", isSignal: true, isRequired: false, transformFunction: null }, okDisabled: { classPropertyName: "okDisabled", publicName: "okDisabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, mask: { classPropertyName: "mask", publicName: "mask", isSignal: true, isRequired: false, transformFunction: null }, maskClosable: { classPropertyName: "maskClosable", publicName: "maskClosable", isSignal: true, isRequired: false, transformFunction: null }, keyboard: { classPropertyName: "keyboard", publicName: "keyboard", isSignal: true, isRequired: false, transformFunction: null }, centered: { classPropertyName: "centered", publicName: "centered", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, wrapClassName: { classPropertyName: "wrapClassName", publicName: "wrapClassName", isSignal: true, isRequired: false, transformFunction: null }, bodyScroll: { classPropertyName: "bodyScroll", publicName: "bodyScroll", isSignal: true, isRequired: false, transformFunction: null }, bodyMaxHeight: { classPropertyName: "bodyMaxHeight", publicName: "bodyMaxHeight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", ok: "ok", secondaryOk: "secondaryOk", cancel: "cancel", afterOpen: "afterOpen", afterClose: "afterClose" }, ngImport: i0, template: "<nz-modal\n [nzVisible]=\"open()\"\n [nzTitle]=\"''\"\n [nzFooter]=\"null\"\n [nzClosable]=\"false\"\n [nzMask]=\"mask()\"\n [nzMaskClosable]=\"maskClosable()\"\n [nzKeyboard]=\"keyboard()\"\n [nzCentered]=\"centered()\"\n [nzWidth]=\"width()\"\n [nzZIndex]=\"zIndex()\"\n [nzWrapClassName]=\"resolvedWrapClassName()\"\n [nzClassName]=\"resolvedClassName()\"\n (nzVisibleChange)=\"onOpenChange($event)\"\n (nzAfterOpen)=\"afterOpen.emit()\"\n (nzAfterClose)=\"afterClose.emit()\"\n>\n <ng-container *nzModalContent>\n <div\n class=\"geo-form-modal__content\"\n [class.geo-form-modal__content--body-scroll]=\"bodyScroll()\"\n >\n <div class=\"geo-form-modal__header\">\n <h2\n class=\"geo-form-modal__title\"\n [class.geo-form-modal__title--uppercase]=\"titleUppercase()\"\n >\n {{ title() }}\n </h2>\n @if (closable()) {\n <button\n type=\"button\"\n class=\"geo-form-modal__close\"\n aria-label=\"\u0110\u00F3ng\"\n (click)=\"onCancel()\"\n >\n <span nz-icon nzType=\"close\" nzTheme=\"outline\"></span>\n </button>\n }\n </div>\n\n <div\n class=\"geo-form-modal__body\"\n [style.--geo-form-modal-body-max-height]=\"bodyScroll() ? bodyMaxHeightCss() : null\"\n >\n <ng-content></ng-content>\n </div>\n\n <div class=\"geo-form-modal__footer\">\n <ng-content select=\"[footerStart]\"></ng-content>\n\n <div class=\"geo-form-modal__footer-actions\">\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n [icon]=\"cancelIcon()\"\n [iconPlacement]=\"cancelIconPlacement()\"\n (clicked)=\"onCancel()\"\n >\n {{ readonly() ? '\u0110\u00F3ng' : cancelText() }}\n </geo-button>\n @if (!readonly() && secondaryOkText()) {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"save\"\n [disabled]=\"okDisabled() || confirmLoading()\"\n (clicked)=\"onSecondaryOk()\"\n >\n {{ secondaryOkText() }}\n </geo-button>\n }\n @if (!readonly()) {\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n [icon]=\"confirmLoading() ? 'loading' : okIcon()\"\n [iconPlacement]=\"okIconPlacement()\"\n [disabled]=\"okDisabled() || confirmLoading()\"\n (clicked)=\"onOk()\"\n >\n {{ okText() }}\n </geo-button>\n }\n </div>\n </div>\n </div>\n </ng-container>\n</nz-modal>\n", styles: [".geo-form-modal-wrap .ant-modal-header{display:none}.geo-form-modal-wrap .ant-modal{max-width:calc(100vw - 32px)}.geo-form-modal-wrap .ant-modal-content{border-radius:var(--geo-radius-lg);padding:0;overflow:hidden;box-shadow:var(--geo-shadow-md)}.geo-form-modal-wrap .ant-modal-body{padding:0}.geo-form-modal__content{display:flex;flex-direction:column;background:var(--geo-color-neutral-white);max-height:inherit}.geo-form-modal__header{position:relative;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-shrink:0;padding:24px 24px 16px;border-bottom:none}.geo-form-modal__header:after{content:\"\";position:absolute;left:24px;right:24px;bottom:0;height:1px;background:var(--geo-color-primary-default);pointer-events:none}.geo-form-modal__title{margin:0;min-width:0;font-family:var(--geo-font-family);font-size:var(--geo-font-size-h4);font-weight:var(--geo-font-weight-bold);line-height:var(--geo-line-height-h4);color:var(--geo-color-neutral-900);letter-spacing:.02em;word-break:break-word}.geo-form-modal__title--uppercase{text-transform:uppercase}.geo-form-modal__close{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;flex-shrink:0;transition:color .15s ease,background-color .15s ease}.geo-form-modal__close .anticon{font-size:14px}.geo-form-modal__close:hover{color:var(--geo-color-neutral-900);background:var(--geo-color-neutral-100)}.geo-form-modal__body{display:flex;flex-direction:column;gap:20px;flex:1 1 auto;min-width:0;min-height:0;padding:24px}.geo-form-modal__content--body-scroll .geo-form-modal__body{overflow-x:hidden;overflow-y:auto;max-height:var(--geo-form-modal-body-max-height, 60vh);-webkit-overflow-scrolling:touch}.geo-form-modal__footer{position:relative;display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:12px;flex-shrink:0;padding:16px 24px 24px;border-top:none;background:var(--geo-color-neutral-white)}.geo-form-modal__footer:before{content:\"\";position:absolute;left:24px;right:24px;top:0;height:1px;background:var(--geo-color-primary-default);pointer-events:none}.geo-form-modal__footer-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:12px;margin-left:auto}@media (max-width: 767.98px){.geo-form-modal-wrap .ant-modal{top:0;max-width:calc(100vw - 24px)!important;width:calc(100vw - 24px)!important;margin:12px auto!important;padding-bottom:0}.geo-form-modal-wrap .ant-modal-content{max-height:calc(100dvh - 24px);display:flex;flex-direction:column}.geo-form-modal-wrap .ant-modal-body{flex:1 1 auto;min-height:0;overflow:hidden}.geo-form-modal__content{max-height:calc(100dvh - 24px);min-height:0}.geo-form-modal__header{gap:12px;padding:24px 24px 16px}.geo-form-modal__title{font-size:var(--geo-font-size-subtitle)}.geo-form-modal__body{gap:16px;padding:24px}.geo-form-modal__content--body-scroll .geo-form-modal__body{max-height:none;flex:1 1 auto}.geo-form-modal__footer{justify-content:stretch;gap:8px;padding:16px 24px 24px}.geo-form-modal__footer-actions{width:100%;margin-left:0}.geo-form-modal__footer-actions>*{flex:1 1 calc(50% - 4px);min-width:0}.geo-form-modal__footer-actions>*:nth-child(n+3){flex:1 1 100%}.geo-form-modal__footer-actions geo-button{display:block;width:100%}.geo-form-modal__footer-actions .geo-button{width:100%;white-space:normal;height:auto;min-height:40px;padding-block:8px;text-align:center}}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "directive", type: i1$5.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i1.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i3.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i3.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1307
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoFormModalComponent, isStandalone: true, selector: "geo-form-modal", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, titleUppercase: { classPropertyName: "titleUppercase", publicName: "titleUppercase", isSignal: true, isRequired: false, transformFunction: null }, okText: { classPropertyName: "okText", publicName: "okText", isSignal: true, isRequired: false, transformFunction: null }, cancelText: { classPropertyName: "cancelText", publicName: "cancelText", isSignal: true, isRequired: false, transformFunction: null }, cancelIcon: { classPropertyName: "cancelIcon", publicName: "cancelIcon", isSignal: true, isRequired: false, transformFunction: null }, cancelIconPlacement: { classPropertyName: "cancelIconPlacement", publicName: "cancelIconPlacement", isSignal: true, isRequired: false, transformFunction: null }, okIcon: { classPropertyName: "okIcon", publicName: "okIcon", isSignal: true, isRequired: false, transformFunction: null }, okIconPlacement: { classPropertyName: "okIconPlacement", publicName: "okIconPlacement", isSignal: true, isRequired: false, transformFunction: null }, secondaryOkText: { classPropertyName: "secondaryOkText", publicName: "secondaryOkText", isSignal: true, isRequired: false, transformFunction: null }, confirmLoading: { classPropertyName: "confirmLoading", publicName: "confirmLoading", isSignal: true, isRequired: false, transformFunction: null }, okDisabled: { classPropertyName: "okDisabled", publicName: "okDisabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, mask: { classPropertyName: "mask", publicName: "mask", isSignal: true, isRequired: false, transformFunction: null }, maskClosable: { classPropertyName: "maskClosable", publicName: "maskClosable", isSignal: true, isRequired: false, transformFunction: null }, keyboard: { classPropertyName: "keyboard", publicName: "keyboard", isSignal: true, isRequired: false, transformFunction: null }, centered: { classPropertyName: "centered", publicName: "centered", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, wrapClassName: { classPropertyName: "wrapClassName", publicName: "wrapClassName", isSignal: true, isRequired: false, transformFunction: null }, bodyScroll: { classPropertyName: "bodyScroll", publicName: "bodyScroll", isSignal: true, isRequired: false, transformFunction: null }, bodyMaxHeight: { classPropertyName: "bodyMaxHeight", publicName: "bodyMaxHeight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", ok: "ok", secondaryOk: "secondaryOk", cancel: "cancel", afterOpen: "afterOpen", afterClose: "afterClose" }, ngImport: i0, template: "<nz-modal\n [nzVisible]=\"open()\"\n [nzTitle]=\"''\"\n [nzFooter]=\"null\"\n [nzClosable]=\"false\"\n [nzMask]=\"mask()\"\n [nzMaskClosable]=\"maskClosable()\"\n [nzKeyboard]=\"keyboard()\"\n [nzCentered]=\"centered()\"\n [nzWidth]=\"width()\"\n [nzZIndex]=\"zIndex()\"\n [nzWrapClassName]=\"resolvedWrapClassName()\"\n [nzClassName]=\"resolvedClassName()\"\n (nzVisibleChange)=\"onOpenChange($event)\"\n (nzAfterOpen)=\"afterOpen.emit()\"\n (nzAfterClose)=\"afterClose.emit()\"\n>\n <ng-container *nzModalContent>\n <div\n class=\"geo-form-modal__content\"\n [class.geo-form-modal__content--body-scroll]=\"bodyScroll()\"\n >\n <div class=\"geo-form-modal__header\">\n <h2\n class=\"geo-form-modal__title\"\n [class.geo-form-modal__title--uppercase]=\"titleUppercase()\"\n >\n {{ title() }}\n </h2>\n @if (closable()) {\n <button\n type=\"button\"\n class=\"geo-form-modal__close\"\n aria-label=\"\u0110\u00F3ng\"\n (click)=\"onCancel()\"\n >\n <span nz-icon nzType=\"close\" nzTheme=\"outline\"></span>\n </button>\n }\n </div>\n\n <div\n class=\"geo-form-modal__body\"\n [style.--geo-form-modal-body-max-height]=\"bodyScroll() ? bodyMaxHeightCss() : null\"\n >\n <ng-content></ng-content>\n </div>\n\n <div class=\"geo-form-modal__footer\">\n <ng-content select=\"[footerStart]\"></ng-content>\n\n <div class=\"geo-form-modal__footer-actions\">\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n [icon]=\"cancelIcon()\"\n [iconPlacement]=\"cancelIconPlacement()\"\n (clicked)=\"onCancel()\"\n >\n {{ readonly() ? '\u0110\u00F3ng' : cancelText() }}\n </geo-button>\n @if (!readonly() && secondaryOkText()) {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"save\"\n [disabled]=\"okDisabled() || confirmLoading()\"\n (clicked)=\"onSecondaryOk()\"\n >\n {{ secondaryOkText() }}\n </geo-button>\n }\n @if (!readonly()) {\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n [icon]=\"confirmLoading() ? 'loading' : okIcon()\"\n [iconPlacement]=\"okIconPlacement()\"\n [disabled]=\"okDisabled() || confirmLoading()\"\n (clicked)=\"onOk()\"\n >\n {{ okText() }}\n </geo-button>\n }\n </div>\n </div>\n </div>\n </ng-container>\n</nz-modal>\n", styles: [".geo-form-modal-wrap .ant-modal-header{display:none}.geo-form-modal-wrap .ant-modal{max-width:calc(100vw - 32px)}.geo-form-modal-wrap .ant-modal-content{border-radius:var(--geo-radius-lg);padding:0;overflow:hidden;box-shadow:var(--geo-shadow-md)}.geo-form-modal-wrap .ant-modal-body{padding:0}.geo-form-modal__content{display:flex;flex-direction:column;background:var(--geo-color-neutral-white);max-height:inherit}.geo-form-modal__header{position:relative;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-shrink:0;padding:24px 24px 16px;border-bottom:none}.geo-form-modal__header:after{content:\"\";position:absolute;left:24px;right:24px;bottom:0;height:1px;background:var(--geo-color-primary-default);pointer-events:none}.geo-form-modal__title{margin:0;min-width:0;font-family:var(--geo-font-family);font-size:var(--geo-font-size-h4);font-weight:var(--geo-font-weight-bold);line-height:var(--geo-line-height-h4);color:var(--geo-color-neutral-900);letter-spacing:.02em;word-break:break-word}.geo-form-modal__title--uppercase{text-transform:uppercase}.geo-form-modal__close{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;flex-shrink:0;transition:color .15s ease,background-color .15s ease}.geo-form-modal__close .anticon{font-size:14px}.geo-form-modal__close:hover{color:var(--geo-color-neutral-900);background:var(--geo-color-neutral-100)}.geo-form-modal__body{display:flex;flex-direction:column;gap:20px;flex:1 1 auto;min-width:0;min-height:0;padding:24px}.geo-form-modal__content--body-scroll .geo-form-modal__body{overflow-x:hidden;overflow-y:auto;max-height:var(--geo-form-modal-body-max-height, 60vh);-webkit-overflow-scrolling:touch}.geo-form-modal__footer{position:relative;display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:12px;flex-shrink:0;padding:16px 24px 24px;border-top:none;background:var(--geo-color-neutral-white)}.geo-form-modal__footer:before{content:\"\";position:absolute;left:24px;right:24px;top:0;height:1px;background:var(--geo-color-primary-default);pointer-events:none}.geo-form-modal__footer-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:12px;margin-left:auto}@media (max-width: 767.98px){.geo-form-modal-wrap .ant-modal{top:0;max-width:calc(100vw - 24px)!important;width:calc(100vw - 24px)!important;margin:12px auto!important;padding-bottom:0}.geo-form-modal-wrap .ant-modal-content{max-height:calc(100dvh - 24px);display:flex;flex-direction:column}.geo-form-modal-wrap .ant-modal-body{flex:1 1 auto;min-height:0;overflow:hidden}.geo-form-modal__content{max-height:calc(100dvh - 24px);min-height:0}.geo-form-modal__header{gap:12px;padding:24px 24px 16px}.geo-form-modal__title{font-size:var(--geo-font-size-subtitle)}.geo-form-modal__body{gap:16px;padding:24px}.geo-form-modal__content--body-scroll .geo-form-modal__body{max-height:none;flex:1 1 auto}.geo-form-modal__footer{justify-content:stretch;gap:8px;padding:16px 24px 24px}.geo-form-modal__footer-actions{width:100%;margin-left:0}.geo-form-modal__footer-actions>*{flex:1 1 calc(50% - 4px);min-width:0}.geo-form-modal__footer-actions>*:nth-child(n+3){flex:1 1 100%}.geo-form-modal__footer-actions geo-button{display:block;width:100%}.geo-form-modal__footer-actions .geo-button{width:100%;white-space:normal;height:auto;min-height:40px;padding-block:8px;text-align:center}}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "directive", type: i1$6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i1.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i3.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i3.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1267
1308
  }
1268
1309
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoFormModalComponent, decorators: [{
1269
1310
  type: Component,
@@ -1410,7 +1451,7 @@ class GeoPaginationComponent {
1410
1451
  showSizeChanger = input(false);
1411
1452
  pageSizeOptions = input([5, 10, 20, 50]);
1412
1453
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1413
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoPaginationComponent, isStandalone: true, selector: "geo-pagination", inputs: { pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null }, hideOnSinglePage: { classPropertyName: "hideOnSinglePage", publicName: "hideOnSinglePage", isSignal: true, isRequired: false, transformFunction: null }, showSizeChanger: { classPropertyName: "showSizeChanger", publicName: "showSizeChanger", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageIndex: "pageIndexChange", pageSize: "pageSizeChange" }, host: { classAttribute: "geo-pagination-host" }, ngImport: i0, template: "<div class=\"geo-pagination\">\n <nz-pagination\n [nzSize]=\"size()\"\n [nzSimple]=\"simple()\"\n [nzPageIndex]=\"pageIndex()\"\n [nzPageSize]=\"pageSize()\"\n [nzTotal]=\"total()\"\n [nzHideOnSinglePage]=\"hideOnSinglePage()\"\n [nzShowSizeChanger]=\"showSizeChanger()\"\n [nzPageSizeOptions]=\"pageSizeOptions()\"\n (nzPageIndexChange)=\"pageIndex.set($event)\"\n (nzPageSizeChange)=\"pageSize.set($event)\"\n ></nz-pagination>\n</div>\n", styles: [".geo-pagination-host{display:inline-flex;align-items:center}.geo-pagination{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i1$6.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1454
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoPaginationComponent, isStandalone: true, selector: "geo-pagination", inputs: { pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null }, hideOnSinglePage: { classPropertyName: "hideOnSinglePage", publicName: "hideOnSinglePage", isSignal: true, isRequired: false, transformFunction: null }, showSizeChanger: { classPropertyName: "showSizeChanger", publicName: "showSizeChanger", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageIndex: "pageIndexChange", pageSize: "pageSizeChange" }, host: { classAttribute: "geo-pagination-host" }, ngImport: i0, template: "<div class=\"geo-pagination\">\n <nz-pagination\n [nzSize]=\"size()\"\n [nzSimple]=\"simple()\"\n [nzPageIndex]=\"pageIndex()\"\n [nzPageSize]=\"pageSize()\"\n [nzTotal]=\"total()\"\n [nzHideOnSinglePage]=\"hideOnSinglePage()\"\n [nzShowSizeChanger]=\"showSizeChanger()\"\n [nzPageSizeOptions]=\"pageSizeOptions()\"\n (nzPageIndexChange)=\"pageIndex.set($event)\"\n (nzPageSizeChange)=\"pageSize.set($event)\"\n ></nz-pagination>\n</div>\n", styles: [".geo-pagination-host{display:inline-flex;align-items:center}.geo-pagination{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i1$7.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1414
1455
  }
1415
1456
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoPaginationComponent, decorators: [{
1416
1457
  type: Component,
@@ -2171,7 +2212,7 @@ class GeoLayoutHeaderActionsComponent {
2171
2212
  this.userMenuClick.emit(item);
2172
2213
  }
2173
2214
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLayoutHeaderActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2174
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoLayoutHeaderActionsComponent, isStandalone: true, selector: "geo-layout-header-actions", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, notifications: { classPropertyName: "notifications", publicName: "notifications", isSignal: true, isRequired: false, transformFunction: null }, subsystems: { classPropertyName: "subsystems", publicName: "subsystems", isSignal: true, isRequired: false, transformFunction: null }, userMenuItems: { classPropertyName: "userMenuItems", publicName: "userMenuItems", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { notificationClick: "notificationClick", subsystemClick: "subsystemClick", userMenuClick: "userMenuClick", logout: "logout" }, host: { properties: { "class.geo-layout-header-actions-host--compact": "compact()" }, classAttribute: "geo-layout-header-actions-host" }, ngImport: i0, template: "<div class=\"geo-layout-ha\">\n <div class=\"geo-layout-ha__icons\">\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"notifyMenu\"\n [nzVisible]=\"notifyOpen()\"\n (nzVisibleChange)=\"onNotifyVisible($event)\"\n aria-label=\"Th\u00F4ng b\u00E1o\"\n >\n <nz-badge [nzCount]=\"unreadCount()\" [nzOverflowCount]=\"9\" nzSize=\"small\">\n <geo-icon type=\"bell\" size=\"lg\" />\n </nz-badge>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"subsystemMenu\"\n [nzVisible]=\"subsystemOpen()\"\n (nzVisibleChange)=\"onSubsystemVisible($event)\"\n aria-label=\"Ph\u00E2n h\u1EC7\"\n >\n <geo-icon type=\"appstore\" size=\"lg\" />\n </button>\n </div>\n\n <span class=\"geo-layout-ha__divider\" aria-hidden=\"true\"></span>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__user\"\n [class.geo-layout-ha__user--open]=\"userOpen()\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"userMenu\"\n [nzVisible]=\"userOpen()\"\n (nzVisibleChange)=\"onUserVisible($event)\"\n aria-label=\"T\u00E0i kho\u1EA3n ng\u01B0\u1EDDi d\u00F9ng\"\n >\n <span class=\"geo-layout-ha__avatar\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n\n @if (!compact()) {\n <span class=\"geo-layout-ha__user-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n }\n </button>\n</div>\n\n<nz-dropdown-menu #notifyMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--notify\" role=\"dialog\" aria-label=\"Th\u00F4ng b\u00E1o\">\n <div class=\"geo-layout-ha-pop__head\">\n <div class=\"geo-layout-ha-pop__title-row\">\n <h3 class=\"geo-layout-ha-pop__title\">Th\u00F4ng b\u00E1o</h3>\n @if (unreadCount() > 0) {\n <span class=\"geo-layout-ha-pop__badge\">{{ unreadCount() }} m\u1EDBi</span>\n }\n </div>\n </div>\n\n <div class=\"geo-layout-ha-pop__list\">\n @if (notifications().length) {\n @for (item of notifications(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-notify\"\n [class.geo-layout-ha-notify--unread]=\"!item.read\"\n (click)=\"onNotificationItem(item)\"\n >\n <span class=\"geo-layout-ha-notify__icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"item.icon || 'bell'\" size=\"md\" />\n </span>\n <span class=\"geo-layout-ha-notify__body\">\n <span class=\"geo-layout-ha-notify__msg\">{{ item.message }}</span>\n <span class=\"geo-layout-ha-notify__time\">{{ item.time }}</span>\n </span>\n @if (!item.read) {\n <span class=\"geo-layout-ha-notify__dot\" aria-hidden=\"true\"></span>\n }\n </button>\n }\n } @else {\n <div class=\"geo-layout-ha-pop__empty\">\n <geo-icon type=\"bell\" size=\"xl\" />\n <p>Kh\u00F4ng c\u00F3 th\u00F4ng b\u00E1o m\u1EDBi</p>\n </div>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #subsystemMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--subsystem\" role=\"dialog\" aria-label=\"Ph\u00E2n h\u1EC7\">\n <div class=\"geo-layout-ha-pop__head\">\n <h3 class=\"geo-layout-ha-pop__title\">Ph\u00E2n h\u1EC7</h3>\n </div>\n <div class=\"geo-layout-ha-subgrid\">\n @for (item of subsystems(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-sub\"\n (click)=\"onSubsystemItem(item)\"\n >\n <span class=\"geo-layout-ha-sub__mark\">{{ item.initials }}</span>\n <span class=\"geo-layout-ha-sub__label\">{{ item.label }}</span>\n </button>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #userMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--user\" role=\"dialog\" aria-label=\"T\u00E0i kho\u1EA3n\">\n <div class=\"geo-layout-ha-pop__profile\">\n <span class=\"geo-layout-ha__avatar geo-layout-ha__avatar--lg\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n <span class=\"geo-layout-ha-pop__profile-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n </div>\n\n <div class=\"geo-layout-ha-pop__menu\">\n @for (item of primaryMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n\n @if (dangerMenuItems().length) {\n <div class=\"geo-layout-ha-pop__menu geo-layout-ha-pop__menu--footer\">\n @for (item of dangerMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item geo-layout-ha-menu-item--danger\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n }\n </div>\n</nz-dropdown-menu>\n", styles: ["@charset \"UTF-8\";.geo-layout-header-actions-host{display:inline-flex;align-items:center}.geo-layout-ha{display:inline-flex;align-items:center;gap:10px}.geo-layout-ha__icons{display:inline-flex;align-items:center;gap:4px}.geo-layout-ha__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:0;border-radius:var(--geo-radius-md);background:transparent;color:var(--geo-color-neutral-700);cursor:pointer;line-height:1;transition:background-color .15s ease,color .15s ease}.geo-layout-ha__icon-btn:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-layout-ha__icon-btn:active{transform:scale(.98)}.geo-layout-ha__icon-btn .ant-badge{color:inherit;line-height:1}.geo-layout-ha__icon-btn .ant-badge-count{min-width:16px;height:16px;padding:0 4px;border:0;box-shadow:none;background:var(--geo-color-error-default);font-size:10px;line-height:16px}.geo-layout-ha__divider{width:1px;height:28px;margin-inline:4px;background:var(--geo-color-neutral-200)}.geo-layout-ha__user{display:inline-flex;align-items:center;gap:10px;max-width:260px;min-height:44px;padding:6px 12px 6px 6px;border:0;border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-page);color:var(--geo-color-neutral-900);cursor:pointer;transition:background-color .15s ease,box-shadow .15s ease}.geo-layout-ha__user:hover,.geo-layout-ha__user--open{background:var(--geo-color-primary-soft-hover)}.geo-layout-ha__avatar{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;overflow:hidden;border-radius:var(--geo-radius-full);background:var(--geo-color-neutral-white);color:var(--geo-color-neutral-800);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-bold);letter-spacing:.02em;box-shadow:inset 0 0 0 1px var(--geo-color-neutral-200)}.geo-layout-ha__avatar img{width:100%;height:100%;object-fit:cover}.geo-layout-ha__avatar--lg{width:40px;height:40px;font-size:var(--geo-font-size-body)}.geo-layout-ha__user-text{display:flex;flex:1;flex-direction:column;align-items:flex-start;min-width:0;gap:1px;text-align:left}.geo-layout-ha__user-name{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-bold);line-height:1.25;color:var(--geo-color-neutral-900);text-overflow:ellipsis;white-space:nowrap}.geo-layout-ha__user-email{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-regular);line-height:1.25;color:var(--geo-color-neutral-500);text-overflow:ellipsis;white-space:nowrap}.geo-layout-header-actions-host--compact .geo-layout-ha__user{max-width:none;padding:4px;border-radius:var(--geo-radius-full)}.geo-layout-ha-overlay .ant-dropdown-menu{padding:0;background:transparent;box-shadow:none}.geo-layout-ha-pop{width:320px;overflow:hidden;border:1px solid var(--geo-color-neutral-200);border-radius:var(--geo-radius-xl);background:linear-gradient(180deg,var(--geo-color-neutral-white) 0%,var(--geo-color-neutral-100) 160%);box-shadow:var(--geo-shadow-lg)}.geo-layout-ha-pop--user{width:280px}.geo-layout-ha-pop--subsystem{width:300px}.geo-layout-ha-pop__head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px 10px}.geo-layout-ha-pop__title-row{display:flex;align-items:center;gap:8px}.geo-layout-ha-pop__title{margin:0;font-size:var(--geo-font-size-subtitle);font-weight:var(--geo-font-weight-bold);line-height:1.3;color:var(--geo-color-neutral-900)}.geo-layout-ha-pop__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-tiny);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-primary-default)}.geo-layout-ha-pop__list{max-height:320px;overflow-y:auto;padding:4px 8px 12px}.geo-layout-ha-pop__empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:28px 16px;color:var(--geo-color-neutral-400);text-align:center}.geo-layout-ha-pop__empty p{margin:0;font-size:var(--geo-font-size-body-small)}.geo-layout-ha-notify{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px;border:0;border-radius:var(--geo-radius-md);background:transparent;text-align:left;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-notify:hover,.geo-layout-ha-notify--unread{background:var(--geo-color-primary-soft)}.geo-layout-ha-notify__icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--geo-radius-md);background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-layout-ha-notify__body{display:flex;flex:1;flex-direction:column;gap:4px;min-width:0}.geo-layout-ha-notify__msg{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1.4;color:var(--geo-color-neutral-800)}.geo-layout-ha-notify__time{font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-layout-ha-notify__dot{flex-shrink:0;width:8px;height:8px;margin-top:6px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-default)}.geo-layout-ha-subgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding:4px 16px 16px}.geo-layout-ha-sub{display:flex;flex-direction:column;align-items:center;gap:8px;padding:8px 4px;border:0;border-radius:var(--geo-radius-md);background:transparent;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-sub:hover{background:var(--geo-color-primary-soft)}.geo-layout-ha-sub__mark{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-bold);color:var(--geo-color-primary-default)}.geo-layout-ha-sub__label{max-width:72px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.25;color:var(--geo-color-neutral-600, var(--geo-color-neutral-500));text-align:center}.geo-layout-ha-pop__profile{display:flex;align-items:center;gap:12px;padding:16px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-pop__profile-text{display:flex;flex-direction:column;gap:2px;min-width:0}.geo-layout-ha-pop__menu{display:flex;flex-direction:column;padding:8px}.geo-layout-ha-pop__menu--footer{padding-top:0;border-top:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:0;border-radius:var(--geo-radius-md);background:transparent;font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-800);text-align:left;cursor:pointer;transition:background-color .15s ease,color .15s ease}.geo-layout-ha-menu-item:hover{background:var(--geo-color-primary-soft);color:var(--geo-color-primary-default)}.geo-layout-ha-menu-item--danger{color:var(--geo-color-error-default)}.geo-layout-ha-menu-item--danger:hover{background:var(--geo-color-error-light);color:var(--geo-color-error-dark)}@media (prefers-reduced-motion: reduce){.geo-layout-ha__icon-btn,.geo-layout-ha__user,.geo-layout-ha-notify,.geo-layout-ha-sub,.geo-layout-ha-menu-item{transition:none}}\n"], dependencies: [{ kind: "ngmodule", type: NzBadgeModule }, { kind: "component", type: i1$7.NzBadgeComponent, selector: "nz-badge", inputs: ["nzShowZero", "nzShowDot", "nzStandalone", "nzDot", "nzOverflowCount", "nzColor", "nzStyle", "nzText", "nzTitle", "nzStatus", "nzCount", "nzOffset", "nzSize"], exportAs: ["nzBadge"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2215
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoLayoutHeaderActionsComponent, isStandalone: true, selector: "geo-layout-header-actions", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, notifications: { classPropertyName: "notifications", publicName: "notifications", isSignal: true, isRequired: false, transformFunction: null }, subsystems: { classPropertyName: "subsystems", publicName: "subsystems", isSignal: true, isRequired: false, transformFunction: null }, userMenuItems: { classPropertyName: "userMenuItems", publicName: "userMenuItems", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { notificationClick: "notificationClick", subsystemClick: "subsystemClick", userMenuClick: "userMenuClick", logout: "logout" }, host: { properties: { "class.geo-layout-header-actions-host--compact": "compact()" }, classAttribute: "geo-layout-header-actions-host" }, ngImport: i0, template: "<div class=\"geo-layout-ha\">\n <div class=\"geo-layout-ha__icons\">\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"notifyMenu\"\n [nzVisible]=\"notifyOpen()\"\n (nzVisibleChange)=\"onNotifyVisible($event)\"\n aria-label=\"Th\u00F4ng b\u00E1o\"\n >\n <nz-badge [nzCount]=\"unreadCount()\" [nzOverflowCount]=\"9\" nzSize=\"small\">\n <geo-icon type=\"bell\" size=\"lg\" />\n </nz-badge>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__icon-btn\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"subsystemMenu\"\n [nzVisible]=\"subsystemOpen()\"\n (nzVisibleChange)=\"onSubsystemVisible($event)\"\n aria-label=\"Ph\u00E2n h\u1EC7\"\n >\n <geo-icon type=\"appstore\" size=\"lg\" />\n </button>\n </div>\n\n <span class=\"geo-layout-ha__divider\" aria-hidden=\"true\"></span>\n\n <button\n type=\"button\"\n class=\"geo-layout-ha__user\"\n [class.geo-layout-ha__user--open]=\"userOpen()\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nzOverlayClassName=\"geo-layout-ha-overlay\"\n [nzDropdownMenu]=\"userMenu\"\n [nzVisible]=\"userOpen()\"\n (nzVisibleChange)=\"onUserVisible($event)\"\n aria-label=\"T\u00E0i kho\u1EA3n ng\u01B0\u1EDDi d\u00F9ng\"\n >\n <span class=\"geo-layout-ha__avatar\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n\n @if (!compact()) {\n <span class=\"geo-layout-ha__user-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n }\n </button>\n</div>\n\n<nz-dropdown-menu #notifyMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--notify\" role=\"dialog\" aria-label=\"Th\u00F4ng b\u00E1o\">\n <div class=\"geo-layout-ha-pop__head\">\n <div class=\"geo-layout-ha-pop__title-row\">\n <h3 class=\"geo-layout-ha-pop__title\">Th\u00F4ng b\u00E1o</h3>\n @if (unreadCount() > 0) {\n <span class=\"geo-layout-ha-pop__badge\">{{ unreadCount() }} m\u1EDBi</span>\n }\n </div>\n </div>\n\n <div class=\"geo-layout-ha-pop__list\">\n @if (notifications().length) {\n @for (item of notifications(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-notify\"\n [class.geo-layout-ha-notify--unread]=\"!item.read\"\n (click)=\"onNotificationItem(item)\"\n >\n <span class=\"geo-layout-ha-notify__icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"item.icon || 'bell'\" size=\"md\" />\n </span>\n <span class=\"geo-layout-ha-notify__body\">\n <span class=\"geo-layout-ha-notify__msg\">{{ item.message }}</span>\n <span class=\"geo-layout-ha-notify__time\">{{ item.time }}</span>\n </span>\n @if (!item.read) {\n <span class=\"geo-layout-ha-notify__dot\" aria-hidden=\"true\"></span>\n }\n </button>\n }\n } @else {\n <div class=\"geo-layout-ha-pop__empty\">\n <geo-icon type=\"bell\" size=\"xl\" />\n <p>Kh\u00F4ng c\u00F3 th\u00F4ng b\u00E1o m\u1EDBi</p>\n </div>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #subsystemMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--subsystem\" role=\"dialog\" aria-label=\"Ph\u00E2n h\u1EC7\">\n <div class=\"geo-layout-ha-pop__head\">\n <h3 class=\"geo-layout-ha-pop__title\">Ph\u00E2n h\u1EC7</h3>\n </div>\n <div class=\"geo-layout-ha-subgrid\">\n @for (item of subsystems(); track item.id) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-sub\"\n (click)=\"onSubsystemItem(item)\"\n >\n <span class=\"geo-layout-ha-sub__mark\">{{ item.initials }}</span>\n <span class=\"geo-layout-ha-sub__label\">{{ item.label }}</span>\n </button>\n }\n </div>\n </div>\n</nz-dropdown-menu>\n\n<nz-dropdown-menu #userMenu=\"nzDropdownMenu\">\n <div class=\"geo-layout-ha-pop geo-layout-ha-pop--user\" role=\"dialog\" aria-label=\"T\u00E0i kho\u1EA3n\">\n <div class=\"geo-layout-ha-pop__profile\">\n <span class=\"geo-layout-ha__avatar geo-layout-ha__avatar--lg\">\n @if (user().avatarUrl) {\n <img [src]=\"user().avatarUrl\" alt=\"\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </span>\n <span class=\"geo-layout-ha-pop__profile-text\">\n <span class=\"geo-layout-ha__user-name\">{{ user().name }}</span>\n @if (user().email) {\n <span class=\"geo-layout-ha__user-email\">{{ user().email }}</span>\n }\n </span>\n </div>\n\n <div class=\"geo-layout-ha-pop__menu\">\n @for (item of primaryMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n\n @if (dangerMenuItems().length) {\n <div class=\"geo-layout-ha-pop__menu geo-layout-ha-pop__menu--footer\">\n @for (item of dangerMenuItems(); track item.key) {\n <button\n type=\"button\"\n class=\"geo-layout-ha-menu-item geo-layout-ha-menu-item--danger\"\n (click)=\"onUserMenuItem(item)\"\n >\n <geo-icon [type]=\"item.icon\" size=\"md\" />\n <span>{{ item.label }}</span>\n </button>\n }\n </div>\n }\n </div>\n</nz-dropdown-menu>\n", styles: ["@charset \"UTF-8\";.geo-layout-header-actions-host{display:inline-flex;align-items:center}.geo-layout-ha{display:inline-flex;align-items:center;gap:10px}.geo-layout-ha__icons{display:inline-flex;align-items:center;gap:4px}.geo-layout-ha__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:0;border-radius:var(--geo-radius-md);background:transparent;color:var(--geo-color-neutral-700);cursor:pointer;line-height:1;transition:background-color .15s ease,color .15s ease}.geo-layout-ha__icon-btn:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-layout-ha__icon-btn:active{transform:scale(.98)}.geo-layout-ha__icon-btn .ant-badge{color:inherit;line-height:1}.geo-layout-ha__icon-btn .ant-badge-count{min-width:16px;height:16px;padding:0 4px;border:0;box-shadow:none;background:var(--geo-color-error-default);font-size:10px;line-height:16px}.geo-layout-ha__divider{width:1px;height:28px;margin-inline:4px;background:var(--geo-color-neutral-200)}.geo-layout-ha__user{display:inline-flex;align-items:center;gap:10px;max-width:260px;min-height:44px;padding:6px 12px 6px 6px;border:0;border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-page);color:var(--geo-color-neutral-900);cursor:pointer;transition:background-color .15s ease,box-shadow .15s ease}.geo-layout-ha__user:hover,.geo-layout-ha__user--open{background:var(--geo-color-primary-soft-hover)}.geo-layout-ha__avatar{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;overflow:hidden;border-radius:var(--geo-radius-full);background:var(--geo-color-neutral-white);color:var(--geo-color-neutral-800);font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-bold);letter-spacing:.02em;box-shadow:inset 0 0 0 1px var(--geo-color-neutral-200)}.geo-layout-ha__avatar img{width:100%;height:100%;object-fit:cover}.geo-layout-ha__avatar--lg{width:40px;height:40px;font-size:var(--geo-font-size-body)}.geo-layout-ha__user-text{display:flex;flex:1;flex-direction:column;align-items:flex-start;min-width:0;gap:1px;text-align:left}.geo-layout-ha__user-name{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-bold);line-height:1.25;color:var(--geo-color-neutral-900);text-overflow:ellipsis;white-space:nowrap}.geo-layout-ha__user-email{overflow:hidden;max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-regular);line-height:1.25;color:var(--geo-color-neutral-500);text-overflow:ellipsis;white-space:nowrap}.geo-layout-header-actions-host--compact .geo-layout-ha__user{max-width:none;padding:4px;border-radius:var(--geo-radius-full)}.geo-layout-ha-overlay .ant-dropdown-menu{padding:0;background:transparent;box-shadow:none}.geo-layout-ha-pop{width:320px;overflow:hidden;border:1px solid var(--geo-color-neutral-200);border-radius:var(--geo-radius-xl);background:linear-gradient(180deg,var(--geo-color-neutral-white) 0%,var(--geo-color-neutral-100) 160%);box-shadow:var(--geo-shadow-lg)}.geo-layout-ha-pop--user{width:280px}.geo-layout-ha-pop--subsystem{width:300px}.geo-layout-ha-pop__head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px 10px}.geo-layout-ha-pop__title-row{display:flex;align-items:center;gap:8px}.geo-layout-ha-pop__title{margin:0;font-size:var(--geo-font-size-subtitle);font-weight:var(--geo-font-weight-bold);line-height:1.3;color:var(--geo-color-neutral-900)}.geo-layout-ha-pop__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-tiny);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-primary-default)}.geo-layout-ha-pop__list{max-height:320px;overflow-y:auto;padding:4px 8px 12px}.geo-layout-ha-pop__empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:28px 16px;color:var(--geo-color-neutral-400);text-align:center}.geo-layout-ha-pop__empty p{margin:0;font-size:var(--geo-font-size-body-small)}.geo-layout-ha-notify{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px;border:0;border-radius:var(--geo-radius-md);background:transparent;text-align:left;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-notify:hover,.geo-layout-ha-notify--unread{background:var(--geo-color-primary-soft)}.geo-layout-ha-notify__icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--geo-radius-md);background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-layout-ha-notify__body{display:flex;flex:1;flex-direction:column;gap:4px;min-width:0}.geo-layout-ha-notify__msg{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1.4;color:var(--geo-color-neutral-800)}.geo-layout-ha-notify__time{font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-layout-ha-notify__dot{flex-shrink:0;width:8px;height:8px;margin-top:6px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-default)}.geo-layout-ha-subgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding:4px 16px 16px}.geo-layout-ha-sub{display:flex;flex-direction:column;align-items:center;gap:8px;padding:8px 4px;border:0;border-radius:var(--geo-radius-md);background:transparent;cursor:pointer;transition:background-color .15s ease}.geo-layout-ha-sub:hover{background:var(--geo-color-primary-soft)}.geo-layout-ha-sub__mark{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:var(--geo-radius-full);background:var(--geo-color-primary-soft-strong);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-bold);color:var(--geo-color-primary-default)}.geo-layout-ha-sub__label{max-width:72px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.25;color:var(--geo-color-neutral-600, var(--geo-color-neutral-500));text-align:center}.geo-layout-ha-pop__profile{display:flex;align-items:center;gap:12px;padding:16px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-pop__profile-text{display:flex;flex-direction:column;gap:2px;min-width:0}.geo-layout-ha-pop__menu{display:flex;flex-direction:column;padding:8px}.geo-layout-ha-pop__menu--footer{padding-top:0;border-top:1px solid var(--geo-color-neutral-100)}.geo-layout-ha-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:0;border-radius:var(--geo-radius-md);background:transparent;font:inherit;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-800);text-align:left;cursor:pointer;transition:background-color .15s ease,color .15s ease}.geo-layout-ha-menu-item:hover{background:var(--geo-color-primary-soft);color:var(--geo-color-primary-default)}.geo-layout-ha-menu-item--danger{color:var(--geo-color-error-default)}.geo-layout-ha-menu-item--danger:hover{background:var(--geo-color-error-light);color:var(--geo-color-error-dark)}@media (prefers-reduced-motion: reduce){.geo-layout-ha__icon-btn,.geo-layout-ha__user,.geo-layout-ha-notify,.geo-layout-ha-sub,.geo-layout-ha-menu-item{transition:none}}\n"], dependencies: [{ kind: "ngmodule", type: NzBadgeModule }, { kind: "component", type: i1$8.NzBadgeComponent, selector: "nz-badge", inputs: ["nzShowZero", "nzShowDot", "nzStandalone", "nzDot", "nzOverflowCount", "nzColor", "nzStyle", "nzText", "nzTitle", "nzStatus", "nzCount", "nzOffset", "nzSize"], exportAs: ["nzBadge"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2175
2216
  }
2176
2217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoLayoutHeaderActionsComponent, decorators: [{
2177
2218
  type: Component,
@@ -2438,7 +2479,7 @@ class GeoTabsComponent {
2438
2479
  }
2439
2480
  }
2440
2481
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2441
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoTabsComponent, isStandalone: true, selector: "geo-tabs", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedKey: { classPropertyName: "selectedKey", publicName: "selectedKey", isSignal: true, isRequired: false, transformFunction: null }, centered: { classPropertyName: "centered", publicName: "centered", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedIndex: "selectedIndexChange", selectedKey: "selectedKeyChange", tabChange: "tabChange" }, host: { properties: { "class.geo-tabs-host--card": "type() === \"card\"", "class.geo-tabs-host--line": "type() === \"line\"" }, classAttribute: "geo-tabs-host" }, queries: [{ propertyName: "tabTemplates", predicate: GeoTabDirective }], ngImport: i0, template: "<nz-tabset\n class=\"geo-tabs\"\n [class.geo-tabs--card]=\"type() === 'card'\"\n [class.geo-tabs--line]=\"type() === 'line'\"\n [nzType]=\"type()\"\n [nzSize]=\"size()\"\n [nzSelectedIndex]=\"resolvedSelectedIndex()\"\n [nzCentered]=\"centered()\"\n [nzAnimated]=\"animated()\"\n (nzSelectedIndexChange)=\"onSelectedIndexChange($event)\"\n>\n @for (item of items(); track item.key) {\n <nz-tab [nzTitle]=\"item.title\" [nzDisabled]=\"item.disabled ?? false\">\n @if (getTemplate(item.key); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n }\n </nz-tab>\n }\n</nz-tabset>\n", styles: ["@charset \"UTF-8\";.geo-tabs-host{display:block;width:100%;min-width:0;max-width:100%}.geo-tabs.ant-tabs{color:var(--geo-color-neutral-900);min-width:0;width:100%}.geo-tabs .ant-tabs-nav{margin-bottom:16px}.geo-tabs .ant-tabs-nav-wrap{min-width:0;flex:1 1 auto}.geo-tabs .ant-tabs-nav-list{flex-wrap:nowrap}.geo-tabs .ant-tabs-tab{padding:10px 16px;font-size:14px;line-height:20px;color:var(--geo-color-neutral-500);transition:color .15s ease}.geo-tabs .ant-tabs-tab:hover{color:var(--geo-color-primary-default)}.geo-tabs .ant-tabs-tab-btn{font-weight:500}.geo-tabs .ant-tabs-tab-active .ant-tabs-tab-btn{color:var(--geo-color-primary-default)!important;font-weight:600}.geo-tabs .ant-tabs-tab-disabled{color:var(--geo-color-neutral-400)!important;cursor:not-allowed}.geo-tabs .ant-tabs-ink-bar{background:var(--geo-color-primary-default);height:2px}.geo-tabs.ant-tabs-top>.ant-tabs-nav:before,.geo-tabs.ant-tabs-bottom>.ant-tabs-nav:before,.geo-tabs.ant-tabs-top>div>.ant-tabs-nav:before,.geo-tabs.ant-tabs-bottom>div>.ant-tabs-nav:before{border-bottom-color:var(--geo-color-primary-border)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{margin:0 4px 0 0;padding:8px 16px;background:var(--geo-color-neutral-100);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius) var(--geo-radius) 0 0;color:var(--geo-color-neutral-500)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{background:var(--geo-color-neutral-white);border-color:var(--geo-color-primary-border);border-bottom-color:var(--geo-color-neutral-white);color:var(--geo-color-primary-default)}.geo-tabs--card .ant-tabs-tab-active .ant-tabs-tab-btn{color:var(--geo-color-primary-default)!important}.geo-tabs .ant-tabs-content-holder{color:var(--geo-color-neutral-900);font-size:14px;line-height:22px;min-width:0}.geo-tabs.ant-tabs-small .ant-tabs-tab{padding:6px 12px;font-size:13px}.geo-tabs.ant-tabs-large .ant-tabs-tab{padding:12px 20px;font-size:16px}@media (max-width: 1024px){.geo-tabs .ant-tabs-tab{padding:8px 12px;font-size:13px;line-height:18px}.geo-tabs.ant-tabs-large .ant-tabs-tab{padding:10px 14px;font-size:15px}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{padding:6px 12px}}@media (max-width: 767.98px){.geo-tabs .ant-tabs-nav{margin-bottom:12px}.geo-tabs .ant-tabs-nav-wrap{overflow:visible}.geo-tabs .ant-tabs-nav-list{flex-wrap:wrap;row-gap:0;width:100%;transform:none!important}.geo-tabs .ant-tabs-nav-operations,.geo-tabs .ant-tabs-ink-bar{display:none!important}.geo-tabs .ant-tabs-tab{height:auto;min-width:0;max-width:100%;flex:1 1 auto;margin:0;padding:8px 10px;font-size:12px;line-height:1.35;white-space:normal;text-align:center;border-bottom:2px solid transparent}.geo-tabs .ant-tabs-tab-btn{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.35}.geo-tabs .ant-tabs-tab-active{border-bottom-color:var(--geo-color-primary-default)}.geo-tabs.ant-tabs-small .ant-tabs-tab{padding:6px 8px;font-size:12px}.geo-tabs.ant-tabs-large .ant-tabs-tab{padding:8px 12px;font-size:14px}.geo-tabs.ant-tabs-top>.ant-tabs-nav:before,.geo-tabs.ant-tabs-top>div>.ant-tabs-nav:before{left:0;right:0;border-bottom:1px solid var(--geo-color-primary-border)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{margin:0 0 4px;flex:1 1 calc(50% - 4px);padding:8px 10px;border-radius:var(--geo-radius);border-bottom-color:var(--geo-color-primary-border)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{border-color:var(--geo-color-primary-default);border-bottom-color:var(--geo-color-primary-default);background:var(--geo-color-neutral-white)}.geo-tabs.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:before,.geo-tabs.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:after,.geo-tabs.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.geo-tabs.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{flex:0 0 0;content:none}}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$8.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact", "nzDestroyInactiveTabPane"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i1$8.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2482
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoTabsComponent, isStandalone: true, selector: "geo-tabs", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedKey: { classPropertyName: "selectedKey", publicName: "selectedKey", isSignal: true, isRequired: false, transformFunction: null }, centered: { classPropertyName: "centered", publicName: "centered", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedIndex: "selectedIndexChange", selectedKey: "selectedKeyChange", tabChange: "tabChange" }, host: { properties: { "class.geo-tabs-host--card": "type() === \"card\"", "class.geo-tabs-host--line": "type() === \"line\"" }, classAttribute: "geo-tabs-host" }, queries: [{ propertyName: "tabTemplates", predicate: GeoTabDirective }], ngImport: i0, template: "<nz-tabset\n class=\"geo-tabs\"\n [class.geo-tabs--card]=\"type() === 'card'\"\n [class.geo-tabs--line]=\"type() === 'line'\"\n [nzType]=\"type()\"\n [nzSize]=\"size()\"\n [nzSelectedIndex]=\"resolvedSelectedIndex()\"\n [nzCentered]=\"centered()\"\n [nzAnimated]=\"animated()\"\n (nzSelectedIndexChange)=\"onSelectedIndexChange($event)\"\n>\n @for (item of items(); track item.key) {\n <nz-tab [nzTitle]=\"item.title\" [nzDisabled]=\"item.disabled ?? false\">\n @if (getTemplate(item.key); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n }\n </nz-tab>\n }\n</nz-tabset>\n", styles: ["@charset \"UTF-8\";.geo-tabs-host{display:block;width:100%;min-width:0;max-width:100%}.geo-tabs.ant-tabs{color:var(--geo-color-neutral-900);min-width:0;width:100%}.geo-tabs .ant-tabs-nav{margin-bottom:16px}.geo-tabs .ant-tabs-nav-wrap{min-width:0;flex:1 1 auto}.geo-tabs .ant-tabs-nav-list{flex-wrap:nowrap}.geo-tabs .ant-tabs-tab{padding:10px 16px;font-size:14px;line-height:20px;color:var(--geo-color-neutral-500);transition:color .15s ease}.geo-tabs .ant-tabs-tab:hover{color:var(--geo-color-primary-default)}.geo-tabs .ant-tabs-tab-btn{font-weight:500}.geo-tabs .ant-tabs-tab-active .ant-tabs-tab-btn{color:var(--geo-color-primary-default)!important;font-weight:600}.geo-tabs .ant-tabs-tab-disabled{color:var(--geo-color-neutral-400)!important;cursor:not-allowed}.geo-tabs .ant-tabs-ink-bar{background:var(--geo-color-primary-default);height:2px}.geo-tabs.ant-tabs-top>.ant-tabs-nav:before,.geo-tabs.ant-tabs-bottom>.ant-tabs-nav:before,.geo-tabs.ant-tabs-top>div>.ant-tabs-nav:before,.geo-tabs.ant-tabs-bottom>div>.ant-tabs-nav:before{border-bottom-color:var(--geo-color-primary-border)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{margin:0 4px 0 0;padding:8px 16px;background:var(--geo-color-neutral-100);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius) var(--geo-radius) 0 0;color:var(--geo-color-neutral-500)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{background:var(--geo-color-neutral-white);border-color:var(--geo-color-primary-border);border-bottom-color:var(--geo-color-neutral-white);color:var(--geo-color-primary-default)}.geo-tabs--card .ant-tabs-tab-active .ant-tabs-tab-btn{color:var(--geo-color-primary-default)!important}.geo-tabs .ant-tabs-content-holder{color:var(--geo-color-neutral-900);font-size:14px;line-height:22px;min-width:0}.geo-tabs.ant-tabs-small .ant-tabs-tab{padding:6px 12px;font-size:13px}.geo-tabs.ant-tabs-large .ant-tabs-tab{padding:12px 20px;font-size:16px}@media (max-width: 1024px){.geo-tabs .ant-tabs-tab{padding:8px 12px;font-size:13px;line-height:18px}.geo-tabs.ant-tabs-large .ant-tabs-tab{padding:10px 14px;font-size:15px}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{padding:6px 12px}}@media (max-width: 767.98px){.geo-tabs .ant-tabs-nav{margin-bottom:12px}.geo-tabs .ant-tabs-nav-wrap{overflow:visible}.geo-tabs .ant-tabs-nav-list{flex-wrap:wrap;row-gap:0;width:100%;transform:none!important}.geo-tabs .ant-tabs-nav-operations,.geo-tabs .ant-tabs-ink-bar{display:none!important}.geo-tabs .ant-tabs-tab{height:auto;min-width:0;max-width:100%;flex:1 1 auto;margin:0;padding:8px 10px;font-size:12px;line-height:1.35;white-space:normal;text-align:center;border-bottom:2px solid transparent}.geo-tabs .ant-tabs-tab-btn{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.35}.geo-tabs .ant-tabs-tab-active{border-bottom-color:var(--geo-color-primary-default)}.geo-tabs.ant-tabs-small .ant-tabs-tab{padding:6px 8px;font-size:12px}.geo-tabs.ant-tabs-large .ant-tabs-tab{padding:8px 12px;font-size:14px}.geo-tabs.ant-tabs-top>.ant-tabs-nav:before,.geo-tabs.ant-tabs-top>div>.ant-tabs-nav:before{left:0;right:0;border-bottom:1px solid var(--geo-color-primary-border)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{margin:0 0 4px;flex:1 1 calc(50% - 4px);padding:8px 10px;border-radius:var(--geo-radius);border-bottom-color:var(--geo-color-primary-border)}.geo-tabs--card.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.geo-tabs--card.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{border-color:var(--geo-color-primary-default);border-bottom-color:var(--geo-color-primary-default);background:var(--geo-color-neutral-white)}.geo-tabs.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:before,.geo-tabs.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:after,.geo-tabs.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.geo-tabs.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{flex:0 0 0;content:none}}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$9.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact", "nzDestroyInactiveTabPane"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i1$9.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2442
2483
  }
2443
2484
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTabsComponent, decorators: [{
2444
2485
  type: Component,
@@ -2452,6 +2493,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2452
2493
  args: [GeoTabDirective]
2453
2494
  }] } });
2454
2495
 
2496
+ class GeoAccordionPanelDirective {
2497
+ key = input.required({ alias: 'uiPanel' });
2498
+ template = inject((TemplateRef));
2499
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoAccordionPanelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2500
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: GeoAccordionPanelDirective, isStandalone: true, selector: "[uiPanel]", inputs: { key: { classPropertyName: "key", publicName: "uiPanel", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
2501
+ }
2502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoAccordionPanelDirective, decorators: [{
2503
+ type: Directive,
2504
+ args: [{
2505
+ selector: '[uiPanel]',
2506
+ standalone: true,
2507
+ }]
2508
+ }] });
2509
+ /**
2510
+ * Collapsible panel group.
2511
+ *
2512
+ * @summary Nhóm panel thu gọn/mở rộng (nz-collapse); mỗi panel chiếu nội dung qua `[uiPanel]`.
2513
+ * @whenToUse Gom nhiều nhóm thông tin dài trên cùng trang (FAQ, chi tiết theo mục).
2514
+ * @doNotUseWhen Điều hướng giữa các view ngang hàng — use geo-tabs.
2515
+ */
2516
+ class GeoAccordionComponent {
2517
+ items = input([]);
2518
+ /** `true` → chỉ 1 panel mở tại một thời điểm (maps to `nzAccordion`). */
2519
+ accordion = input(false);
2520
+ bordered = input(true);
2521
+ ghost = input(false);
2522
+ activeKeys = model([]);
2523
+ panelChange = output();
2524
+ panelTemplates;
2525
+ isActive(key) {
2526
+ return this.activeKeys().includes(key);
2527
+ }
2528
+ onActiveChange(key, active) {
2529
+ if (this.accordion()) {
2530
+ this.activeKeys.set(active ? [key] : []);
2531
+ }
2532
+ else {
2533
+ const next = new Set(this.activeKeys());
2534
+ if (active) {
2535
+ next.add(key);
2536
+ }
2537
+ else {
2538
+ next.delete(key);
2539
+ }
2540
+ this.activeKeys.set([...next]);
2541
+ }
2542
+ this.panelChange.emit({ key, active });
2543
+ }
2544
+ getTemplate(key) {
2545
+ return this.panelTemplates?.find((panel) => panel.key() === key)?.template ?? null;
2546
+ }
2547
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2548
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoAccordionComponent, isStandalone: true, selector: "geo-accordion", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, accordion: { classPropertyName: "accordion", publicName: "accordion", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, ghost: { classPropertyName: "ghost", publicName: "ghost", isSignal: true, isRequired: false, transformFunction: null }, activeKeys: { classPropertyName: "activeKeys", publicName: "activeKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeKeys: "activeKeysChange", panelChange: "panelChange" }, host: { classAttribute: "geo-accordion-host" }, queries: [{ propertyName: "panelTemplates", predicate: GeoAccordionPanelDirective }], ngImport: i0, template: "<nz-collapse\n class=\"geo-accordion\"\n [nzAccordion]=\"accordion()\"\n [nzBordered]=\"bordered()\"\n [nzGhost]=\"ghost()\"\n>\n @for (item of items(); track item.key) {\n <nz-collapse-panel\n [nzHeader]=\"item.title\"\n [nzActive]=\"isActive(item.key)\"\n [nzDisabled]=\"item.disabled ?? false\"\n [nzExtra]=\"item.extra ?? ''\"\n (nzActiveChange)=\"onActiveChange(item.key, $event)\"\n >\n @if (getTemplate(item.key); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n }\n </nz-collapse-panel>\n }\n</nz-collapse>\n", styles: [".geo-accordion-host{display:block;width:100%}.geo-accordion.ant-collapse{background:transparent;border-color:var(--geo-color-border-default);border-radius:var(--geo-radius)}.geo-accordion .ant-collapse-item{border-color:var(--geo-color-border-default)}.geo-accordion .ant-collapse-header{font-family:var(--geo-font-family);font-size:14px;font-weight:500;color:var(--geo-color-neutral-900);padding:12px 16px}.geo-accordion .ant-collapse-item-active>.ant-collapse-header{color:var(--geo-color-primary-default)}.geo-accordion .ant-collapse-item-disabled>.ant-collapse-header,.geo-accordion .ant-collapse-item-disabled>.ant-collapse-header .ant-collapse-header-text{color:var(--geo-color-neutral-disabled-text)}.geo-accordion .ant-collapse-content-box{padding:12px 16px 16px;font-size:14px;color:var(--geo-color-neutral-900)}.geo-accordion .ant-collapse-extra{color:var(--geo-color-neutral-500);font-size:13px}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$a.NzCollapsePanelComponent, selector: "nz-collapse-panel", inputs: ["nzActive", "nzDisabled", "nzShowArrow", "nzExtra", "nzHeader", "nzExpandedIcon"], outputs: ["nzActiveChange"], exportAs: ["nzCollapsePanel"] }, { kind: "component", type: i1$a.NzCollapseComponent, selector: "nz-collapse", inputs: ["nzAccordion", "nzBordered", "nzGhost", "nzExpandIconPosition"], exportAs: ["nzCollapse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2549
+ }
2550
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoAccordionComponent, decorators: [{
2551
+ type: Component,
2552
+ args: [{ selector: 'geo-accordion', standalone: true, imports: [NgZorroAntdModule, NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'geo-accordion-host' }, template: "<nz-collapse\n class=\"geo-accordion\"\n [nzAccordion]=\"accordion()\"\n [nzBordered]=\"bordered()\"\n [nzGhost]=\"ghost()\"\n>\n @for (item of items(); track item.key) {\n <nz-collapse-panel\n [nzHeader]=\"item.title\"\n [nzActive]=\"isActive(item.key)\"\n [nzDisabled]=\"item.disabled ?? false\"\n [nzExtra]=\"item.extra ?? ''\"\n (nzActiveChange)=\"onActiveChange(item.key, $event)\"\n >\n @if (getTemplate(item.key); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n }\n </nz-collapse-panel>\n }\n</nz-collapse>\n", styles: [".geo-accordion-host{display:block;width:100%}.geo-accordion.ant-collapse{background:transparent;border-color:var(--geo-color-border-default);border-radius:var(--geo-radius)}.geo-accordion .ant-collapse-item{border-color:var(--geo-color-border-default)}.geo-accordion .ant-collapse-header{font-family:var(--geo-font-family);font-size:14px;font-weight:500;color:var(--geo-color-neutral-900);padding:12px 16px}.geo-accordion .ant-collapse-item-active>.ant-collapse-header{color:var(--geo-color-primary-default)}.geo-accordion .ant-collapse-item-disabled>.ant-collapse-header,.geo-accordion .ant-collapse-item-disabled>.ant-collapse-header .ant-collapse-header-text{color:var(--geo-color-neutral-disabled-text)}.geo-accordion .ant-collapse-content-box{padding:12px 16px 16px;font-size:14px;color:var(--geo-color-neutral-900)}.geo-accordion .ant-collapse-extra{color:var(--geo-color-neutral-500);font-size:13px}\n"] }]
2553
+ }], propDecorators: { panelTemplates: [{
2554
+ type: ContentChildren,
2555
+ args: [GeoAccordionPanelDirective]
2556
+ }] } });
2557
+
2455
2558
  const DEFAULT_UI_ROW_ACTIONS = [
2456
2559
  { key: 'edit', icon: 'edit', title: 'Chỉnh sửa' },
2457
2560
  { key: 'more', icon: 'more', title: 'Thêm thao tác' },
@@ -2507,7 +2610,7 @@ class GeoRowActionsComponent {
2507
2610
  }
2508
2611
  }
2509
2612
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoRowActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2510
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoRowActionsComponent, isStandalone: true, selector: "geo-row-actions", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, primaryActionKey: { classPropertyName: "primaryActionKey", publicName: "primaryActionKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick", edit: "edit", more: "more" }, ngImport: i0, template: "<div class=\"geo-row-actions\">\n @for (action of inlineActions(); track action.key) {\n <button\n type=\"button\"\n class=\"geo-row-actions__btn\"\n [class.geo-row-actions__btn--danger]=\"action.danger\"\n [nz-tooltip]=\"action.title ?? action.label ?? ''\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label ?? action.title ?? action.key\"\n (click)=\"onActionClick($event, action)\"\n >\n <span nz-icon [nzType]=\"action.icon\" [nzTheme]=\"action.iconTheme ?? 'outline'\"></span>\n </button>\n }\n\n @if (hasOverflow()) {\n <button\n type=\"button\"\n class=\"geo-row-actions__btn\"\n nz-dropdown\n [nzDropdownMenu]=\"overflowMenu\"\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nz-tooltip=\"Th\u00EAm thao t\u00E1c\"\n aria-label=\"Th\u00EAm thao t\u00E1c\"\n (click)=\"$event.stopPropagation()\"\n >\n <span nz-icon nzType=\"more\" nzTheme=\"outline\"></span>\n </button>\n\n <nz-dropdown-menu #overflowMenu=\"nzDropdownMenu\">\n <div class=\"geo-row-actions__panel\" (click)=\"$event.stopPropagation()\">\n @for (action of overflowActions(); track action.key) {\n <button\n type=\"button\"\n class=\"geo-row-actions__panel-item\"\n [class.geo-row-actions__panel-item--danger]=\"action.danger\"\n [attr.aria-label]=\"action.label ?? action.title ?? action.key\"\n (click)=\"onActionClick($event, action)\"\n >\n <span\n class=\"geo-row-actions__panel-icon\"\n nz-icon\n [nzType]=\"action.icon\"\n [nzTheme]=\"action.iconTheme ?? 'outline'\"\n ></span>\n <span class=\"geo-row-actions__panel-label\">\n {{ action.label ?? action.title ?? action.key }}\n </span>\n </button>\n }\n </div>\n </nz-dropdown-menu>\n }\n</div>\n", styles: [":host{display:inline-block}.geo-row-actions{display:inline-flex;align-items:center;justify-content:center;gap:10px}.geo-row-actions__btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;transition:color .15s ease,background-color .15s ease}.geo-row-actions__btn:hover:not(:disabled){color:var(--geo-color-primary-default);background:color-mix(in srgb,var(--geo-color-primary-default) 10%,transparent)}.geo-row-actions__btn:disabled{cursor:not-allowed;opacity:.45}.geo-row-actions__btn--danger:hover:not(:disabled){color:var(--geo-color-error-default);background:#ee003314}.geo-row-actions__btn :deep(.anticon){font-size:16px}.geo-row-actions__panel{min-width:168px;padding:8px;background:var(--geo-color-neutral-white);border-radius:var(--geo-radius);box-shadow:0 6px 16px #00000014;display:flex;flex-direction:column;gap:4px}.geo-row-actions__panel-item{display:flex;align-items:center;gap:10px;width:100%;min-height:36px;padding:8px 12px;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-900);font-size:14px;line-height:20px;cursor:pointer;text-align:left;transition:color .15s ease,background-color .15s ease}.geo-row-actions__panel-item:hover{color:var(--geo-color-primary-default);background:color-mix(in srgb,var(--geo-color-primary-default) 10%,transparent)}.geo-row-actions__panel-item--danger:hover{color:var(--geo-color-error-default);background:#ee003314}.geo-row-actions__panel-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:16px;height:16px;color:inherit}.geo-row-actions__panel-icon :deep(.anticon){font-size:16px;line-height:1}.geo-row-actions__panel-label{flex:1;line-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "directive", type: i1$5.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i1.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2613
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoRowActionsComponent, isStandalone: true, selector: "geo-row-actions", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, primaryActionKey: { classPropertyName: "primaryActionKey", publicName: "primaryActionKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick", edit: "edit", more: "more" }, ngImport: i0, template: "<div class=\"geo-row-actions\">\n @for (action of inlineActions(); track action.key) {\n <button\n type=\"button\"\n class=\"geo-row-actions__btn\"\n [class.geo-row-actions__btn--danger]=\"action.danger\"\n [nz-tooltip]=\"action.title ?? action.label ?? ''\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label ?? action.title ?? action.key\"\n (click)=\"onActionClick($event, action)\"\n >\n <span nz-icon [nzType]=\"action.icon\" [nzTheme]=\"action.iconTheme ?? 'outline'\"></span>\n </button>\n }\n\n @if (hasOverflow()) {\n <button\n type=\"button\"\n class=\"geo-row-actions__btn\"\n nz-dropdown\n [nzDropdownMenu]=\"overflowMenu\"\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n nz-tooltip=\"Th\u00EAm thao t\u00E1c\"\n aria-label=\"Th\u00EAm thao t\u00E1c\"\n (click)=\"$event.stopPropagation()\"\n >\n <span nz-icon nzType=\"more\" nzTheme=\"outline\"></span>\n </button>\n\n <nz-dropdown-menu #overflowMenu=\"nzDropdownMenu\">\n <div class=\"geo-row-actions__panel\" (click)=\"$event.stopPropagation()\">\n @for (action of overflowActions(); track action.key) {\n <button\n type=\"button\"\n class=\"geo-row-actions__panel-item\"\n [class.geo-row-actions__panel-item--danger]=\"action.danger\"\n [attr.aria-label]=\"action.label ?? action.title ?? action.key\"\n (click)=\"onActionClick($event, action)\"\n >\n <span\n class=\"geo-row-actions__panel-icon\"\n nz-icon\n [nzType]=\"action.icon\"\n [nzTheme]=\"action.iconTheme ?? 'outline'\"\n ></span>\n <span class=\"geo-row-actions__panel-label\">\n {{ action.label ?? action.title ?? action.key }}\n </span>\n </button>\n }\n </div>\n </nz-dropdown-menu>\n }\n</div>\n", styles: [":host{display:inline-block}.geo-row-actions{display:inline-flex;align-items:center;justify-content:center;gap:10px}.geo-row-actions__btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;transition:color .15s ease,background-color .15s ease}.geo-row-actions__btn:hover:not(:disabled){color:var(--geo-color-primary-default);background:color-mix(in srgb,var(--geo-color-primary-default) 10%,transparent)}.geo-row-actions__btn:disabled{cursor:not-allowed;opacity:.45}.geo-row-actions__btn--danger:hover:not(:disabled){color:var(--geo-color-error-default);background:#ee003314}.geo-row-actions__btn :deep(.anticon){font-size:16px}.geo-row-actions__panel{min-width:168px;padding:8px;background:var(--geo-color-neutral-white);border-radius:var(--geo-radius);box-shadow:0 6px 16px #00000014;display:flex;flex-direction:column;gap:4px}.geo-row-actions__panel-item{display:flex;align-items:center;gap:10px;width:100%;min-height:36px;padding:8px 12px;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-900);font-size:14px;line-height:20px;cursor:pointer;text-align:left;transition:color .15s ease,background-color .15s ease}.geo-row-actions__panel-item:hover{color:var(--geo-color-primary-default);background:color-mix(in srgb,var(--geo-color-primary-default) 10%,transparent)}.geo-row-actions__panel-item--danger:hover{color:var(--geo-color-error-default);background:#ee003314}.geo-row-actions__panel-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:16px;height:16px;color:inherit}.geo-row-actions__panel-icon :deep(.anticon){font-size:16px;line-height:1}.geo-row-actions__panel-label{flex:1;line-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "directive", type: i1$6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i1.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2511
2614
  }
2512
2615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoRowActionsComponent, decorators: [{
2513
2616
  type: Component,
@@ -2854,7 +2957,7 @@ class GeoTableComponent {
2854
2957
  this.selectionChange.emit(selected);
2855
2958
  }
2856
2959
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2857
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoTableComponent, isStandalone: true, selector: "geo-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, outerBordered: { classPropertyName: "outerBordered", publicName: "outerBordered", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, tableLayout: { classPropertyName: "tableLayout", publicName: "tableLayout", isSignal: true, isRequired: false, transformFunction: null }, showPagination: { classPropertyName: "showPagination", publicName: "showPagination", isSignal: true, isRequired: false, transformFunction: null }, frontPagination: { classPropertyName: "frontPagination", publicName: "frontPagination", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, showSizeChanger: { classPropertyName: "showSizeChanger", publicName: "showSizeChanger", isSignal: true, isRequired: false, transformFunction: null }, showQuickJumper: { classPropertyName: "showQuickJumper", publicName: "showQuickJumper", isSignal: true, isRequired: false, transformFunction: null }, hideOnSinglePage: { classPropertyName: "hideOnSinglePage", publicName: "hideOnSinglePage", isSignal: true, isRequired: false, transformFunction: null }, simplePagination: { classPropertyName: "simplePagination", publicName: "simplePagination", isSignal: true, isRequired: false, transformFunction: null }, paginationPosition: { classPropertyName: "paginationPosition", publicName: "paginationPosition", isSignal: true, isRequired: false, transformFunction: null }, scroll: { classPropertyName: "scroll", publicName: "scroll", isSignal: true, isRequired: false, transformFunction: null }, scrollY: { classPropertyName: "scrollY", publicName: "scrollY", isSignal: true, isRequired: false, transformFunction: null }, autoScroll: { classPropertyName: "autoScroll", publicName: "autoScroll", isSignal: true, isRequired: false, transformFunction: null }, tableTitle: { classPropertyName: "tableTitle", publicName: "tableTitle", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "footer", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, showTotalRange: { classPropertyName: "showTotalRange", publicName: "showTotalRange", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null }, selectedKeys: { classPropertyName: "selectedKeys", publicName: "selectedKeys", isSignal: true, isRequired: false, transformFunction: null }, mobileTitleKey: { classPropertyName: "mobileTitleKey", publicName: "mobileTitleKey", isSignal: true, isRequired: false, transformFunction: null }, mobileCardView: { classPropertyName: "mobileCardView", publicName: "mobileCardView", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageIndex: "pageIndexChange", pageSize: "pageSizeChange", selectedKeys: "selectedKeysChange", rowClick: "rowClick", rowEdit: "rowEdit", rowMore: "rowMore", rowAction: "rowAction", queryParams: "queryParams", currentPageDataChange: "currentPageDataChange", selectionChange: "selectionChange" }, ngImport: i0, template: "<div\n class=\"geo-table\"\n [class.geo-table--striped]=\"striped()\"\n [class.geo-table--mobile-cards]=\"mobileCardView()\"\n>\n @if (shouldShowPagination() && (paginationPosition() === 'top' || paginationPosition() === 'both')) {\n <geo-table-pagination\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [total]=\"computedTotal()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [showSizeChanger]=\"showSizeChanger()\"\n [hideOnSinglePage]=\"hideOnSinglePage()\"\n [showTotalRange]=\"showTotalRange()\"\n (pageIndexChange)=\"onPageIndexChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n ></geo-table-pagination>\n }\n\n <div class=\"geo-table__desktop\">\n <nz-table\n #uiTable\n [nzData]=\"paginatedData()\"\n [nzLoading]=\"loading()\"\n [nzBordered]=\"bordered()\"\n [nzOuterBordered]=\"outerBordered()\"\n [nzSize]=\"size()\"\n [nzTitle]=\"tableTitle() ?? null\"\n [nzFooter]=\"footer() ?? null\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"computedScroll()\"\n [nzNoResult]=\"emptyText()\"\n [nzTableLayout]=\"computedTableLayout()\"\n [nzWidthConfig]=\"widthConfig()\"\n (nzQueryParams)=\"queryParams.emit($event)\"\n (nzCurrentPageDataChange)=\"currentPageDataChange.emit($event)\"\n >\n <thead>\n <tr>\n @if (selectable()) {\n <th\n class=\"geo-table__checkbox-cell\"\n nzWidth=\"48px\"\n [nzLeft]=\"hasFixedColumns()\"\n >\n <geo-checkbox\n [checked]=\"allChecked()\"\n [indeterminate]=\"indeterminate()\"\n (checkedChange)=\"onAllChecked($event)\"\n ></geo-checkbox>\n </th>\n }\n @for (col of visibleColumns(); track col.key) {\n <th\n [nzWidth]=\"col.width ?? null\"\n [nzAlign]=\"getHeaderAlign(col)\"\n [nzColumnKey]=\"col.key\"\n [nzShowSort]=\"col.sortable ?? false\"\n [nzSortOrder]=\"col.sortOrder ?? null\"\n [nzSortFn]=\"col.sortable ? getSortFn(col) : null\"\n [nzShowFilter]=\"hasFilters(col)\"\n [nzFilters]=\"col.filters ?? []\"\n [nzFilterMultiple]=\"col.filterMultiple ?? true\"\n [nzLeft]=\"col.fixed === 'left'\"\n [nzRight]=\"col.fixed === 'right'\"\n >{{ col.title }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of uiTable.data; track trackRow($index, row); let rowIndex = $index) {\n <tr\n class=\"geo-table__row\"\n [class.geo-table__row--selected]=\"isRowSelected(row)\"\n [class.geo-table__row--clickable]=\"clickable()\"\n (click)=\"clickable() && rowClick.emit(row)\"\n >\n @if (selectable()) {\n <td\n class=\"geo-table__checkbox-cell\"\n [nzLeft]=\"hasFixedColumns()\"\n (click)=\"$event.stopPropagation()\"\n >\n <geo-checkbox\n [checked]=\"isRowSelected(row)\"\n (checkedChange)=\"onItemChecked(row, $event)\"\n ></geo-checkbox>\n </td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td\n [nzAlign]=\"getCellAlign(col)\"\n [nzEllipsis]=\"col.wrap ? false : (col.ellipsis ?? false)\"\n [class.geo-table__cell--wrap]=\"col.wrap\"\n [nzLeft]=\"col.fixed === 'left'\"\n [nzRight]=\"col.fixed === 'right'\"\n [style.width]=\"col.width || null\"\n [style.minWidth]=\"col.width || null\"\n [style.maxWidth]=\"col.fixed ? (col.width || null) : null\"\n >\n @if (col.renderAs === 'index') {\n {{ getRowIndex(rowIndex) }}\n } @else if (col.renderAs === 'status') {\n <geo-status-tag\n [status]=\"getCellValue(row, col.key)\"\n [label]=\"col.statusLabelKey ? getCellValue(row, col.statusLabelKey) || undefined : undefined\"\n ></geo-status-tag>\n } @else if (col.renderAs === 'actions') {\n <geo-row-actions\n [actions]=\"getRowActions(col, row)\"\n [primaryActionKey]=\"col.primaryActionKey ?? 'edit'\"\n (actionClick)=\"onRowActionClick(row, $event)\"\n ></geo-row-actions>\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </nz-table>\n </div>\n\n @if (mobileCardView()) {\n <div\n class=\"geo-table__mobile\"\n [class.geo-table__mobile--loading]=\"loading()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n >\n @if (selectable() && paginatedData().length) {\n <div class=\"geo-table-card__select-all\">\n <geo-checkbox\n [checked]=\"allChecked()\"\n [indeterminate]=\"indeterminate()\"\n (checkedChange)=\"onAllChecked($event)\"\n ></geo-checkbox>\n <span>Ch\u1ECDn t\u1EA5t c\u1EA3 tr\u00EAn trang</span>\n </div>\n }\n\n @if (!paginatedData().length && !loading()) {\n <div class=\"geo-table__mobile-empty\">{{ emptyText() }}</div>\n }\n\n @for (row of paginatedData(); track trackRow($index, row); let rowIndex = $index) {\n <article\n class=\"geo-table-card\"\n [class.geo-table-card--selected]=\"isRowSelected(row)\"\n [class.geo-table-card--clickable]=\"clickable()\"\n (click)=\"onMobileCardClick(row, $event)\"\n >\n <header class=\"geo-table-card__header\">\n <div class=\"geo-table-card__title-wrap\">\n @if (selectable()) {\n <geo-checkbox\n class=\"geo-table-card__checkbox\"\n [checked]=\"isRowSelected(row)\"\n (checkedChange)=\"onItemChecked(row, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></geo-checkbox>\n }\n @if (mobileTitleColumn(); as titleCol) {\n <h3 class=\"geo-table-card__title\">\n <span class=\"geo-table-card__title-label\">{{ titleCol.title }}</span>\n <span class=\"geo-table-card__title-sep\">:</span>\n <span class=\"geo-table-card__title-value\">\n @if (titleCol.renderAs === 'index') {\n {{ getRowIndex(rowIndex) }}\n } @else {\n {{ getCellValue(row, titleCol.key) }}\n }\n </span>\n </h3>\n }\n </div>\n\n @if (mobileActionsColumn(); as actionsCol) {\n <div class=\"geo-table-card__actions\" (click)=\"$event.stopPropagation()\">\n <geo-row-actions\n [actions]=\"getMobileHeaderActions(actionsCol, row)\"\n [primaryActionKey]=\"actionsCol.primaryActionKey ?? 'edit'\"\n (actionClick)=\"onRowActionClick(row, $event)\"\n ></geo-row-actions>\n </div>\n }\n </header>\n\n @if (mobileBodyColumns().length) {\n <div class=\"geo-table-card__body\">\n @for (col of mobileBodyColumns(); track col.key) {\n <div class=\"geo-table-card__row\">\n <span class=\"geo-table-card__label\">{{ col.title }}</span>\n <span class=\"geo-table-card__sep\">:</span>\n <span class=\"geo-table-card__value\">\n @if (col.renderAs === 'index') {\n {{ getRowIndex(rowIndex) }}\n } @else if (col.renderAs === 'status') {\n <geo-status-tag\n [status]=\"getCellValue(row, col.key)\"\n [label]=\"col.statusLabelKey ? getCellValue(row, col.statusLabelKey) || undefined : undefined\"\n ></geo-status-tag>\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n </span>\n </div>\n }\n </div>\n }\n\n @if (mobileActionsColumn(); as actionsCol) {\n @if (getMobileFooterActions(actionsCol, row); as footerActions) {\n @if (footerActions.length) {\n <footer class=\"geo-table-card__footer\" (click)=\"$event.stopPropagation()\">\n @for (action of footerActions; track action.key) {\n <button\n type=\"button\"\n class=\"geo-table-card__footer-btn\"\n [class.geo-table-card__footer-btn--danger]=\"action.danger\"\n [disabled]=\"action.disabled\"\n (click)=\"onRowActionClick(row, action.key)\"\n >\n {{ action.label ?? action.title ?? action.key }}\n </button>\n }\n </footer>\n }\n }\n }\n </article>\n }\n </div>\n }\n\n @if (shouldShowPagination() && (paginationPosition() === 'bottom' || paginationPosition() === 'both')) {\n <geo-table-pagination\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [total]=\"computedTotal()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [showSizeChanger]=\"showSizeChanger()\"\n [hideOnSinglePage]=\"hideOnSinglePage()\"\n [showTotalRange]=\"showTotalRange()\"\n (pageIndexChange)=\"onPageIndexChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n ></geo-table-pagination>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;max-width:100%;min-width:0}.geo-table{width:100%;max-width:100%;min-width:0;border-radius:var(--geo-radius);overflow:clip}.geo-table__row--clickable{cursor:pointer}.geo-table__row--selected>td{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row)>td{background:var(--geo-color-neutral-100)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row)>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row)>td.ant-table-cell-fix-right{background:var(--geo-color-neutral-100)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row):hover>td,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row):hover>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row):hover>td.ant-table-cell-fix-right{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row--selected>td,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row--selected>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row--selected>td.ant-table-cell-fix-right{background:var(--geo-color-primary-background)}.geo-table__checkbox-cell{text-align:center;vertical-align:middle;padding-left:12px!important;padding-right:12px!important}.geo-table__cell--wrap{white-space:normal;word-break:break-word;overflow-wrap:anywhere}:host ::ng-deep .geo-table .ant-table{background:var(--geo-color-neutral-white);border-radius:var(--geo-radius)}:host ::ng-deep .geo-table .ant-table-container{border-radius:var(--geo-radius)}:host ::ng-deep .geo-table .ant-table-thead>tr>th{background:var(--geo-color-neutral-100)!important;color:var(--geo-color-neutral-900)!important;font-weight:600;font-size:14px;line-height:20px;height:44px;padding:12px 10px!important;white-space:nowrap;text-align:center;border-bottom:1px solid var(--geo-color-primary-border)!important;box-sizing:border-box}:host ::ng-deep .geo-table .ant-table-body>table>thead{display:none!important}:host ::ng-deep .geo-table .ant-table-tbody>tr.ant-table-measure-now,:host ::ng-deep .geo-table .ant-table-tbody>tr[nz-table-measure-row]{height:0!important;font-size:0!important;line-height:0!important}:host ::ng-deep .geo-table .ant-table-tbody>tr.ant-table-measure-now>td,:host ::ng-deep .geo-table .ant-table-tbody>tr[nz-table-measure-row]>td{padding:0!important;border:0!important;height:0!important;min-height:0!important;line-height:0!important;font-size:0!important}:host ::ng-deep .geo-table .ant-table-tbody>tr>td{color:var(--geo-color-neutral-900);font-size:14px;line-height:normal;min-height:48px;padding:12px 10px!important;vertical-align:middle;border-bottom:1px solid var(--geo-color-primary-border)!important;box-sizing:border-box}:host ::ng-deep .geo-table .ant-table-tbody>tr:hover>td{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table .ant-table-bordered .ant-table-container{border-color:var(--geo-color-primary-border)}:host ::ng-deep .geo-table .geo-table__row-actions{display:inline-flex;align-items:center;justify-content:center;gap:10px}:host ::ng-deep .geo-table .geo-table__action-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;transition:color .15s ease,background-color .15s ease}:host ::ng-deep .geo-table .geo-table__action-icon:hover{color:var(--geo-color-primary-default);background:color-mix(in srgb,var(--geo-color-primary-default) 10%,transparent)}:host ::ng-deep .geo-table .ant-table-wrapper,:host ::ng-deep .geo-table .ant-spin-nested-loading,:host ::ng-deep .geo-table .ant-spin-container{width:100%;max-width:100%}:host ::ng-deep .geo-table .ant-table{width:100%}:host ::ng-deep .geo-table .ant-table-container{border-radius:var(--geo-radius);overflow:clip}:host ::ng-deep .geo-table .ant-table-body{overflow-x:auto!important;-webkit-overflow-scrolling:touch}:host ::ng-deep .geo-table .ant-table-content{overflow-x:auto;-webkit-overflow-scrolling:touch}:host ::ng-deep .geo-table .ant-table-header.nz-table-hide-scrollbar{overflow-x:hidden!important;overflow-y:scroll!important;scrollbar-gutter:stable}:host ::ng-deep .geo-table .ant-table-body{scrollbar-gutter:stable}:host ::ng-deep .geo-table .ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-cell-fix-right{background:var(--geo-color-neutral-white)}:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-right{background:var(--geo-color-neutral-100)!important}:host ::ng-deep .geo-table .ant-table-tbody>tr:hover>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-tbody>tr:hover>td.ant-table-cell-fix-right{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-right,:host ::ng-deep .geo-table .ant-table-tbody>tr>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-tbody>tr>td.ant-table-cell-fix-right{box-sizing:border-box}:host ::ng-deep .geo-table .ant-table-ping-left:not(.ant-table-ping-right) .ant-table-cell-fix-left-last:after{box-shadow:inset 10px 0 8px -8px #0000001f}:host ::ng-deep .geo-table .ant-table-ping-right:not(.ant-table-ping-left) .ant-table-cell-fix-right-first:after{box-shadow:inset -10px 0 8px -8px #0000001f}.geo-table__mobile{display:none}@media (max-width: 767.98px){.geo-table--mobile-cards{overflow:visible}.geo-table--mobile-cards .geo-table__desktop{display:none}.geo-table--mobile-cards .geo-table__mobile{display:flex;flex-direction:column;gap:12px;padding:0}}.geo-table__mobile--loading{opacity:.55;pointer-events:none}.geo-table__mobile-empty{padding:32px 16px;text-align:center;color:var(--geo-color-neutral-500);font-size:14px;background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius)}.geo-table-card__select-all{display:flex;align-items:center;gap:8px;padding:8px 4px;font-size:14px;color:var(--geo-color-neutral-700)}.geo-table-card{background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius);box-shadow:0 1px 2px #0000000a;overflow:hidden}.geo-table-card--clickable{cursor:pointer}.geo-table-card--selected{border-color:var(--geo-color-primary-light);box-shadow:0 0 0 1px color-mix(in srgb,var(--geo-color-primary-default) 25%,transparent)}.geo-table-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 14px 10px}.geo-table-card__title-wrap{display:flex;align-items:flex-start;gap:8px;min-width:0;flex:1}.geo-table-card__checkbox{flex-shrink:0;margin-top:2px}.geo-table-card__title{margin:0;min-width:0;font-size:15px;font-weight:700;line-height:1.4;color:var(--geo-color-neutral-900);word-break:break-word}.geo-table-card__title-label,.geo-table-card__title-sep,.geo-table-card__title-value{font-weight:700;color:var(--geo-color-neutral-900)}.geo-table-card__title-sep{margin-inline:4px}.geo-table-card__actions{flex-shrink:0}:host ::ng-deep .geo-table-card__actions .geo-row-actions{gap:8px}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn{width:32px;height:32px;border-radius:var(--geo-radius);background:#1890ff1a;color:var(--geo-color-info-default)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn:hover:not(:disabled){background:#1890ff2e;color:var(--geo-color-info-dark)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn--danger{background:#ee003314;color:var(--geo-color-error-default)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn--danger:hover:not(:disabled){background:#ee003324;color:var(--geo-color-error-dark)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn :deep(.anticon),:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn .anticon{font-size:16px}.geo-table-card__body{display:flex;flex-direction:column;gap:10px;padding:4px 14px 14px}.geo-table-card__row{display:flex;align-items:flex-start;flex-wrap:wrap;column-gap:4px;row-gap:2px;font-size:14px;line-height:1.45}.geo-table-card__label,.geo-table-card__sep{color:var(--geo-color-neutral-700);font-weight:400;flex-shrink:0}.geo-table-card__value{color:var(--geo-color-neutral-900);font-weight:700;min-width:0;word-break:break-word}.geo-table-card__footer{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;padding:12px 14px;background:var(--geo-color-info-light);border-top:1px solid var(--geo-color-info-light)}.geo-table-card__footer-btn{appearance:none;border:0;background:transparent;padding:0 8px;min-height:24px;font-size:14px;font-weight:600;line-height:1.4;color:var(--geo-color-info-default);cursor:pointer}.geo-table-card__footer-btn:hover:not(:disabled){color:var(--geo-color-info-dark);text-decoration:underline}.geo-table-card__footer-btn:disabled{opacity:.45;cursor:not-allowed}.geo-table-card__footer-btn--danger{color:var(--geo-color-error-default)}.geo-table-card__footer-btn--danger:hover:not(:disabled){color:var(--geo-color-error-dark)}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$9.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i1$9.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i1$9.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i1$9.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i1$9.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i1$9.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i1$9.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i1$9.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i1$9.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "directive", type: i1$9.NzCellEllipsisDirective, selector: "th[nzEllipsis],td[nzEllipsis]", inputs: ["nzEllipsis"] }, { kind: "component", type: GeoStatusTagComponent, selector: "geo-status-tag", inputs: ["status", "label", "showDot"] }, { kind: "component", type: GeoRowActionsComponent, selector: "geo-row-actions", inputs: ["actions", "primaryActionKey"], outputs: ["actionClick", "edit", "more"] }, { kind: "component", type: GeoCheckboxComponent, selector: "geo-checkbox", inputs: ["label", "checked", "disabled", "indeterminate"], outputs: ["checkedChange"] }, { kind: "component", type: GeoTablePaginationComponent, selector: "geo-table-pagination", inputs: ["pageIndex", "pageSize", "total", "pageSizeOptions", "showSizeChanger", "hideOnSinglePage", "showTotalRange", "sizeLabel"], outputs: ["pageIndexChange", "pageSizeChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2960
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoTableComponent, isStandalone: true, selector: "geo-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, outerBordered: { classPropertyName: "outerBordered", publicName: "outerBordered", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, tableLayout: { classPropertyName: "tableLayout", publicName: "tableLayout", isSignal: true, isRequired: false, transformFunction: null }, showPagination: { classPropertyName: "showPagination", publicName: "showPagination", isSignal: true, isRequired: false, transformFunction: null }, frontPagination: { classPropertyName: "frontPagination", publicName: "frontPagination", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, showSizeChanger: { classPropertyName: "showSizeChanger", publicName: "showSizeChanger", isSignal: true, isRequired: false, transformFunction: null }, showQuickJumper: { classPropertyName: "showQuickJumper", publicName: "showQuickJumper", isSignal: true, isRequired: false, transformFunction: null }, hideOnSinglePage: { classPropertyName: "hideOnSinglePage", publicName: "hideOnSinglePage", isSignal: true, isRequired: false, transformFunction: null }, simplePagination: { classPropertyName: "simplePagination", publicName: "simplePagination", isSignal: true, isRequired: false, transformFunction: null }, paginationPosition: { classPropertyName: "paginationPosition", publicName: "paginationPosition", isSignal: true, isRequired: false, transformFunction: null }, scroll: { classPropertyName: "scroll", publicName: "scroll", isSignal: true, isRequired: false, transformFunction: null }, scrollY: { classPropertyName: "scrollY", publicName: "scrollY", isSignal: true, isRequired: false, transformFunction: null }, autoScroll: { classPropertyName: "autoScroll", publicName: "autoScroll", isSignal: true, isRequired: false, transformFunction: null }, tableTitle: { classPropertyName: "tableTitle", publicName: "tableTitle", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "footer", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, showTotalRange: { classPropertyName: "showTotalRange", publicName: "showTotalRange", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null }, selectedKeys: { classPropertyName: "selectedKeys", publicName: "selectedKeys", isSignal: true, isRequired: false, transformFunction: null }, mobileTitleKey: { classPropertyName: "mobileTitleKey", publicName: "mobileTitleKey", isSignal: true, isRequired: false, transformFunction: null }, mobileCardView: { classPropertyName: "mobileCardView", publicName: "mobileCardView", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageIndex: "pageIndexChange", pageSize: "pageSizeChange", selectedKeys: "selectedKeysChange", rowClick: "rowClick", rowEdit: "rowEdit", rowMore: "rowMore", rowAction: "rowAction", queryParams: "queryParams", currentPageDataChange: "currentPageDataChange", selectionChange: "selectionChange" }, ngImport: i0, template: "<div\n class=\"geo-table\"\n [class.geo-table--striped]=\"striped()\"\n [class.geo-table--mobile-cards]=\"mobileCardView()\"\n>\n @if (shouldShowPagination() && (paginationPosition() === 'top' || paginationPosition() === 'both')) {\n <geo-table-pagination\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [total]=\"computedTotal()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [showSizeChanger]=\"showSizeChanger()\"\n [hideOnSinglePage]=\"hideOnSinglePage()\"\n [showTotalRange]=\"showTotalRange()\"\n (pageIndexChange)=\"onPageIndexChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n ></geo-table-pagination>\n }\n\n <div class=\"geo-table__desktop\">\n <nz-table\n #uiTable\n [nzData]=\"paginatedData()\"\n [nzLoading]=\"loading()\"\n [nzBordered]=\"bordered()\"\n [nzOuterBordered]=\"outerBordered()\"\n [nzSize]=\"size()\"\n [nzTitle]=\"tableTitle() ?? null\"\n [nzFooter]=\"footer() ?? null\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"computedScroll()\"\n [nzNoResult]=\"emptyText()\"\n [nzTableLayout]=\"computedTableLayout()\"\n [nzWidthConfig]=\"widthConfig()\"\n (nzQueryParams)=\"queryParams.emit($event)\"\n (nzCurrentPageDataChange)=\"currentPageDataChange.emit($event)\"\n >\n <thead>\n <tr>\n @if (selectable()) {\n <th\n class=\"geo-table__checkbox-cell\"\n nzWidth=\"48px\"\n [nzLeft]=\"hasFixedColumns()\"\n >\n <geo-checkbox\n [checked]=\"allChecked()\"\n [indeterminate]=\"indeterminate()\"\n (checkedChange)=\"onAllChecked($event)\"\n ></geo-checkbox>\n </th>\n }\n @for (col of visibleColumns(); track col.key) {\n <th\n [nzWidth]=\"col.width ?? null\"\n [nzAlign]=\"getHeaderAlign(col)\"\n [nzColumnKey]=\"col.key\"\n [nzShowSort]=\"col.sortable ?? false\"\n [nzSortOrder]=\"col.sortOrder ?? null\"\n [nzSortFn]=\"col.sortable ? getSortFn(col) : null\"\n [nzShowFilter]=\"hasFilters(col)\"\n [nzFilters]=\"col.filters ?? []\"\n [nzFilterMultiple]=\"col.filterMultiple ?? true\"\n [nzLeft]=\"col.fixed === 'left'\"\n [nzRight]=\"col.fixed === 'right'\"\n >{{ col.title }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of uiTable.data; track trackRow($index, row); let rowIndex = $index) {\n <tr\n class=\"geo-table__row\"\n [class.geo-table__row--selected]=\"isRowSelected(row)\"\n [class.geo-table__row--clickable]=\"clickable()\"\n (click)=\"clickable() && rowClick.emit(row)\"\n >\n @if (selectable()) {\n <td\n class=\"geo-table__checkbox-cell\"\n [nzLeft]=\"hasFixedColumns()\"\n (click)=\"$event.stopPropagation()\"\n >\n <geo-checkbox\n [checked]=\"isRowSelected(row)\"\n (checkedChange)=\"onItemChecked(row, $event)\"\n ></geo-checkbox>\n </td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td\n [nzAlign]=\"getCellAlign(col)\"\n [nzEllipsis]=\"col.wrap ? false : (col.ellipsis ?? false)\"\n [class.geo-table__cell--wrap]=\"col.wrap\"\n [nzLeft]=\"col.fixed === 'left'\"\n [nzRight]=\"col.fixed === 'right'\"\n [style.width]=\"col.width || null\"\n [style.minWidth]=\"col.width || null\"\n [style.maxWidth]=\"col.fixed ? (col.width || null) : null\"\n >\n @if (col.renderAs === 'index') {\n {{ getRowIndex(rowIndex) }}\n } @else if (col.renderAs === 'status') {\n <geo-status-tag\n [status]=\"getCellValue(row, col.key)\"\n [label]=\"col.statusLabelKey ? getCellValue(row, col.statusLabelKey) || undefined : undefined\"\n ></geo-status-tag>\n } @else if (col.renderAs === 'actions') {\n <geo-row-actions\n [actions]=\"getRowActions(col, row)\"\n [primaryActionKey]=\"col.primaryActionKey ?? 'edit'\"\n (actionClick)=\"onRowActionClick(row, $event)\"\n ></geo-row-actions>\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </nz-table>\n </div>\n\n @if (mobileCardView()) {\n <div\n class=\"geo-table__mobile\"\n [class.geo-table__mobile--loading]=\"loading()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n >\n @if (selectable() && paginatedData().length) {\n <div class=\"geo-table-card__select-all\">\n <geo-checkbox\n [checked]=\"allChecked()\"\n [indeterminate]=\"indeterminate()\"\n (checkedChange)=\"onAllChecked($event)\"\n ></geo-checkbox>\n <span>Ch\u1ECDn t\u1EA5t c\u1EA3 tr\u00EAn trang</span>\n </div>\n }\n\n @if (!paginatedData().length && !loading()) {\n <div class=\"geo-table__mobile-empty\">{{ emptyText() }}</div>\n }\n\n @for (row of paginatedData(); track trackRow($index, row); let rowIndex = $index) {\n <article\n class=\"geo-table-card\"\n [class.geo-table-card--selected]=\"isRowSelected(row)\"\n [class.geo-table-card--clickable]=\"clickable()\"\n (click)=\"onMobileCardClick(row, $event)\"\n >\n <header class=\"geo-table-card__header\">\n <div class=\"geo-table-card__title-wrap\">\n @if (selectable()) {\n <geo-checkbox\n class=\"geo-table-card__checkbox\"\n [checked]=\"isRowSelected(row)\"\n (checkedChange)=\"onItemChecked(row, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></geo-checkbox>\n }\n @if (mobileTitleColumn(); as titleCol) {\n <h3 class=\"geo-table-card__title\">\n <span class=\"geo-table-card__title-label\">{{ titleCol.title }}</span>\n <span class=\"geo-table-card__title-sep\">:</span>\n <span class=\"geo-table-card__title-value\">\n @if (titleCol.renderAs === 'index') {\n {{ getRowIndex(rowIndex) }}\n } @else {\n {{ getCellValue(row, titleCol.key) }}\n }\n </span>\n </h3>\n }\n </div>\n\n @if (mobileActionsColumn(); as actionsCol) {\n <div class=\"geo-table-card__actions\" (click)=\"$event.stopPropagation()\">\n <geo-row-actions\n [actions]=\"getMobileHeaderActions(actionsCol, row)\"\n [primaryActionKey]=\"actionsCol.primaryActionKey ?? 'edit'\"\n (actionClick)=\"onRowActionClick(row, $event)\"\n ></geo-row-actions>\n </div>\n }\n </header>\n\n @if (mobileBodyColumns().length) {\n <div class=\"geo-table-card__body\">\n @for (col of mobileBodyColumns(); track col.key) {\n <div class=\"geo-table-card__row\">\n <span class=\"geo-table-card__label\">{{ col.title }}</span>\n <span class=\"geo-table-card__sep\">:</span>\n <span class=\"geo-table-card__value\">\n @if (col.renderAs === 'index') {\n {{ getRowIndex(rowIndex) }}\n } @else if (col.renderAs === 'status') {\n <geo-status-tag\n [status]=\"getCellValue(row, col.key)\"\n [label]=\"col.statusLabelKey ? getCellValue(row, col.statusLabelKey) || undefined : undefined\"\n ></geo-status-tag>\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n </span>\n </div>\n }\n </div>\n }\n\n @if (mobileActionsColumn(); as actionsCol) {\n @if (getMobileFooterActions(actionsCol, row); as footerActions) {\n @if (footerActions.length) {\n <footer class=\"geo-table-card__footer\" (click)=\"$event.stopPropagation()\">\n @for (action of footerActions; track action.key) {\n <button\n type=\"button\"\n class=\"geo-table-card__footer-btn\"\n [class.geo-table-card__footer-btn--danger]=\"action.danger\"\n [disabled]=\"action.disabled\"\n (click)=\"onRowActionClick(row, action.key)\"\n >\n {{ action.label ?? action.title ?? action.key }}\n </button>\n }\n </footer>\n }\n }\n }\n </article>\n }\n </div>\n }\n\n @if (shouldShowPagination() && (paginationPosition() === 'bottom' || paginationPosition() === 'both')) {\n <geo-table-pagination\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [total]=\"computedTotal()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [showSizeChanger]=\"showSizeChanger()\"\n [hideOnSinglePage]=\"hideOnSinglePage()\"\n [showTotalRange]=\"showTotalRange()\"\n (pageIndexChange)=\"onPageIndexChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n ></geo-table-pagination>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;max-width:100%;min-width:0}.geo-table{width:100%;max-width:100%;min-width:0;border-radius:var(--geo-radius);overflow:clip}.geo-table__row--clickable{cursor:pointer}.geo-table__row--selected>td{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row)>td{background:var(--geo-color-neutral-100)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row)>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row)>td.ant-table-cell-fix-right{background:var(--geo-color-neutral-100)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row):hover>td,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row):hover>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row:nth-child(2n of.geo-table__row):hover>td.ant-table-cell-fix-right{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row--selected>td,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row--selected>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table--striped .ant-table-tbody>tr.geo-table__row--selected>td.ant-table-cell-fix-right{background:var(--geo-color-primary-background)}.geo-table__checkbox-cell{text-align:center;vertical-align:middle;padding-left:12px!important;padding-right:12px!important}.geo-table__cell--wrap{white-space:normal;word-break:break-word;overflow-wrap:anywhere}:host ::ng-deep .geo-table .ant-table{background:var(--geo-color-neutral-white);border-radius:var(--geo-radius)}:host ::ng-deep .geo-table .ant-table-container{border-radius:var(--geo-radius)}:host ::ng-deep .geo-table .ant-table-thead>tr>th{background:var(--geo-color-neutral-100)!important;color:var(--geo-color-neutral-900)!important;font-weight:600;font-size:14px;line-height:20px;height:44px;padding:12px 10px!important;white-space:nowrap;text-align:center;border-bottom:1px solid var(--geo-color-primary-border)!important;box-sizing:border-box}:host ::ng-deep .geo-table .ant-table-body>table>thead{display:none!important}:host ::ng-deep .geo-table .ant-table-tbody>tr.ant-table-measure-now,:host ::ng-deep .geo-table .ant-table-tbody>tr[nz-table-measure-row]{height:0!important;font-size:0!important;line-height:0!important}:host ::ng-deep .geo-table .ant-table-tbody>tr.ant-table-measure-now>td,:host ::ng-deep .geo-table .ant-table-tbody>tr[nz-table-measure-row]>td{padding:0!important;border:0!important;height:0!important;min-height:0!important;line-height:0!important;font-size:0!important}:host ::ng-deep .geo-table .ant-table-tbody>tr>td{color:var(--geo-color-neutral-900);font-size:14px;line-height:normal;min-height:48px;padding:12px 10px!important;vertical-align:middle;border-bottom:1px solid var(--geo-color-primary-border)!important;box-sizing:border-box}:host ::ng-deep .geo-table .ant-table-tbody>tr:hover>td{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table .ant-table-bordered .ant-table-container{border-color:var(--geo-color-primary-border)}:host ::ng-deep .geo-table .geo-table__row-actions{display:inline-flex;align-items:center;justify-content:center;gap:10px}:host ::ng-deep .geo-table .geo-table__action-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-500);cursor:pointer;transition:color .15s ease,background-color .15s ease}:host ::ng-deep .geo-table .geo-table__action-icon:hover{color:var(--geo-color-primary-default);background:color-mix(in srgb,var(--geo-color-primary-default) 10%,transparent)}:host ::ng-deep .geo-table .ant-table-wrapper,:host ::ng-deep .geo-table .ant-spin-nested-loading,:host ::ng-deep .geo-table .ant-spin-container{width:100%;max-width:100%}:host ::ng-deep .geo-table .ant-table{width:100%}:host ::ng-deep .geo-table .ant-table-container{border-radius:var(--geo-radius);overflow:clip}:host ::ng-deep .geo-table .ant-table-body{overflow-x:auto!important;-webkit-overflow-scrolling:touch}:host ::ng-deep .geo-table .ant-table-content{overflow-x:auto;-webkit-overflow-scrolling:touch}:host ::ng-deep .geo-table .ant-table-header.nz-table-hide-scrollbar{overflow-x:hidden!important;overflow-y:scroll!important;scrollbar-gutter:stable}:host ::ng-deep .geo-table .ant-table-body{scrollbar-gutter:stable}:host ::ng-deep .geo-table .ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-cell-fix-right{background:var(--geo-color-neutral-white)}:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-right{background:var(--geo-color-neutral-100)!important}:host ::ng-deep .geo-table .ant-table-tbody>tr:hover>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-tbody>tr:hover>td.ant-table-cell-fix-right{background:var(--geo-color-primary-background)}:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-thead>tr>th.ant-table-cell-fix-right,:host ::ng-deep .geo-table .ant-table-tbody>tr>td.ant-table-cell-fix-left,:host ::ng-deep .geo-table .ant-table-tbody>tr>td.ant-table-cell-fix-right{box-sizing:border-box}:host ::ng-deep .geo-table .ant-table-ping-left:not(.ant-table-ping-right) .ant-table-cell-fix-left-last:after{box-shadow:inset 10px 0 8px -8px #0000001f}:host ::ng-deep .geo-table .ant-table-ping-right:not(.ant-table-ping-left) .ant-table-cell-fix-right-first:after{box-shadow:inset -10px 0 8px -8px #0000001f}.geo-table__mobile{display:none}@media (max-width: 767.98px){.geo-table--mobile-cards{overflow:visible}.geo-table--mobile-cards .geo-table__desktop{display:none}.geo-table--mobile-cards .geo-table__mobile{display:flex;flex-direction:column;gap:12px;padding:0}}.geo-table__mobile--loading{opacity:.55;pointer-events:none}.geo-table__mobile-empty{padding:32px 16px;text-align:center;color:var(--geo-color-neutral-500);font-size:14px;background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius)}.geo-table-card__select-all{display:flex;align-items:center;gap:8px;padding:8px 4px;font-size:14px;color:var(--geo-color-neutral-700)}.geo-table-card{background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius);box-shadow:0 1px 2px #0000000a;overflow:hidden}.geo-table-card--clickable{cursor:pointer}.geo-table-card--selected{border-color:var(--geo-color-primary-light);box-shadow:0 0 0 1px color-mix(in srgb,var(--geo-color-primary-default) 25%,transparent)}.geo-table-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 14px 10px}.geo-table-card__title-wrap{display:flex;align-items:flex-start;gap:8px;min-width:0;flex:1}.geo-table-card__checkbox{flex-shrink:0;margin-top:2px}.geo-table-card__title{margin:0;min-width:0;font-size:15px;font-weight:700;line-height:1.4;color:var(--geo-color-neutral-900);word-break:break-word}.geo-table-card__title-label,.geo-table-card__title-sep,.geo-table-card__title-value{font-weight:700;color:var(--geo-color-neutral-900)}.geo-table-card__title-sep{margin-inline:4px}.geo-table-card__actions{flex-shrink:0}:host ::ng-deep .geo-table-card__actions .geo-row-actions{gap:8px}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn{width:32px;height:32px;border-radius:var(--geo-radius);background:#1890ff1a;color:var(--geo-color-info-default)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn:hover:not(:disabled){background:#1890ff2e;color:var(--geo-color-info-dark)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn--danger{background:#ee003314;color:var(--geo-color-error-default)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn--danger:hover:not(:disabled){background:#ee003324;color:var(--geo-color-error-dark)}:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn :deep(.anticon),:host ::ng-deep .geo-table-card__actions .geo-row-actions__btn .anticon{font-size:16px}.geo-table-card__body{display:flex;flex-direction:column;gap:10px;padding:4px 14px 14px}.geo-table-card__row{display:flex;align-items:flex-start;flex-wrap:wrap;column-gap:4px;row-gap:2px;font-size:14px;line-height:1.45}.geo-table-card__label,.geo-table-card__sep{color:var(--geo-color-neutral-700);font-weight:400;flex-shrink:0}.geo-table-card__value{color:var(--geo-color-neutral-900);font-weight:700;min-width:0;word-break:break-word}.geo-table-card__footer{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;padding:12px 14px;background:var(--geo-color-info-light);border-top:1px solid var(--geo-color-info-light)}.geo-table-card__footer-btn{appearance:none;border:0;background:transparent;padding:0 8px;min-height:24px;font-size:14px;font-weight:600;line-height:1.4;color:var(--geo-color-info-default);cursor:pointer}.geo-table-card__footer-btn:hover:not(:disabled){color:var(--geo-color-info-dark);text-decoration:underline}.geo-table-card__footer-btn:disabled{opacity:.45;cursor:not-allowed}.geo-table-card__footer-btn--danger{color:var(--geo-color-error-default)}.geo-table-card__footer-btn--danger:hover:not(:disabled){color:var(--geo-color-error-dark)}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$b.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i1$b.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i1$b.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i1$b.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i1$b.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i1$b.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i1$b.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i1$b.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i1$b.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "directive", type: i1$b.NzCellEllipsisDirective, selector: "th[nzEllipsis],td[nzEllipsis]", inputs: ["nzEllipsis"] }, { kind: "component", type: GeoStatusTagComponent, selector: "geo-status-tag", inputs: ["status", "label", "showDot"] }, { kind: "component", type: GeoRowActionsComponent, selector: "geo-row-actions", inputs: ["actions", "primaryActionKey"], outputs: ["actionClick", "edit", "more"] }, { kind: "component", type: GeoCheckboxComponent, selector: "geo-checkbox", inputs: ["label", "checked", "disabled", "indeterminate"], outputs: ["checkedChange"] }, { kind: "component", type: GeoTablePaginationComponent, selector: "geo-table-pagination", inputs: ["pageIndex", "pageSize", "total", "pageSizeOptions", "showSizeChanger", "hideOnSinglePage", "showTotalRange", "sizeLabel"], outputs: ["pageIndexChange", "pageSizeChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2858
2961
  }
2859
2962
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTableComponent, decorators: [{
2860
2963
  type: Component,
@@ -3229,31 +3332,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3229
3332
  class GeoTreeComponent {
3230
3333
  nodes = input([]);
3231
3334
  checkable = input(false);
3232
- /** `single` — click chọn đúng 1 node (BR-06-03); `multi` — giữ hành vi checkbox hiện có. */
3233
- selectionMode = input('multi');
3234
3335
  checkedKeys = model([]);
3235
- selectedKeys = model([]);
3236
3336
  expandedKeys = model([]);
3237
3337
  showLine = input(false);
3238
3338
  blockNode = input(false);
3239
3339
  nodeClick = output();
3240
- onNodeClick(event) {
3241
- this.nodeClick.emit(event);
3242
- if (this.selectionMode() !== 'single') {
3243
- return;
3244
- }
3245
- const key = event.node?.key;
3246
- if (key == null) {
3247
- return;
3248
- }
3249
- this.selectedKeys.set([key]);
3250
- }
3251
3340
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3252
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoTreeComponent, isStandalone: true, selector: "geo-tree", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, checkedKeys: { classPropertyName: "checkedKeys", publicName: "checkedKeys", isSignal: true, isRequired: false, transformFunction: null }, selectedKeys: { classPropertyName: "selectedKeys", publicName: "selectedKeys", isSignal: true, isRequired: false, transformFunction: null }, expandedKeys: { classPropertyName: "expandedKeys", publicName: "expandedKeys", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, blockNode: { classPropertyName: "blockNode", publicName: "blockNode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedKeys: "checkedKeysChange", selectedKeys: "selectedKeysChange", expandedKeys: "expandedKeysChange", nodeClick: "nodeClick" }, host: { classAttribute: "geo-tree-host" }, ngImport: i0, template: "<div class=\"geo-tree\">\n <nz-tree\n [nzData]=\"nodes()\"\n [nzCheckable]=\"checkable()\"\n [nzCheckedKeys]=\"checkedKeys()\"\n [nzSelectedKeys]=\"selectedKeys()\"\n [nzMultiple]=\"false\"\n [nzExpandedKeys]=\"expandedKeys()\"\n [nzShowLine]=\"showLine()\"\n [nzBlockNode]=\"blockNode()\"\n (nzCheckedKeysChange)=\"checkedKeys.set($event)\"\n (nzExpandedKeysChange)=\"expandedKeys.set($event)\"\n (nzClick)=\"onNodeClick($event)\"\n ></nz-tree>\n</div>\n", styles: [".geo-tree-host{display:block;width:100%}.geo-tree{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: NzTreeModule }, { kind: "component", type: i1$a.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckBoxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3341
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoTreeComponent, isStandalone: true, selector: "geo-tree", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, checkedKeys: { classPropertyName: "checkedKeys", publicName: "checkedKeys", isSignal: true, isRequired: false, transformFunction: null }, expandedKeys: { classPropertyName: "expandedKeys", publicName: "expandedKeys", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, blockNode: { classPropertyName: "blockNode", publicName: "blockNode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedKeys: "checkedKeysChange", expandedKeys: "expandedKeysChange", nodeClick: "nodeClick" }, host: { classAttribute: "geo-tree-host" }, ngImport: i0, template: "<div class=\"geo-tree\">\n <nz-tree\n [nzData]=\"nodes()\"\n [nzCheckable]=\"checkable()\"\n [nzCheckedKeys]=\"checkedKeys()\"\n [nzExpandedKeys]=\"expandedKeys()\"\n [nzShowLine]=\"showLine()\"\n [nzBlockNode]=\"blockNode()\"\n (nzCheckedKeysChange)=\"checkedKeys.set($event)\"\n (nzExpandedKeysChange)=\"expandedKeys.set($event)\"\n (nzClick)=\"nodeClick.emit($event)\"\n ></nz-tree>\n</div>\n", styles: [".geo-tree-host{display:block;width:100%}.geo-tree{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: NzTreeModule }, { kind: "component", type: i1$c.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckBoxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3253
3342
  }
3254
3343
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTreeComponent, decorators: [{
3255
3344
  type: Component,
3256
- args: [{ selector: 'geo-tree', standalone: true, imports: [NzTreeModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'geo-tree-host' }, template: "<div class=\"geo-tree\">\n <nz-tree\n [nzData]=\"nodes()\"\n [nzCheckable]=\"checkable()\"\n [nzCheckedKeys]=\"checkedKeys()\"\n [nzSelectedKeys]=\"selectedKeys()\"\n [nzMultiple]=\"false\"\n [nzExpandedKeys]=\"expandedKeys()\"\n [nzShowLine]=\"showLine()\"\n [nzBlockNode]=\"blockNode()\"\n (nzCheckedKeysChange)=\"checkedKeys.set($event)\"\n (nzExpandedKeysChange)=\"expandedKeys.set($event)\"\n (nzClick)=\"onNodeClick($event)\"\n ></nz-tree>\n</div>\n", styles: [".geo-tree-host{display:block;width:100%}.geo-tree{width:100%}\n"] }]
3345
+ args: [{ selector: 'geo-tree', standalone: true, imports: [NzTreeModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'geo-tree-host' }, template: "<div class=\"geo-tree\">\n <nz-tree\n [nzData]=\"nodes()\"\n [nzCheckable]=\"checkable()\"\n [nzCheckedKeys]=\"checkedKeys()\"\n [nzExpandedKeys]=\"expandedKeys()\"\n [nzShowLine]=\"showLine()\"\n [nzBlockNode]=\"blockNode()\"\n (nzCheckedKeysChange)=\"checkedKeys.set($event)\"\n (nzExpandedKeysChange)=\"expandedKeys.set($event)\"\n (nzClick)=\"nodeClick.emit($event)\"\n ></nz-tree>\n</div>\n", styles: [".geo-tree-host{display:block;width:100%}.geo-tree{width:100%}\n"] }]
3257
3346
  }] });
3258
3347
 
3259
3348
  const STORAGE_PREFIX = 'geo-column-picker:';
@@ -3325,7 +3414,7 @@ class GeoColumnPickerComponent {
3325
3414
  this.draftItems = this.items().map((item) => ({ ...item }));
3326
3415
  }
3327
3416
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoColumnPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3328
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoColumnPickerComponent, isStandalone: true, selector: "geo-column-picker", inputs: { triggerLabel: { classPropertyName: "triggerLabel", publicName: "triggerLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, storageKey: { classPropertyName: "storageKey", publicName: "storageKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apply: "apply" }, ngImport: i0, template: "<div\n class=\"geo-column-picker__trigger\"\n nz-dropdown\n [nzDropdownMenu]=\"menu\"\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n [(nzVisible)]=\"dropdownVisible\"\n (nzVisibleChange)=\"onDropdownVisibleChange($event)\"\n>\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"eye-invisible\"\n [title]=\"triggerLabel()\"\n >\n {{ triggerLabel() }}\n </geo-button>\n</div>\n\n<nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"geo-column-picker__panel\" (click)=\"$event.stopPropagation()\">\n <p class=\"geo-column-picker__hint\">{{ hint() }}</p>\n\n <div class=\"geo-column-picker__list\">\n @for (item of draftItems; track item.key) {\n <div class=\"geo-column-picker__row\">\n <geo-checkbox\n class=\"geo-column-picker__item\"\n [label]=\"item.title\"\n [checked]=\"item.visible\"\n [disabled]=\"item.locked ?? false\"\n (checkedChange)=\"onItemChange(item.key, $event)\"\n ></geo-checkbox>\n </div>\n }\n </div>\n\n <div class=\"geo-column-picker__actions\">\n <button nz-button nzType=\"default\" nzSize=\"small\" (click)=\"onReset()\">\u0110\u1EB7t l\u1EA1i</button>\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"onApply()\">\u00C1p d\u1EE5ng</button>\n </div>\n </div>\n</nz-dropdown-menu>\n", styles: [":host{display:inline-block}.geo-column-picker__trigger{display:inline-flex}.geo-column-picker__panel{width:320px;padding:12px 16px 16px;background:var(--geo-color-neutral-white);border-radius:var(--geo-radius);box-shadow:0 6px 16px #00000014}.geo-column-picker__hint{margin:0 0 12px;color:var(--geo-color-neutral-500);font-size:13px;line-height:20px}.geo-column-picker__list{display:flex;flex-direction:column;gap:8px;max-height:320px;overflow-y:auto}.geo-column-picker__row{display:flex;align-items:center;gap:8px}.geo-column-picker__item{display:flex;align-items:center;flex:1;min-width:0}.geo-column-picker__actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid var(--geo-color-neutral-100)}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$b.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i1$5.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i3$1.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoCheckboxComponent, selector: "geo-checkbox", inputs: ["label", "checked", "disabled", "indeterminate"], outputs: ["checkedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3417
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoColumnPickerComponent, isStandalone: true, selector: "geo-column-picker", inputs: { triggerLabel: { classPropertyName: "triggerLabel", publicName: "triggerLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, storageKey: { classPropertyName: "storageKey", publicName: "storageKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apply: "apply" }, ngImport: i0, template: "<div\n class=\"geo-column-picker__trigger\"\n nz-dropdown\n [nzDropdownMenu]=\"menu\"\n nzTrigger=\"click\"\n nzPlacement=\"bottomRight\"\n [(nzVisible)]=\"dropdownVisible\"\n (nzVisibleChange)=\"onDropdownVisibleChange($event)\"\n>\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"eye-invisible\"\n [title]=\"triggerLabel()\"\n >\n {{ triggerLabel() }}\n </geo-button>\n</div>\n\n<nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"geo-column-picker__panel\" (click)=\"$event.stopPropagation()\">\n <p class=\"geo-column-picker__hint\">{{ hint() }}</p>\n\n <div class=\"geo-column-picker__list\">\n @for (item of draftItems; track item.key) {\n <div class=\"geo-column-picker__row\">\n <geo-checkbox\n class=\"geo-column-picker__item\"\n [label]=\"item.title\"\n [checked]=\"item.visible\"\n [disabled]=\"item.locked ?? false\"\n (checkedChange)=\"onItemChange(item.key, $event)\"\n ></geo-checkbox>\n </div>\n }\n </div>\n\n <div class=\"geo-column-picker__actions\">\n <button nz-button nzType=\"default\" nzSize=\"small\" (click)=\"onReset()\">\u0110\u1EB7t l\u1EA1i</button>\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"onApply()\">\u00C1p d\u1EE5ng</button>\n </div>\n </div>\n</nz-dropdown-menu>\n", styles: [":host{display:inline-block}.geo-column-picker__trigger{display:inline-flex}.geo-column-picker__panel{width:320px;padding:12px 16px 16px;background:var(--geo-color-neutral-white);border-radius:var(--geo-radius);box-shadow:0 6px 16px #00000014}.geo-column-picker__hint{margin:0 0 12px;color:var(--geo-color-neutral-500);font-size:13px;line-height:20px}.geo-column-picker__list{display:flex;flex-direction:column;gap:8px;max-height:320px;overflow-y:auto}.geo-column-picker__row{display:flex;align-items:center;gap:8px}.geo-column-picker__item{display:flex;align-items:center;flex:1;min-width:0}.geo-column-picker__actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid var(--geo-color-neutral-100)}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$d.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i1$6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i3$1.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoCheckboxComponent, selector: "geo-checkbox", inputs: ["label", "checked", "disabled", "indeterminate"], outputs: ["checkedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3329
3418
  }
3330
3419
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoColumnPickerComponent, decorators: [{
3331
3420
  type: Component,
@@ -3611,17 +3700,6 @@ class GeoChartComponent {
3611
3700
  colorOf(item, index) {
3612
3701
  return item.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length];
3613
3702
  }
3614
- /**
3615
- * `@for` track dùng qua method thay vì `item.id ?? item.label` trực tiếp trong template —
3616
- * Angular linker (18.2.14) sinh sai scope biến tạm cho track expression chứa `??` khi bị
3617
- * hoist lên module scope, gây `ReferenceError: tmp_x_0 is not defined` lúc chạy.
3618
- */
3619
- trackDatum(item) {
3620
- return item.id ?? item.label;
3621
- }
3622
- trackSegment(seg) {
3623
- return seg.datum.id ?? seg.datum.label;
3624
- }
3625
3703
  barWidth(value) {
3626
3704
  const max = this.maxValue() || 1;
3627
3705
  return `${Math.max(2, (value / max) * 100)}%`;
@@ -3634,11 +3712,11 @@ class GeoChartComponent {
3634
3712
  this.segmentClick.emit({ datum, index });
3635
3713
  }
3636
3714
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3637
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoChartComponent, isStandalone: true, selector: "geo-chart", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, showSort: { classPropertyName: "showSort", publicName: "showSort", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", segmentClick: "segmentClick", sortChange: "sortChange" }, host: { classAttribute: "geo-chart-host" }, ngImport: i0, template: "<div class=\"geo-chart\" [style.--geo-chart-height.px]=\"height()\">\n <header class=\"geo-chart__header\">\n @if (title()) {\n <h3 class=\"geo-chart__title\">{{ title() }}</h3>\n }\n @if (showSort() && type() === 'bar') {\n <div class=\"geo-chart__sort\" role=\"group\" aria-label=\"S\u1EAFp x\u1EBFp\">\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'desc'\"\n (clicked)=\"setSort('desc')\"\n >\n Gi\u1EA3m d\u1EA7n\n </geo-button>\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'asc'\"\n (clicked)=\"setSort('asc')\"\n >\n T\u0103ng d\u1EA7n\n </geo-button>\n </div>\n }\n </header>\n\n @if (!sortedData().length) {\n <geo-empty-state [title]=\"emptyText()\" icon=\"bar-chart\" />\n } @else if (type() === 'bar') {\n <div class=\"geo-chart__bars\" role=\"img\" [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 c\u1ED9t'\">\n @for (item of sortedData(); track trackDatum(item); let i = $index) {\n <button\n type=\"button\"\n class=\"geo-chart__bar-row\"\n (click)=\"onSegment(item, i)\"\n >\n <span class=\"geo-chart__bar-label\" [title]=\"item.label\">{{ item.label }}</span>\n <span class=\"geo-chart__bar-track\">\n <span\n class=\"geo-chart__bar-fill\"\n [style.width]=\"barWidth(item.value)\"\n [style.background]=\"colorOf(item, i)\"\n ></span>\n </span>\n <span class=\"geo-chart__bar-value\">\n {{ item.value }}{{ unit() ? ' ' + unit() : '' }}\n </span>\n </button>\n }\n </div>\n } @else {\n <div class=\"geo-chart__donut-wrap\">\n <svg\n class=\"geo-chart__donut\"\n viewBox=\"0 0 140 140\"\n role=\"img\"\n [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 donut'\"\n >\n <circle\n class=\"geo-chart__donut-track\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n />\n @for (seg of donutSegments(); track trackSegment(seg)) {\n <circle\n class=\"geo-chart__donut-seg\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n [attr.stroke]=\"seg.color\"\n [attr.stroke-dasharray]=\"seg.dasharray\"\n [attr.stroke-dashoffset]=\"seg.dashoffset\"\n transform=\"rotate(-90 70 70)\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n />\n }\n <text x=\"70\" y=\"66\" text-anchor=\"middle\" class=\"geo-chart__donut-center-label\">\n T\u1ED5ng\n </text>\n <text x=\"70\" y=\"84\" text-anchor=\"middle\" class=\"geo-chart__donut-center-value\">\n {{ total() }}\n </text>\n </svg>\n\n @if (showLegend()) {\n <ul class=\"geo-chart__legend\">\n @for (seg of donutSegments(); track trackSegment(seg)) {\n <li>\n <button\n type=\"button\"\n class=\"geo-chart__legend-item\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n >\n <span\n class=\"geo-chart__swatch\"\n [style.background]=\"seg.color\"\n ></span>\n <span class=\"geo-chart__legend-label\">{{ seg.datum.label }}</span>\n <span class=\"geo-chart__legend-value\">{{ seg.percent }}%</span>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n }\n</div>\n", styles: [".geo-chart-host{display:block}.geo-chart{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);min-height:var(--geo-chart-height, 260px)}.geo-chart__header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.geo-chart__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-chart__sort{display:inline-flex;gap:4px}.geo-chart__bars{display:flex;flex-direction:column;gap:10px;max-height:calc(var(--geo-chart-height, 260px) - 48px);overflow:auto;padding-right:4px}.geo-chart__bar-row{display:grid;grid-template-columns:minmax(88px,140px) 1fr auto;align-items:center;gap:10px;margin:0;padding:0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__bar-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-700)}.geo-chart__bar-track{height:12px;border-radius:var(--geo-radius-sm);background:var(--geo-color-neutral-100);overflow:hidden}.geo-chart__bar-fill{display:block;height:100%;border-radius:inherit;transition:width .2s ease}.geo-chart__bar-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-800);white-space:nowrap}.geo-chart__donut-wrap{display:flex;align-items:center;gap:20px;flex-wrap:wrap}.geo-chart__donut{width:180px;height:180px;flex-shrink:0}.geo-chart__donut-track{stroke:var(--geo-color-neutral-100)}.geo-chart__donut-seg{cursor:pointer;transition:opacity .15s ease}.geo-chart__donut-seg:hover{opacity:.85}.geo-chart__donut-center-label{fill:var(--geo-color-neutral-500);font-size:11px}.geo-chart__donut-center-value{fill:var(--geo-color-neutral-900);font-size:16px;font-weight:600}.geo-chart__legend{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px;flex:1;min-width:160px}.geo-chart__legend-item{display:grid;grid-template-columns:12px 1fr auto;align-items:center;gap:8px;width:100%;margin:0;padding:4px 0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__swatch{width:12px;height:12px;border-radius:2px}.geo-chart__legend-label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-chart__legend-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-600)}\n"], dependencies: [{ kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoEmptyStateComponent, selector: "geo-empty-state", inputs: ["title", "description", "icon", "actionLabel"], outputs: ["actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3715
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoChartComponent, isStandalone: true, selector: "geo-chart", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, showSort: { classPropertyName: "showSort", publicName: "showSort", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", segmentClick: "segmentClick", sortChange: "sortChange" }, host: { classAttribute: "geo-chart-host" }, ngImport: i0, template: "<div class=\"geo-chart\" [style.--geo-chart-height.px]=\"height()\">\n <header class=\"geo-chart__header\">\n @if (title()) {\n <h3 class=\"geo-chart__title\">{{ title() }}</h3>\n }\n @if (showSort() && type() === 'bar') {\n <div class=\"geo-chart__sort\" role=\"group\" aria-label=\"S\u1EAFp x\u1EBFp\">\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'desc'\"\n (clicked)=\"setSort('desc')\"\n >\n Gi\u1EA3m d\u1EA7n\n </geo-button>\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'asc'\"\n (clicked)=\"setSort('asc')\"\n >\n T\u0103ng d\u1EA7n\n </geo-button>\n </div>\n }\n </header>\n\n @if (!sortedData().length) {\n <geo-empty-state [title]=\"emptyText()\" icon=\"bar-chart\" />\n } @else if (type() === 'bar') {\n <div class=\"geo-chart__bars\" role=\"img\" [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 c\u1ED9t'\">\n @for (item of sortedData(); track item.id ?? item.label; let i = $index) {\n <button\n type=\"button\"\n class=\"geo-chart__bar-row\"\n (click)=\"onSegment(item, i)\"\n >\n <span class=\"geo-chart__bar-label\" [title]=\"item.label\">{{ item.label }}</span>\n <span class=\"geo-chart__bar-track\">\n <span\n class=\"geo-chart__bar-fill\"\n [style.width]=\"barWidth(item.value)\"\n [style.background]=\"colorOf(item, i)\"\n ></span>\n </span>\n <span class=\"geo-chart__bar-value\">\n {{ item.value }}{{ unit() ? ' ' + unit() : '' }}\n </span>\n </button>\n }\n </div>\n } @else {\n <div class=\"geo-chart__donut-wrap\">\n <svg\n class=\"geo-chart__donut\"\n viewBox=\"0 0 140 140\"\n role=\"img\"\n [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 donut'\"\n >\n <circle\n class=\"geo-chart__donut-track\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n />\n @for (seg of donutSegments(); track seg.datum.id ?? seg.datum.label) {\n <circle\n class=\"geo-chart__donut-seg\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n [attr.stroke]=\"seg.color\"\n [attr.stroke-dasharray]=\"seg.dasharray\"\n [attr.stroke-dashoffset]=\"seg.dashoffset\"\n transform=\"rotate(-90 70 70)\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n />\n }\n <text x=\"70\" y=\"66\" text-anchor=\"middle\" class=\"geo-chart__donut-center-label\">\n T\u1ED5ng\n </text>\n <text x=\"70\" y=\"84\" text-anchor=\"middle\" class=\"geo-chart__donut-center-value\">\n {{ total() }}\n </text>\n </svg>\n\n @if (showLegend()) {\n <ul class=\"geo-chart__legend\">\n @for (seg of donutSegments(); track seg.datum.id ?? seg.datum.label) {\n <li>\n <button\n type=\"button\"\n class=\"geo-chart__legend-item\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n >\n <span\n class=\"geo-chart__swatch\"\n [style.background]=\"seg.color\"\n ></span>\n <span class=\"geo-chart__legend-label\">{{ seg.datum.label }}</span>\n <span class=\"geo-chart__legend-value\">{{ seg.percent }}%</span>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n }\n</div>\n", styles: [".geo-chart-host{display:block}.geo-chart{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);min-height:var(--geo-chart-height, 260px)}.geo-chart__header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.geo-chart__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-chart__sort{display:inline-flex;gap:4px}.geo-chart__bars{display:flex;flex-direction:column;gap:10px;max-height:calc(var(--geo-chart-height, 260px) - 48px);overflow:auto;padding-right:4px}.geo-chart__bar-row{display:grid;grid-template-columns:minmax(88px,140px) 1fr auto;align-items:center;gap:10px;margin:0;padding:0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__bar-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-700)}.geo-chart__bar-track{height:12px;border-radius:var(--geo-radius-sm);background:var(--geo-color-neutral-100);overflow:hidden}.geo-chart__bar-fill{display:block;height:100%;border-radius:inherit;transition:width .2s ease}.geo-chart__bar-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-800);white-space:nowrap}.geo-chart__donut-wrap{display:flex;align-items:center;gap:20px;flex-wrap:wrap}.geo-chart__donut{width:180px;height:180px;flex-shrink:0}.geo-chart__donut-track{stroke:var(--geo-color-neutral-100)}.geo-chart__donut-seg{cursor:pointer;transition:opacity .15s ease}.geo-chart__donut-seg:hover{opacity:.85}.geo-chart__donut-center-label{fill:var(--geo-color-neutral-500);font-size:11px}.geo-chart__donut-center-value{fill:var(--geo-color-neutral-900);font-size:16px;font-weight:600}.geo-chart__legend{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px;flex:1;min-width:160px}.geo-chart__legend-item{display:grid;grid-template-columns:12px 1fr auto;align-items:center;gap:8px;width:100%;margin:0;padding:4px 0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__swatch{width:12px;height:12px;border-radius:2px}.geo-chart__legend-label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-chart__legend-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-600)}\n"], dependencies: [{ kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoEmptyStateComponent, selector: "geo-empty-state", inputs: ["title", "description", "icon", "actionLabel"], outputs: ["actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3638
3716
  }
3639
3717
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoChartComponent, decorators: [{
3640
3718
  type: Component,
3641
- args: [{ selector: 'geo-chart', standalone: true, imports: [GeoButtonComponent, GeoEmptyStateComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-chart-host' }, template: "<div class=\"geo-chart\" [style.--geo-chart-height.px]=\"height()\">\n <header class=\"geo-chart__header\">\n @if (title()) {\n <h3 class=\"geo-chart__title\">{{ title() }}</h3>\n }\n @if (showSort() && type() === 'bar') {\n <div class=\"geo-chart__sort\" role=\"group\" aria-label=\"S\u1EAFp x\u1EBFp\">\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'desc'\"\n (clicked)=\"setSort('desc')\"\n >\n Gi\u1EA3m d\u1EA7n\n </geo-button>\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'asc'\"\n (clicked)=\"setSort('asc')\"\n >\n T\u0103ng d\u1EA7n\n </geo-button>\n </div>\n }\n </header>\n\n @if (!sortedData().length) {\n <geo-empty-state [title]=\"emptyText()\" icon=\"bar-chart\" />\n } @else if (type() === 'bar') {\n <div class=\"geo-chart__bars\" role=\"img\" [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 c\u1ED9t'\">\n @for (item of sortedData(); track trackDatum(item); let i = $index) {\n <button\n type=\"button\"\n class=\"geo-chart__bar-row\"\n (click)=\"onSegment(item, i)\"\n >\n <span class=\"geo-chart__bar-label\" [title]=\"item.label\">{{ item.label }}</span>\n <span class=\"geo-chart__bar-track\">\n <span\n class=\"geo-chart__bar-fill\"\n [style.width]=\"barWidth(item.value)\"\n [style.background]=\"colorOf(item, i)\"\n ></span>\n </span>\n <span class=\"geo-chart__bar-value\">\n {{ item.value }}{{ unit() ? ' ' + unit() : '' }}\n </span>\n </button>\n }\n </div>\n } @else {\n <div class=\"geo-chart__donut-wrap\">\n <svg\n class=\"geo-chart__donut\"\n viewBox=\"0 0 140 140\"\n role=\"img\"\n [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 donut'\"\n >\n <circle\n class=\"geo-chart__donut-track\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n />\n @for (seg of donutSegments(); track trackSegment(seg)) {\n <circle\n class=\"geo-chart__donut-seg\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n [attr.stroke]=\"seg.color\"\n [attr.stroke-dasharray]=\"seg.dasharray\"\n [attr.stroke-dashoffset]=\"seg.dashoffset\"\n transform=\"rotate(-90 70 70)\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n />\n }\n <text x=\"70\" y=\"66\" text-anchor=\"middle\" class=\"geo-chart__donut-center-label\">\n T\u1ED5ng\n </text>\n <text x=\"70\" y=\"84\" text-anchor=\"middle\" class=\"geo-chart__donut-center-value\">\n {{ total() }}\n </text>\n </svg>\n\n @if (showLegend()) {\n <ul class=\"geo-chart__legend\">\n @for (seg of donutSegments(); track trackSegment(seg)) {\n <li>\n <button\n type=\"button\"\n class=\"geo-chart__legend-item\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n >\n <span\n class=\"geo-chart__swatch\"\n [style.background]=\"seg.color\"\n ></span>\n <span class=\"geo-chart__legend-label\">{{ seg.datum.label }}</span>\n <span class=\"geo-chart__legend-value\">{{ seg.percent }}%</span>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n }\n</div>\n", styles: [".geo-chart-host{display:block}.geo-chart{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);min-height:var(--geo-chart-height, 260px)}.geo-chart__header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.geo-chart__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-chart__sort{display:inline-flex;gap:4px}.geo-chart__bars{display:flex;flex-direction:column;gap:10px;max-height:calc(var(--geo-chart-height, 260px) - 48px);overflow:auto;padding-right:4px}.geo-chart__bar-row{display:grid;grid-template-columns:minmax(88px,140px) 1fr auto;align-items:center;gap:10px;margin:0;padding:0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__bar-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-700)}.geo-chart__bar-track{height:12px;border-radius:var(--geo-radius-sm);background:var(--geo-color-neutral-100);overflow:hidden}.geo-chart__bar-fill{display:block;height:100%;border-radius:inherit;transition:width .2s ease}.geo-chart__bar-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-800);white-space:nowrap}.geo-chart__donut-wrap{display:flex;align-items:center;gap:20px;flex-wrap:wrap}.geo-chart__donut{width:180px;height:180px;flex-shrink:0}.geo-chart__donut-track{stroke:var(--geo-color-neutral-100)}.geo-chart__donut-seg{cursor:pointer;transition:opacity .15s ease}.geo-chart__donut-seg:hover{opacity:.85}.geo-chart__donut-center-label{fill:var(--geo-color-neutral-500);font-size:11px}.geo-chart__donut-center-value{fill:var(--geo-color-neutral-900);font-size:16px;font-weight:600}.geo-chart__legend{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px;flex:1;min-width:160px}.geo-chart__legend-item{display:grid;grid-template-columns:12px 1fr auto;align-items:center;gap:8px;width:100%;margin:0;padding:4px 0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__swatch{width:12px;height:12px;border-radius:2px}.geo-chart__legend-label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-chart__legend-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-600)}\n"] }]
3719
+ args: [{ selector: 'geo-chart', standalone: true, imports: [GeoButtonComponent, GeoEmptyStateComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-chart-host' }, template: "<div class=\"geo-chart\" [style.--geo-chart-height.px]=\"height()\">\n <header class=\"geo-chart__header\">\n @if (title()) {\n <h3 class=\"geo-chart__title\">{{ title() }}</h3>\n }\n @if (showSort() && type() === 'bar') {\n <div class=\"geo-chart__sort\" role=\"group\" aria-label=\"S\u1EAFp x\u1EBFp\">\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'desc'\"\n (clicked)=\"setSort('desc')\"\n >\n Gi\u1EA3m d\u1EA7n\n </geo-button>\n <geo-button\n appearance=\"tertiary\"\n [active]=\"sort() === 'asc'\"\n (clicked)=\"setSort('asc')\"\n >\n T\u0103ng d\u1EA7n\n </geo-button>\n </div>\n }\n </header>\n\n @if (!sortedData().length) {\n <geo-empty-state [title]=\"emptyText()\" icon=\"bar-chart\" />\n } @else if (type() === 'bar') {\n <div class=\"geo-chart__bars\" role=\"img\" [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 c\u1ED9t'\">\n @for (item of sortedData(); track item.id ?? item.label; let i = $index) {\n <button\n type=\"button\"\n class=\"geo-chart__bar-row\"\n (click)=\"onSegment(item, i)\"\n >\n <span class=\"geo-chart__bar-label\" [title]=\"item.label\">{{ item.label }}</span>\n <span class=\"geo-chart__bar-track\">\n <span\n class=\"geo-chart__bar-fill\"\n [style.width]=\"barWidth(item.value)\"\n [style.background]=\"colorOf(item, i)\"\n ></span>\n </span>\n <span class=\"geo-chart__bar-value\">\n {{ item.value }}{{ unit() ? ' ' + unit() : '' }}\n </span>\n </button>\n }\n </div>\n } @else {\n <div class=\"geo-chart__donut-wrap\">\n <svg\n class=\"geo-chart__donut\"\n viewBox=\"0 0 140 140\"\n role=\"img\"\n [attr.aria-label]=\"title() || 'Bi\u1EC3u \u0111\u1ED3 donut'\"\n >\n <circle\n class=\"geo-chart__donut-track\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n />\n @for (seg of donutSegments(); track seg.datum.id ?? seg.datum.label) {\n <circle\n class=\"geo-chart__donut-seg\"\n cx=\"70\"\n cy=\"70\"\n r=\"56\"\n fill=\"none\"\n stroke-width=\"18\"\n [attr.stroke]=\"seg.color\"\n [attr.stroke-dasharray]=\"seg.dasharray\"\n [attr.stroke-dashoffset]=\"seg.dashoffset\"\n transform=\"rotate(-90 70 70)\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n />\n }\n <text x=\"70\" y=\"66\" text-anchor=\"middle\" class=\"geo-chart__donut-center-label\">\n T\u1ED5ng\n </text>\n <text x=\"70\" y=\"84\" text-anchor=\"middle\" class=\"geo-chart__donut-center-value\">\n {{ total() }}\n </text>\n </svg>\n\n @if (showLegend()) {\n <ul class=\"geo-chart__legend\">\n @for (seg of donutSegments(); track seg.datum.id ?? seg.datum.label) {\n <li>\n <button\n type=\"button\"\n class=\"geo-chart__legend-item\"\n (click)=\"onSegment(seg.datum, seg.index)\"\n >\n <span\n class=\"geo-chart__swatch\"\n [style.background]=\"seg.color\"\n ></span>\n <span class=\"geo-chart__legend-label\">{{ seg.datum.label }}</span>\n <span class=\"geo-chart__legend-value\">{{ seg.percent }}%</span>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n }\n</div>\n", styles: [".geo-chart-host{display:block}.geo-chart{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);min-height:var(--geo-chart-height, 260px)}.geo-chart__header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.geo-chart__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-chart__sort{display:inline-flex;gap:4px}.geo-chart__bars{display:flex;flex-direction:column;gap:10px;max-height:calc(var(--geo-chart-height, 260px) - 48px);overflow:auto;padding-right:4px}.geo-chart__bar-row{display:grid;grid-template-columns:minmax(88px,140px) 1fr auto;align-items:center;gap:10px;margin:0;padding:0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__bar-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-700)}.geo-chart__bar-track{height:12px;border-radius:var(--geo-radius-sm);background:var(--geo-color-neutral-100);overflow:hidden}.geo-chart__bar-fill{display:block;height:100%;border-radius:inherit;transition:width .2s ease}.geo-chart__bar-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-800);white-space:nowrap}.geo-chart__donut-wrap{display:flex;align-items:center;gap:20px;flex-wrap:wrap}.geo-chart__donut{width:180px;height:180px;flex-shrink:0}.geo-chart__donut-track{stroke:var(--geo-color-neutral-100)}.geo-chart__donut-seg{cursor:pointer;transition:opacity .15s ease}.geo-chart__donut-seg:hover{opacity:.85}.geo-chart__donut-center-label{fill:var(--geo-color-neutral-500);font-size:11px}.geo-chart__donut-center-value{fill:var(--geo-color-neutral-900);font-size:16px;font-weight:600}.geo-chart__legend{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px;flex:1;min-width:160px}.geo-chart__legend-item{display:grid;grid-template-columns:12px 1fr auto;align-items:center;gap:8px;width:100%;margin:0;padding:4px 0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer;text-align:left}.geo-chart__swatch{width:12px;height:12px;border-radius:2px}.geo-chart__legend-label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-chart__legend-value{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-600)}\n"] }]
3642
3720
  }] });
3643
3721
 
3644
3722
  /**
@@ -3660,6 +3738,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3660
3738
  args: [{ selector: 'geo-page-header', standalone: true, imports: [GeoBreadcrumbComponent, GeoPageTitleComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-page-header-host' }, template: "<div class=\"geo-page-header\">\n @if (breadcrumb().length) {\n <geo-breadcrumb [items]=\"breadcrumb()\" />\n }\n <div class=\"geo-page-header__row\">\n <geo-page-title [title]=\"title()\" [uppercase]=\"uppercase()\" />\n <div class=\"geo-page-header__actions\">\n <ng-content select=\"[geoPageActions]\" />\n </div>\n </div>\n <div class=\"geo-page-header__filters\">\n <ng-content select=\"[geoPageFilters]\" />\n </div>\n</div>\n", styles: [".geo-page-header-host{display:block}.geo-page-header{display:flex;flex-direction:column;gap:12px}.geo-page-header__row{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}.geo-page-header__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto}.geo-page-header__filters:empty{display:none}.geo-page-header__filters:not(:empty){display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px;padding-top:4px}\n"] }]
3661
3739
  }] });
3662
3740
 
3741
+ class GeoDetailViewItemDirective {
3742
+ key = input.required({ alias: 'uiDetailItem' });
3743
+ template = inject((TemplateRef));
3744
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoDetailViewItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3745
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: GeoDetailViewItemDirective, isStandalone: true, selector: "[uiDetailItem]", inputs: { key: { classPropertyName: "key", publicName: "uiDetailItem", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
3746
+ }
3747
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoDetailViewItemDirective, decorators: [{
3748
+ type: Directive,
3749
+ args: [{
3750
+ selector: '[uiDetailItem]',
3751
+ standalone: true,
3752
+ }]
3753
+ }] });
3754
+ /**
3755
+ * Read-only key/value grid for viewing entity details.
3756
+ *
3757
+ * @summary Lưới label/value chỉ đọc (nz-descriptions); value tùy biến qua `[uiDetailItem]`.
3758
+ * @whenToUse Trang/khối xem chi tiết hồ sơ, thửa đất, người dùng… (không chỉnh sửa).
3759
+ * @doNotUseWhen Cần nhập liệu — use geo-input/geo-select trong form.
3760
+ */
3761
+ class GeoDetailViewComponent {
3762
+ title = input('');
3763
+ items = input([]);
3764
+ column = input(2);
3765
+ bordered = input(true);
3766
+ layout = input('horizontal');
3767
+ size = input('default');
3768
+ itemTemplates;
3769
+ getTemplate(key) {
3770
+ return this.itemTemplates?.find((item) => item.key() === key)?.template ?? null;
3771
+ }
3772
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoDetailViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3773
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoDetailViewComponent, isStandalone: true, selector: "geo-detail-view", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "geo-detail-view-host" }, queries: [{ propertyName: "itemTemplates", predicate: GeoDetailViewItemDirective }], ngImport: i0, template: "<nz-descriptions\n class=\"geo-detail-view\"\n [nzTitle]=\"title()\"\n [nzColumn]=\"column()\"\n [nzBordered]=\"bordered()\"\n [nzLayout]=\"layout()\"\n [nzSize]=\"size()\"\n>\n @for (item of items(); track item.key) {\n <nz-descriptions-item [nzTitle]=\"item.label\" [nzSpan]=\"item.span ?? 1\">\n @if (getTemplate(item.key); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n } @else {\n {{ item.value ?? '\u2014' }}\n }\n </nz-descriptions-item>\n }\n</nz-descriptions>\n", styles: [".geo-detail-view-host{display:block;width:100%}.geo-detail-view.ant-descriptions{font-family:var(--geo-font-family)}.geo-detail-view .ant-descriptions-title{font-size:var(--geo-font-size-h4, 16px);font-weight:var(--geo-font-weight-bold, 600);color:var(--geo-color-neutral-900)}.geo-detail-view .ant-descriptions-item-label{color:var(--geo-color-neutral-500);font-weight:500;background:var(--geo-color-surface-subtle)}.geo-detail-view .ant-descriptions-item-content{color:var(--geo-color-neutral-900)}.geo-detail-view.ant-descriptions-bordered .ant-descriptions-view{border-radius:var(--geo-radius);border-color:var(--geo-color-border-default)}.geo-detail-view.ant-descriptions-bordered .ant-descriptions-item-label,.geo-detail-view.ant-descriptions-bordered .ant-descriptions-item-content{border-color:var(--geo-color-border-default)}\n"], dependencies: [{ kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: i1$e.NzDescriptionsComponent, selector: "nz-descriptions", inputs: ["nzBordered", "nzLayout", "nzColumn", "nzSize", "nzTitle", "nzExtra", "nzColon"], exportAs: ["nzDescriptions"] }, { kind: "component", type: i1$e.NzDescriptionsItemComponent, selector: "nz-descriptions-item", inputs: ["nzSpan", "nzTitle"], exportAs: ["nzDescriptionsItem"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3774
+ }
3775
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoDetailViewComponent, decorators: [{
3776
+ type: Component,
3777
+ args: [{ selector: 'geo-detail-view', standalone: true, imports: [NgZorroAntdModule, NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'geo-detail-view-host' }, template: "<nz-descriptions\n class=\"geo-detail-view\"\n [nzTitle]=\"title()\"\n [nzColumn]=\"column()\"\n [nzBordered]=\"bordered()\"\n [nzLayout]=\"layout()\"\n [nzSize]=\"size()\"\n>\n @for (item of items(); track item.key) {\n <nz-descriptions-item [nzTitle]=\"item.label\" [nzSpan]=\"item.span ?? 1\">\n @if (getTemplate(item.key); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n } @else {\n {{ item.value ?? '\u2014' }}\n }\n </nz-descriptions-item>\n }\n</nz-descriptions>\n", styles: [".geo-detail-view-host{display:block;width:100%}.geo-detail-view.ant-descriptions{font-family:var(--geo-font-family)}.geo-detail-view .ant-descriptions-title{font-size:var(--geo-font-size-h4, 16px);font-weight:var(--geo-font-weight-bold, 600);color:var(--geo-color-neutral-900)}.geo-detail-view .ant-descriptions-item-label{color:var(--geo-color-neutral-500);font-weight:500;background:var(--geo-color-surface-subtle)}.geo-detail-view .ant-descriptions-item-content{color:var(--geo-color-neutral-900)}.geo-detail-view.ant-descriptions-bordered .ant-descriptions-view{border-radius:var(--geo-radius);border-color:var(--geo-color-border-default)}.geo-detail-view.ant-descriptions-bordered .ant-descriptions-item-label,.geo-detail-view.ant-descriptions-bordered .ant-descriptions-item-content{border-color:var(--geo-color-border-default)}\n"] }]
3778
+ }], propDecorators: { itemTemplates: [{
3779
+ type: ContentChildren,
3780
+ args: [GeoDetailViewItemDirective]
3781
+ }] } });
3782
+
3663
3783
  /**
3664
3784
  * Login form (STT 35 — đăng nhập).
3665
3785
  *
@@ -3893,11 +4013,11 @@ class GeoListPageComponent {
3893
4013
  breadcrumb = input([]);
3894
4014
  uppercase = input(true);
3895
4015
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoListPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3896
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoListPageComponent, isStandalone: true, selector: "geo-list-page", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, breadcrumb: { classPropertyName: "breadcrumb", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null }, uppercase: { classPropertyName: "uppercase", publicName: "uppercase", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "geo-list-page-host" }, ngImport: i0, template: "<div class=\"geo-list-page\">\n <geo-page-header\n [title]=\"title()\"\n [breadcrumb]=\"breadcrumb()\"\n [uppercase]=\"uppercase()\"\n >\n <div geoPageActions>\n <ng-content select=\"[geoListActions]\" />\n </div>\n <div geoPageFilters>\n <ng-content select=\"[geoListFilters]\" />\n </div>\n </geo-page-header>\n\n <div class=\"geo-list-page__filter\">\n <ng-content select=\"geo-table-filter,[geoListFilter]\" />\n </div>\n\n <div class=\"geo-list-page__table-panel\">\n <div class=\"geo-list-page__toolbar\">\n <ng-content select=\"geo-table-toolbar,[geoListToolbar]\" />\n </div>\n <div class=\"geo-list-page__body\">\n <ng-content />\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.geo-list-page-host{display:block}.geo-list-page{display:flex;flex-direction:column;gap:16px}.geo-list-page__filter:empty,.geo-list-page__toolbar:empty{display:none}.geo-list-page__filter:not(:empty){padding:16px;background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius)}.geo-list-page__table-panel{display:flex;flex-direction:column;min-width:0;gap:0}.geo-list-page__body{min-width:0}\n"], dependencies: [{ kind: "component", type: GeoPageHeaderComponent, selector: "geo-page-header", inputs: ["title", "breadcrumb", "uppercase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
4016
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoListPageComponent, isStandalone: true, selector: "geo-list-page", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, breadcrumb: { classPropertyName: "breadcrumb", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null }, uppercase: { classPropertyName: "uppercase", publicName: "uppercase", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "geo-list-page-host" }, ngImport: i0, template: "<div class=\"geo-list-page\">\n <geo-page-header\n [title]=\"title()\"\n [breadcrumb]=\"breadcrumb()\"\n [uppercase]=\"uppercase()\"\n >\n <div geoPageActions>\n <ng-content select=\"[geoListActions]\" />\n </div>\n <div geoPageFilters>\n <ng-content select=\"[geoListFilters]\" />\n </div>\n </geo-page-header>\n\n <div class=\"geo-list-page__filter\">\n <ng-content select=\"geo-table-filter,[geoListFilter]\" />\n </div>\n\n <div class=\"geo-list-page__table-panel\">\n <div class=\"geo-list-page__toolbar\">\n <ng-content select=\"geo-table-toolbar,[geoListToolbar]\" />\n </div>\n <div class=\"geo-list-page__body\">\n <ng-content />\n </div>\n </div>\n</div>\n", styles: [".geo-list-page-host{display:block}.geo-list-page{display:flex;flex-direction:column;gap:16px}.geo-list-page__filter:empty,.geo-list-page__toolbar:empty{display:none}[geoPageActions]{display:contents}.geo-list-page__table-panel{display:flex;flex-direction:column;min-width:0;gap:0}.geo-list-page__body{min-width:0}\n"], dependencies: [{ kind: "component", type: GeoPageHeaderComponent, selector: "geo-page-header", inputs: ["title", "breadcrumb", "uppercase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3897
4017
  }
3898
4018
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoListPageComponent, decorators: [{
3899
4019
  type: Component,
3900
- args: [{ selector: 'geo-list-page', standalone: true, imports: [GeoPageHeaderComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-list-page-host' }, template: "<div class=\"geo-list-page\">\n <geo-page-header\n [title]=\"title()\"\n [breadcrumb]=\"breadcrumb()\"\n [uppercase]=\"uppercase()\"\n >\n <div geoPageActions>\n <ng-content select=\"[geoListActions]\" />\n </div>\n <div geoPageFilters>\n <ng-content select=\"[geoListFilters]\" />\n </div>\n </geo-page-header>\n\n <div class=\"geo-list-page__filter\">\n <ng-content select=\"geo-table-filter,[geoListFilter]\" />\n </div>\n\n <div class=\"geo-list-page__table-panel\">\n <div class=\"geo-list-page__toolbar\">\n <ng-content select=\"geo-table-toolbar,[geoListToolbar]\" />\n </div>\n <div class=\"geo-list-page__body\">\n <ng-content />\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.geo-list-page-host{display:block}.geo-list-page{display:flex;flex-direction:column;gap:16px}.geo-list-page__filter:empty,.geo-list-page__toolbar:empty{display:none}.geo-list-page__filter:not(:empty){padding:16px;background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius)}.geo-list-page__table-panel{display:flex;flex-direction:column;min-width:0;gap:0}.geo-list-page__body{min-width:0}\n"] }]
4020
+ args: [{ selector: 'geo-list-page', standalone: true, imports: [GeoPageHeaderComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-list-page-host' }, template: "<div class=\"geo-list-page\">\n <geo-page-header\n [title]=\"title()\"\n [breadcrumb]=\"breadcrumb()\"\n [uppercase]=\"uppercase()\"\n >\n <div geoPageActions>\n <ng-content select=\"[geoListActions]\" />\n </div>\n <div geoPageFilters>\n <ng-content select=\"[geoListFilters]\" />\n </div>\n </geo-page-header>\n\n <div class=\"geo-list-page__filter\">\n <ng-content select=\"geo-table-filter,[geoListFilter]\" />\n </div>\n\n <div class=\"geo-list-page__table-panel\">\n <div class=\"geo-list-page__toolbar\">\n <ng-content select=\"geo-table-toolbar,[geoListToolbar]\" />\n </div>\n <div class=\"geo-list-page__body\">\n <ng-content />\n </div>\n </div>\n</div>\n", styles: [".geo-list-page-host{display:block}.geo-list-page{display:flex;flex-direction:column;gap:16px}.geo-list-page__filter:empty,.geo-list-page__toolbar:empty{display:none}[geoPageActions]{display:contents}.geo-list-page__table-panel{display:flex;flex-direction:column;min-width:0;gap:0}.geo-list-page__body{min-width:0}\n"] }]
3901
4021
  }] });
3902
4022
 
3903
4023
  /**
@@ -4070,16 +4190,16 @@ const GEO_MAP_DEFAULT_TOOLBAR_ACTIONS = [
4070
4190
  },
4071
4191
  ];
4072
4192
  /**
4073
- * Toolbar action cho định vị (UC-14)KHÔNG trong `GEO_MAP_DEFAULT_TOOLBAR_ACTIONS` để
4074
- * không đổi giao diện các consumer hiện có (M02/M07). Ghép thêm khi cần:
4075
- * `toolbarActions: [...GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, GEO_MAP_LOCATE_TOOLBAR_ACTION]`.
4193
+ * Built-in "Vị trí của tôi" toolbar action pair with `id: 'locate'` handling that
4194
+ * `geo-map-shell` already resolves internally (geolocate + emit `located`/`locateError`).
4195
+ * Not included in `GEO_MAP_DEFAULT_TOOLBAR_ACTIONS`; host apps opt in explicitly.
4076
4196
  */
4077
4197
  const GEO_MAP_LOCATE_TOOLBAR_ACTION = {
4078
4198
  id: 'locate',
4079
4199
  label: 'Vị trí của tôi',
4080
4200
  icon: 'aim',
4081
4201
  iconOnly: true,
4082
- tooltip: 'Định vị vị trí của tôi',
4202
+ tooltip: 'Vị trí của tôi',
4083
4203
  };
4084
4204
  /**
4085
4205
  * Demo thematic overlays for Storybook (offline-friendly GeoJSON).
@@ -5663,13 +5783,13 @@ class GeoMapToolbarComponent {
5663
5783
  this.actionClick.emit(action);
5664
5784
  }
5665
5785
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5666
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapToolbarComponent, isStandalone: true, selector: "geo-map-toolbar", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, checkedMap: { classPropertyName: "checkedMap", publicName: "checkedMap", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedMap: "checkedMapChange", actionClick: "actionClick", actionToggle: "actionToggle" }, host: { classAttribute: "geo-map-toolbar-host" }, ngImport: i0, template: "<div\n class=\"geo-map-toolbar\"\n [class.geo-map-toolbar--compact]=\"compact()\"\n role=\"toolbar\"\n aria-label=\"Thao t\u00E1c b\u1EA3n \u0111\u1ED3\"\n>\n @for (action of resolvedActions(); track action.id) {\n <span\n class=\"geo-map-toolbar__tip\"\n [nz-tooltip]=\"tooltipOf(action)\"\n nzTooltipPlacement=\"bottom\"\n >\n <button\n type=\"button\"\n class=\"geo-map-toolbar__btn\"\n [class.geo-map-toolbar__btn--icon-only]=\"\n action.iconOnly || !action.label || compact()\n \"\n [class.geo-map-toolbar__btn--active]=\"action.active\"\n [class.geo-map-toolbar__btn--checked]=\"isChecked(action)\"\n [class.geo-map-toolbar__btn--primary]=\"action.variant === 'primary'\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"tooltipOf(action)\"\n [attr.aria-pressed]=\"isToggleAction(action) ? isChecked(action) : null\"\n (click)=\"onActionClick(action)\"\n >\n @if (action.iconSrc) {\n <img\n class=\"geo-map-toolbar__icon-img\"\n [class.geo-map-toolbar__icon-img--home]=\"action.variant === 'primary'\"\n [src]=\"action.iconSrc\"\n alt=\"\"\n draggable=\"false\"\n />\n } @else if (action.icon) {\n <geo-icon [type]=\"action.icon\" size=\"sm\" />\n }\n @if (action.label && !action.iconOnly && !compact()) {\n <span class=\"geo-map-toolbar__label\">{{ action.label }}</span>\n }\n </button>\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-toolbar-host{display:block;pointer-events:none}.geo-map-toolbar{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:12px;min-height:48px;padding:6px 10px;overflow:visible;pointer-events:auto;border:0;border-radius:var(--geo-radius-md);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-sm)}.geo-map-toolbar__tip{display:inline-flex}.geo-map-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;min-height:32px;padding:4px;border:1px solid var(--geo-color-primary-default);border-radius:var(--geo-radius-xs);background:var(--geo-color-neutral-white, #fff);color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;box-shadow:0 0 2px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-toolbar__btn:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-default) 14%,var(--geo-color-neutral-white))}.geo-map-toolbar__btn:active:not(:disabled){transform:scale(.98)}.geo-map-toolbar__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-toolbar__btn--icon-only{width:32px;padding:4px}.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--checked{background:color-mix(in srgb,var(--geo-color-primary-light) 58%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--active:hover:not(:disabled),.geo-map-toolbar__btn--checked:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-light) 68%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--primary{width:32px;min-width:32px;min-height:32px;padding:0;border:0;border-radius:50%;background:var(--geo-color-primary-light);box-shadow:0 4px 4px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);margin-right:-2px}.geo-map-toolbar__btn--primary:hover:not(:disabled){background:var(--geo-color-primary-default);filter:none}.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--checked{background:var(--geo-color-primary-light)}.geo-map-toolbar__icon-img{display:block;width:18px;height:18px;object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none}.geo-map-toolbar__icon-img--home{width:16px;height:14px}.geo-map-toolbar__label{white-space:nowrap}.geo-map-toolbar--compact .geo-map-toolbar__label{display:none}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
5786
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapToolbarComponent, isStandalone: true, selector: "geo-map-toolbar", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, checkedMap: { classPropertyName: "checkedMap", publicName: "checkedMap", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedMap: "checkedMapChange", actionClick: "actionClick", actionToggle: "actionToggle" }, host: { classAttribute: "geo-map-toolbar-host" }, ngImport: i0, template: "<div\n class=\"geo-map-toolbar\"\n [class.geo-map-toolbar--compact]=\"compact()\"\n role=\"toolbar\"\n aria-label=\"Thao t\u00E1c b\u1EA3n \u0111\u1ED3\"\n>\n @for (action of resolvedActions(); track action.id) {\n <span\n class=\"geo-map-toolbar__tip\"\n [nz-tooltip]=\"tooltipOf(action)\"\n nzTooltipPlacement=\"bottom\"\n >\n <button\n type=\"button\"\n class=\"geo-map-toolbar__btn\"\n [class.geo-map-toolbar__btn--icon-only]=\"\n action.iconOnly || !action.label || compact()\n \"\n [class.geo-map-toolbar__btn--active]=\"action.active\"\n [class.geo-map-toolbar__btn--checked]=\"isChecked(action)\"\n [class.geo-map-toolbar__btn--primary]=\"action.variant === 'primary'\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"tooltipOf(action)\"\n [attr.aria-pressed]=\"isToggleAction(action) ? isChecked(action) : null\"\n (click)=\"onActionClick(action)\"\n >\n @if (action.iconSrc) {\n <img\n class=\"geo-map-toolbar__icon-img\"\n [class.geo-map-toolbar__icon-img--home]=\"action.variant === 'primary'\"\n [src]=\"action.iconSrc\"\n alt=\"\"\n draggable=\"false\"\n />\n } @else if (action.icon) {\n <geo-icon [type]=\"action.icon\" size=\"md\" />\n }\n @if (action.label && !action.iconOnly && !compact()) {\n <span class=\"geo-map-toolbar__label\">{{ action.label }}</span>\n }\n </button>\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-toolbar-host{display:block;pointer-events:none}.geo-map-toolbar{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:18px;min-height:64px;padding:7px 12px;overflow:visible;pointer-events:auto;border:0;border-radius:var(--geo-radius-md);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-sm)}.geo-map-toolbar__tip{display:inline-flex}.geo-map-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;padding:5px;border:1px solid var(--geo-color-primary-default);border-radius:var(--geo-radius-xs);background:var(--geo-color-neutral-white, #fff);color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;box-shadow:0 0 2px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-toolbar__btn:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-default) 14%,var(--geo-color-neutral-white))}.geo-map-toolbar__btn:active:not(:disabled){transform:scale(.98)}.geo-map-toolbar__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-toolbar__btn--icon-only{width:40px;padding:5px}.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--checked{background:color-mix(in srgb,var(--geo-color-primary-light) 58%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--active:hover:not(:disabled),.geo-map-toolbar__btn--checked:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-light) 68%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--primary{width:50px;min-width:50px;min-height:50px;padding:0;border:0;border-radius:50%;background:var(--geo-color-primary-light);box-shadow:0 4px 4px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);margin-right:-3px}.geo-map-toolbar__btn--primary:hover:not(:disabled){background:var(--geo-color-primary-default);filter:none}.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--checked{background:var(--geo-color-primary-light)}.geo-map-toolbar__icon-img{display:block;width:25px;height:25px;object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none}.geo-map-toolbar__icon-img--home{width:22px;height:20px}.geo-map-toolbar__label{white-space:nowrap}.geo-map-toolbar--compact .geo-map-toolbar__label{display:none}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
5667
5787
  }
5668
5788
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapToolbarComponent, decorators: [{
5669
5789
  type: Component,
5670
5790
  args: [{ selector: 'geo-map-toolbar', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
5671
5791
  class: 'geo-map-toolbar-host',
5672
- }, template: "<div\n class=\"geo-map-toolbar\"\n [class.geo-map-toolbar--compact]=\"compact()\"\n role=\"toolbar\"\n aria-label=\"Thao t\u00E1c b\u1EA3n \u0111\u1ED3\"\n>\n @for (action of resolvedActions(); track action.id) {\n <span\n class=\"geo-map-toolbar__tip\"\n [nz-tooltip]=\"tooltipOf(action)\"\n nzTooltipPlacement=\"bottom\"\n >\n <button\n type=\"button\"\n class=\"geo-map-toolbar__btn\"\n [class.geo-map-toolbar__btn--icon-only]=\"\n action.iconOnly || !action.label || compact()\n \"\n [class.geo-map-toolbar__btn--active]=\"action.active\"\n [class.geo-map-toolbar__btn--checked]=\"isChecked(action)\"\n [class.geo-map-toolbar__btn--primary]=\"action.variant === 'primary'\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"tooltipOf(action)\"\n [attr.aria-pressed]=\"isToggleAction(action) ? isChecked(action) : null\"\n (click)=\"onActionClick(action)\"\n >\n @if (action.iconSrc) {\n <img\n class=\"geo-map-toolbar__icon-img\"\n [class.geo-map-toolbar__icon-img--home]=\"action.variant === 'primary'\"\n [src]=\"action.iconSrc\"\n alt=\"\"\n draggable=\"false\"\n />\n } @else if (action.icon) {\n <geo-icon [type]=\"action.icon\" size=\"sm\" />\n }\n @if (action.label && !action.iconOnly && !compact()) {\n <span class=\"geo-map-toolbar__label\">{{ action.label }}</span>\n }\n </button>\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-toolbar-host{display:block;pointer-events:none}.geo-map-toolbar{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:12px;min-height:48px;padding:6px 10px;overflow:visible;pointer-events:auto;border:0;border-radius:var(--geo-radius-md);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-sm)}.geo-map-toolbar__tip{display:inline-flex}.geo-map-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;min-height:32px;padding:4px;border:1px solid var(--geo-color-primary-default);border-radius:var(--geo-radius-xs);background:var(--geo-color-neutral-white, #fff);color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;box-shadow:0 0 2px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-toolbar__btn:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-default) 14%,var(--geo-color-neutral-white))}.geo-map-toolbar__btn:active:not(:disabled){transform:scale(.98)}.geo-map-toolbar__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-toolbar__btn--icon-only{width:32px;padding:4px}.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--checked{background:color-mix(in srgb,var(--geo-color-primary-light) 58%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--active:hover:not(:disabled),.geo-map-toolbar__btn--checked:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-light) 68%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--primary{width:32px;min-width:32px;min-height:32px;padding:0;border:0;border-radius:50%;background:var(--geo-color-primary-light);box-shadow:0 4px 4px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);margin-right:-2px}.geo-map-toolbar__btn--primary:hover:not(:disabled){background:var(--geo-color-primary-default);filter:none}.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--checked{background:var(--geo-color-primary-light)}.geo-map-toolbar__icon-img{display:block;width:18px;height:18px;object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none}.geo-map-toolbar__icon-img--home{width:16px;height:14px}.geo-map-toolbar__label{white-space:nowrap}.geo-map-toolbar--compact .geo-map-toolbar__label{display:none}\n"] }]
5792
+ }, template: "<div\n class=\"geo-map-toolbar\"\n [class.geo-map-toolbar--compact]=\"compact()\"\n role=\"toolbar\"\n aria-label=\"Thao t\u00E1c b\u1EA3n \u0111\u1ED3\"\n>\n @for (action of resolvedActions(); track action.id) {\n <span\n class=\"geo-map-toolbar__tip\"\n [nz-tooltip]=\"tooltipOf(action)\"\n nzTooltipPlacement=\"bottom\"\n >\n <button\n type=\"button\"\n class=\"geo-map-toolbar__btn\"\n [class.geo-map-toolbar__btn--icon-only]=\"\n action.iconOnly || !action.label || compact()\n \"\n [class.geo-map-toolbar__btn--active]=\"action.active\"\n [class.geo-map-toolbar__btn--checked]=\"isChecked(action)\"\n [class.geo-map-toolbar__btn--primary]=\"action.variant === 'primary'\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"tooltipOf(action)\"\n [attr.aria-pressed]=\"isToggleAction(action) ? isChecked(action) : null\"\n (click)=\"onActionClick(action)\"\n >\n @if (action.iconSrc) {\n <img\n class=\"geo-map-toolbar__icon-img\"\n [class.geo-map-toolbar__icon-img--home]=\"action.variant === 'primary'\"\n [src]=\"action.iconSrc\"\n alt=\"\"\n draggable=\"false\"\n />\n } @else if (action.icon) {\n <geo-icon [type]=\"action.icon\" size=\"md\" />\n }\n @if (action.label && !action.iconOnly && !compact()) {\n <span class=\"geo-map-toolbar__label\">{{ action.label }}</span>\n }\n </button>\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-toolbar-host{display:block;pointer-events:none}.geo-map-toolbar{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:18px;min-height:64px;padding:7px 12px;overflow:visible;pointer-events:auto;border:0;border-radius:var(--geo-radius-md);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-sm)}.geo-map-toolbar__tip{display:inline-flex}.geo-map-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;padding:5px;border:1px solid var(--geo-color-primary-default);border-radius:var(--geo-radius-xs);background:var(--geo-color-neutral-white, #fff);color:var(--geo-color-primary-default);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;box-shadow:0 0 2px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-toolbar__btn:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-default) 14%,var(--geo-color-neutral-white))}.geo-map-toolbar__btn:active:not(:disabled){transform:scale(.98)}.geo-map-toolbar__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-toolbar__btn--icon-only{width:40px;padding:5px}.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--checked{background:color-mix(in srgb,var(--geo-color-primary-light) 58%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--active:hover:not(:disabled),.geo-map-toolbar__btn--checked:hover:not(:disabled){background:color-mix(in srgb,var(--geo-color-primary-light) 68%,var(--geo-color-neutral-white));color:var(--geo-color-primary-default)}.geo-map-toolbar__btn--primary{width:50px;min-width:50px;min-height:50px;padding:0;border:0;border-radius:50%;background:var(--geo-color-primary-light);box-shadow:0 4px 4px color-mix(in srgb,var(--geo-color-neutral-900) 25%,transparent);margin-right:-3px}.geo-map-toolbar__btn--primary:hover:not(:disabled){background:var(--geo-color-primary-default);filter:none}.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--active,.geo-map-toolbar__btn--primary.geo-map-toolbar__btn--checked{background:var(--geo-color-primary-light)}.geo-map-toolbar__icon-img{display:block;width:25px;height:25px;object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none}.geo-map-toolbar__icon-img--home{width:22px;height:20px}.geo-map-toolbar__label{white-space:nowrap}.geo-map-toolbar--compact .geo-map-toolbar__label{display:none}\n"] }]
5673
5793
  }] });
5674
5794
 
5675
5795
  /**
@@ -6022,13 +6142,50 @@ class GeoMapZoomComponent {
6022
6142
  this.canZoomNext.set(idx >= 0 && idx < len - 1);
6023
6143
  }
6024
6144
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapZoomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6025
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapZoomComponent, isStandalone: true, selector: "geo-map-zoom", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, showNav: { classPropertyName: "showNav", publicName: "showNav", isSignal: true, isRequired: false, transformFunction: null }, showFitProvince: { classPropertyName: "showFitProvince", publicName: "showFitProvince", isSignal: true, isRequired: false, transformFunction: null }, provinceExtent: { classPropertyName: "provinceExtent", publicName: "provinceExtent", isSignal: true, isRequired: false, transformFunction: null }, fullscreenTarget: { classPropertyName: "fullscreenTarget", publicName: "fullscreenTarget", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "geo-map-zoom-host" }, ngImport: i0, template: "<div class=\"geo-map-zoom\" role=\"group\" aria-label=\"Thu ph\u00F3ng b\u1EA3n \u0111\u1ED3\">\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Ph\u00F3ng to\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to\"\n [disabled]=\"!controller()\"\n (click)=\"zoomIn()\"\n >\n <geo-icon type=\"plus\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Thu nh\u1ECF\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF\"\n [disabled]=\"!controller()\"\n (click)=\"zoomOut()\"\n >\n <geo-icon type=\"minus\" size=\"sm\" />\n </button>\n\n @if (showNav()) {\n <span class=\"geo-map-zoom__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'in'\"\n nz-tooltip=\"Ph\u00F3ng to theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('in')\"\n >\n <geo-icon type=\"zoom-in\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'out'\"\n nz-tooltip=\"Thu nh\u1ECF theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('out')\"\n >\n <geo-icon type=\"zoom-out\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom tr\u01B0\u1EDBc\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom tr\u01B0\u1EDBc\"\n [disabled]=\"!controller() || !canZoomPrev()\"\n (click)=\"zoomPrev()\"\n >\n <geo-icon type=\"left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom sau\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom sau\"\n [disabled]=\"!controller() || !canZoomNext()\"\n (click)=\"zoomNext()\"\n >\n <geo-icon type=\"right\" size=\"sm\" />\n </button>\n @if (showFitProvince()) {\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Xem to\u00E0n t\u1EC9nh\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Xem to\u00E0n t\u1EC9nh\"\n [disabled]=\"!controller()\"\n (click)=\"fitProvince()\"\n >\n <geo-icon type=\"expand\" size=\"sm\" />\n </button>\n }\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"isFullscreen()\"\n [nz-tooltip]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n [disabled]=\"!controller()\"\n (click)=\"toggleFullscreen()\"\n >\n <geo-icon\n [type]=\"isFullscreen() ? 'fullscreen-exit' : 'fullscreen'\"\n size=\"sm\"\n />\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-zoom-host{display:block}.geo-map-zoom{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;align-items:stretch;gap:2px;padding:4px}.geo-map-zoom__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;min-height:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;padding:0}.geo-map-zoom__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-zoom__btn:active:not(:disabled){transform:scale(.98)}.geo-map-zoom__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-zoom__btn--active,.geo-map-zoom__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__btn--icon-only{width:32px;padding:0}.geo-map-zoom__btn--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__dragbox{background:color-mix(in srgb,var(--geo-color-primary-default) 18%,transparent);border:2px solid var(--geo-color-primary-default)}.geo-map-zoom__divider{height:1px;margin:2px 6px;background:var(--geo-color-neutral-100)}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6145
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapZoomComponent, isStandalone: true, selector: "geo-map-zoom", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, showNav: { classPropertyName: "showNav", publicName: "showNav", isSignal: true, isRequired: false, transformFunction: null }, showFitProvince: { classPropertyName: "showFitProvince", publicName: "showFitProvince", isSignal: true, isRequired: false, transformFunction: null }, provinceExtent: { classPropertyName: "provinceExtent", publicName: "provinceExtent", isSignal: true, isRequired: false, transformFunction: null }, fullscreenTarget: { classPropertyName: "fullscreenTarget", publicName: "fullscreenTarget", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "geo-map-zoom-host" }, ngImport: i0, template: "<div class=\"geo-map-zoom\" role=\"group\" aria-label=\"Thu ph\u00F3ng b\u1EA3n \u0111\u1ED3\">\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Ph\u00F3ng to\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to\"\n [disabled]=\"!controller()\"\n (click)=\"zoomIn()\"\n >\n <geo-icon type=\"plus\" size=\"md\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Thu nh\u1ECF\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF\"\n [disabled]=\"!controller()\"\n (click)=\"zoomOut()\"\n >\n <geo-icon type=\"minus\" size=\"md\" />\n </button>\n\n @if (showNav()) {\n <span class=\"geo-map-zoom__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'in'\"\n nz-tooltip=\"Ph\u00F3ng to theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('in')\"\n >\n <geo-icon type=\"zoom-in\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'out'\"\n nz-tooltip=\"Thu nh\u1ECF theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('out')\"\n >\n <geo-icon type=\"zoom-out\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom tr\u01B0\u1EDBc\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom tr\u01B0\u1EDBc\"\n [disabled]=\"!controller() || !canZoomPrev()\"\n (click)=\"zoomPrev()\"\n >\n <geo-icon type=\"left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom sau\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom sau\"\n [disabled]=\"!controller() || !canZoomNext()\"\n (click)=\"zoomNext()\"\n >\n <geo-icon type=\"right\" size=\"sm\" />\n </button>\n @if (showFitProvince()) {\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Xem to\u00E0n t\u1EC9nh\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Xem to\u00E0n t\u1EC9nh\"\n [disabled]=\"!controller()\"\n (click)=\"fitProvince()\"\n >\n <geo-icon type=\"expand\" size=\"sm\" />\n </button>\n }\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"isFullscreen()\"\n [nz-tooltip]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n [disabled]=\"!controller()\"\n (click)=\"toggleFullscreen()\"\n >\n <geo-icon\n [type]=\"isFullscreen() ? 'fullscreen-exit' : 'fullscreen'\"\n size=\"sm\"\n />\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-zoom-host{display:block}.geo-map-zoom{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;align-items:stretch;gap:2px;padding:4px}.geo-map-zoom__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:40px;padding:0}.geo-map-zoom__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-zoom__btn:active:not(:disabled){transform:scale(.98)}.geo-map-zoom__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-zoom__btn--active,.geo-map-zoom__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__btn--icon-only{width:40px;padding:0}.geo-map-zoom__btn--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__dragbox{background:color-mix(in srgb,var(--geo-color-primary-default) 18%,transparent);border:2px solid var(--geo-color-primary-default)}.geo-map-zoom__divider{height:1px;margin:2px 6px;background:var(--geo-color-neutral-100)}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6026
6146
  }
6027
6147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapZoomComponent, decorators: [{
6028
6148
  type: Component,
6029
- args: [{ selector: 'geo-map-zoom', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-zoom-host' }, template: "<div class=\"geo-map-zoom\" role=\"group\" aria-label=\"Thu ph\u00F3ng b\u1EA3n \u0111\u1ED3\">\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Ph\u00F3ng to\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to\"\n [disabled]=\"!controller()\"\n (click)=\"zoomIn()\"\n >\n <geo-icon type=\"plus\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Thu nh\u1ECF\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF\"\n [disabled]=\"!controller()\"\n (click)=\"zoomOut()\"\n >\n <geo-icon type=\"minus\" size=\"sm\" />\n </button>\n\n @if (showNav()) {\n <span class=\"geo-map-zoom__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'in'\"\n nz-tooltip=\"Ph\u00F3ng to theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('in')\"\n >\n <geo-icon type=\"zoom-in\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'out'\"\n nz-tooltip=\"Thu nh\u1ECF theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('out')\"\n >\n <geo-icon type=\"zoom-out\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom tr\u01B0\u1EDBc\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom tr\u01B0\u1EDBc\"\n [disabled]=\"!controller() || !canZoomPrev()\"\n (click)=\"zoomPrev()\"\n >\n <geo-icon type=\"left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom sau\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom sau\"\n [disabled]=\"!controller() || !canZoomNext()\"\n (click)=\"zoomNext()\"\n >\n <geo-icon type=\"right\" size=\"sm\" />\n </button>\n @if (showFitProvince()) {\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Xem to\u00E0n t\u1EC9nh\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Xem to\u00E0n t\u1EC9nh\"\n [disabled]=\"!controller()\"\n (click)=\"fitProvince()\"\n >\n <geo-icon type=\"expand\" size=\"sm\" />\n </button>\n }\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"isFullscreen()\"\n [nz-tooltip]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n [disabled]=\"!controller()\"\n (click)=\"toggleFullscreen()\"\n >\n <geo-icon\n [type]=\"isFullscreen() ? 'fullscreen-exit' : 'fullscreen'\"\n size=\"sm\"\n />\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-zoom-host{display:block}.geo-map-zoom{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;align-items:stretch;gap:2px;padding:4px}.geo-map-zoom__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;min-height:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;padding:0}.geo-map-zoom__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-zoom__btn:active:not(:disabled){transform:scale(.98)}.geo-map-zoom__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-zoom__btn--active,.geo-map-zoom__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__btn--icon-only{width:32px;padding:0}.geo-map-zoom__btn--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__dragbox{background:color-mix(in srgb,var(--geo-color-primary-default) 18%,transparent);border:2px solid var(--geo-color-primary-default)}.geo-map-zoom__divider{height:1px;margin:2px 6px;background:var(--geo-color-neutral-100)}\n"] }]
6149
+ args: [{ selector: 'geo-map-zoom', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-zoom-host' }, template: "<div class=\"geo-map-zoom\" role=\"group\" aria-label=\"Thu ph\u00F3ng b\u1EA3n \u0111\u1ED3\">\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Ph\u00F3ng to\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to\"\n [disabled]=\"!controller()\"\n (click)=\"zoomIn()\"\n >\n <geo-icon type=\"plus\" size=\"md\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Thu nh\u1ECF\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF\"\n [disabled]=\"!controller()\"\n (click)=\"zoomOut()\"\n >\n <geo-icon type=\"minus\" size=\"md\" />\n </button>\n\n @if (showNav()) {\n <span class=\"geo-map-zoom__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'in'\"\n nz-tooltip=\"Ph\u00F3ng to theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Ph\u00F3ng to theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('in')\"\n >\n <geo-icon type=\"zoom-in\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"boxMode() === 'out'\"\n nz-tooltip=\"Thu nh\u1ECF theo v\u00F9ng (k\u00E9o khung)\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Thu nh\u1ECF theo v\u00F9ng\"\n [disabled]=\"!controller()\"\n (click)=\"toggleBoxZoom('out')\"\n >\n <geo-icon type=\"zoom-out\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom tr\u01B0\u1EDBc\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom tr\u01B0\u1EDBc\"\n [disabled]=\"!controller() || !canZoomPrev()\"\n (click)=\"zoomPrev()\"\n >\n <geo-icon type=\"left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Zoom sau\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Zoom sau\"\n [disabled]=\"!controller() || !canZoomNext()\"\n (click)=\"zoomNext()\"\n >\n <geo-icon type=\"right\" size=\"sm\" />\n </button>\n @if (showFitProvince()) {\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n nz-tooltip=\"Xem to\u00E0n t\u1EC9nh\"\n nzTooltipPlacement=\"left\"\n aria-label=\"Xem to\u00E0n t\u1EC9nh\"\n [disabled]=\"!controller()\"\n (click)=\"fitProvince()\"\n >\n <geo-icon type=\"expand\" size=\"sm\" />\n </button>\n }\n <button\n type=\"button\"\n class=\"geo-map-zoom__btn\"\n [class.geo-map-zoom__btn--active]=\"isFullscreen()\"\n [nz-tooltip]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"\n isFullscreen() ? 'Tho\u00E1t to\u00E0n m\u00E0n h\u00ECnh' : 'Xem to\u00E0n b\u1EA3n \u0111\u1ED3'\n \"\n [disabled]=\"!controller()\"\n (click)=\"toggleFullscreen()\"\n >\n <geo-icon\n [type]=\"isFullscreen() ? 'fullscreen-exit' : 'fullscreen'\"\n size=\"sm\"\n />\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-zoom-host{display:block}.geo-map-zoom{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;align-items:stretch;gap:2px;padding:4px}.geo-map-zoom__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:40px;padding:0}.geo-map-zoom__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-zoom__btn:active:not(:disabled){transform:scale(.98)}.geo-map-zoom__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-zoom__btn--active,.geo-map-zoom__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__btn--icon-only{width:40px;padding:0}.geo-map-zoom__btn--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-zoom__dragbox{background:color-mix(in srgb,var(--geo-color-primary-default) 18%,transparent);border:2px solid var(--geo-color-primary-default)}.geo-map-zoom__divider{height:1px;margin:2px 6px;background:var(--geo-color-neutral-100)}\n"] }]
6030
6150
  }], ctorParameters: () => [] });
6031
6151
 
6152
+ /**
6153
+ * Shared browser-geolocation trigger — centers `ctrl` on the user and reports the outcome.
6154
+ * Used by both `geo-map-locate` (standalone button) and `geo-map-shell`'s built-in locate
6155
+ * toolbar action so the two never drift on error-reason mapping.
6156
+ */
6157
+ function runGeoMapLocate(ctrl, callbacks) {
6158
+ if (typeof navigator === 'undefined' || !navigator.geolocation) {
6159
+ callbacks.onError?.({
6160
+ reason: 'unsupported',
6161
+ message: 'Trình duyệt không hỗ trợ định vị.',
6162
+ });
6163
+ return;
6164
+ }
6165
+ navigator.geolocation.getCurrentPosition((pos) => {
6166
+ const lonLat = [pos.coords.longitude, pos.coords.latitude];
6167
+ const mercator = fromLonLat(lonLat);
6168
+ ctrl.setCenter(mercator, Math.max(ctrl.getZoom() ?? 14, 14));
6169
+ callbacks.onLocated?.(lonLat);
6170
+ }, (err) => {
6171
+ if (err.code === err.PERMISSION_DENIED) {
6172
+ callbacks.onDenied?.();
6173
+ callbacks.onError?.({ reason: 'denied', message: err.message });
6174
+ return;
6175
+ }
6176
+ const reason = err.code === err.POSITION_UNAVAILABLE
6177
+ ? 'unavailable'
6178
+ : err.code === err.TIMEOUT
6179
+ ? 'timeout'
6180
+ : 'unknown';
6181
+ callbacks.onError?.({ reason, message: err.message });
6182
+ }, {
6183
+ enableHighAccuracy: true,
6184
+ timeout: 12000,
6185
+ maximumAge: 0,
6186
+ });
6187
+ }
6188
+
6032
6189
  /**
6033
6190
  * Geolocation button: center map on user after permission.
6034
6191
  *
@@ -6048,51 +6205,28 @@ class GeoMapLocateComponent {
6048
6205
  if (!ctrl || this.busy()) {
6049
6206
  return;
6050
6207
  }
6051
- if (typeof navigator === 'undefined' || !navigator.geolocation) {
6052
- this.locateError.emit({
6053
- reason: 'unsupported',
6054
- message: 'Trình duyệt không hỗ trợ định vị.',
6055
- });
6056
- return;
6057
- }
6058
6208
  this.busy.set(true);
6059
- navigator.geolocation.getCurrentPosition((pos) => {
6060
- this.busy.set(false);
6061
- const lonLat = [
6062
- pos.coords.longitude,
6063
- pos.coords.latitude,
6064
- ];
6065
- const mercator = fromLonLat(lonLat);
6066
- ctrl.setCenter(mercator, Math.max(ctrl.getZoom() ?? 14, 14));
6067
- this.located.emit(lonLat);
6068
- }, (err) => {
6069
- this.busy.set(false);
6070
- if (err.code === err.PERMISSION_DENIED) {
6209
+ runGeoMapLocate(ctrl, {
6210
+ onLocated: (lonLat) => {
6211
+ this.busy.set(false);
6212
+ this.located.emit(lonLat);
6213
+ },
6214
+ onDenied: () => {
6215
+ this.busy.set(false);
6071
6216
  this.denied.emit();
6072
- this.locateError.emit({
6073
- reason: 'denied',
6074
- message: err.message,
6075
- });
6076
- return;
6077
- }
6078
- const reason = err.code === err.POSITION_UNAVAILABLE
6079
- ? 'unavailable'
6080
- : err.code === err.TIMEOUT
6081
- ? 'timeout'
6082
- : 'unknown';
6083
- this.locateError.emit({ reason, message: err.message });
6084
- }, {
6085
- enableHighAccuracy: true,
6086
- timeout: 12000,
6087
- maximumAge: 0,
6217
+ },
6218
+ onError: (error) => {
6219
+ this.busy.set(false);
6220
+ this.locateError.emit(error);
6221
+ },
6088
6222
  });
6089
6223
  }
6090
6224
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLocateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6091
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoMapLocateComponent, isStandalone: true, selector: "geo-map-locate", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { located: "located", denied: "denied", locateError: "locateError" }, host: { classAttribute: "geo-map-locate-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-locate__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"locate()\"\n>\n <geo-icon type=\"aim\" size=\"sm\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-locate-host{display:block}.geo-map-locate__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-height:32px;padding:0}.geo-map-locate__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-locate__btn:active:not(:disabled){transform:scale(.98)}.geo-map-locate__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-locate__btn--active,.geo-map-locate__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-locate__btn--icon-only{width:32px;padding:0}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6225
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoMapLocateComponent, isStandalone: true, selector: "geo-map-locate", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { located: "located", denied: "denied", locateError: "locateError" }, host: { classAttribute: "geo-map-locate-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-locate__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"locate()\"\n>\n <geo-icon type=\"aim\" size=\"md\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-locate-host{display:block}.geo-map-locate__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-locate__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-locate__btn:active:not(:disabled){transform:scale(.98)}.geo-map-locate__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-locate__btn--active,.geo-map-locate__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-locate__btn--icon-only{width:40px;padding:0}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6092
6226
  }
6093
6227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLocateComponent, decorators: [{
6094
6228
  type: Component,
6095
- args: [{ selector: 'geo-map-locate', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-locate-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-locate__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"locate()\"\n>\n <geo-icon type=\"aim\" size=\"sm\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-locate-host{display:block}.geo-map-locate__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-height:32px;padding:0}.geo-map-locate__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-locate__btn:active:not(:disabled){transform:scale(.98)}.geo-map-locate__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-locate__btn--active,.geo-map-locate__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-locate__btn--icon-only{width:32px;padding:0}\n"] }]
6229
+ args: [{ selector: 'geo-map-locate', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-locate-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-locate__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"locate()\"\n>\n <geo-icon type=\"aim\" size=\"md\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-locate-host{display:block}.geo-map-locate__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-locate__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-locate__btn:active:not(:disabled){transform:scale(.98)}.geo-map-locate__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-locate__btn--active,.geo-map-locate__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-locate__btn--icon-only{width:40px;padding:0}\n"] }]
6096
6230
  }] });
6097
6231
 
6098
6232
  /**
@@ -6176,11 +6310,11 @@ class GeoMapSnapshotComponent {
6176
6310
  map.renderSync();
6177
6311
  }
6178
6312
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSnapshotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6179
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoMapSnapshotComponent, isStandalone: true, selector: "geo-map-snapshot", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, filename: { classPropertyName: "filename", publicName: "filename", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { captured: "captured", captureError: "captureError" }, host: { classAttribute: "geo-map-snapshot-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-snapshot__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"capture()\"\n>\n <geo-icon type=\"camera\" size=\"sm\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-snapshot-host{display:block}.geo-map-snapshot__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-height:32px;padding:0}.geo-map-snapshot__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn:active:not(:disabled){transform:scale(.98)}.geo-map-snapshot__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-snapshot__btn--active,.geo-map-snapshot__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn--icon-only{width:32px;padding:0}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6313
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: GeoMapSnapshotComponent, isStandalone: true, selector: "geo-map-snapshot", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, filename: { classPropertyName: "filename", publicName: "filename", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { captured: "captured", captureError: "captureError" }, host: { classAttribute: "geo-map-snapshot-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-snapshot__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"capture()\"\n>\n <geo-icon type=\"camera\" size=\"md\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-snapshot-host{display:block}.geo-map-snapshot__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-snapshot__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn:active:not(:disabled){transform:scale(.98)}.geo-map-snapshot__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-snapshot__btn--active,.geo-map-snapshot__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn--icon-only{width:40px;padding:0}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6180
6314
  }
6181
6315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSnapshotComponent, decorators: [{
6182
6316
  type: Component,
6183
- args: [{ selector: 'geo-map-snapshot', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-snapshot-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-snapshot__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"capture()\"\n>\n <geo-icon type=\"camera\" size=\"sm\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-snapshot-host{display:block}.geo-map-snapshot__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-height:32px;padding:0}.geo-map-snapshot__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn:active:not(:disabled){transform:scale(.98)}.geo-map-snapshot__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-snapshot__btn--active,.geo-map-snapshot__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn--icon-only{width:32px;padding:0}\n"] }]
6317
+ args: [{ selector: 'geo-map-snapshot', standalone: true, imports: [GeoIconComponent, NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-snapshot-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-snapshot__btn\"\n [nz-tooltip]=\"label()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"label()\"\n [disabled]=\"!controller() || busy()\"\n (click)=\"capture()\"\n>\n <geo-icon type=\"camera\" size=\"md\" />\n</button>\n", styles: ["@charset \"UTF-8\";.geo-map-snapshot-host{display:block}.geo-map-snapshot__btn{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-snapshot__btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn:active:not(:disabled){transform:scale(.98)}.geo-map-snapshot__btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-snapshot__btn--active,.geo-map-snapshot__btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-snapshot__btn--icon-only{width:40px;padding:0}\n"] }]
6184
6318
  }] });
6185
6319
 
6186
6320
  /**
@@ -6232,11 +6366,11 @@ class GeoMapBasemapSwitcherComponent {
6232
6366
  this.basemapChange.emit(next.basemap);
6233
6367
  }
6234
6368
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapBasemapSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6235
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapBasemapSwitcherComponent, isStandalone: true, selector: "geo-map-basemap-switcher", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedId: "selectedIdChange", basemapChange: "basemapChange" }, host: { classAttribute: "geo-map-basemap-switcher-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n [nz-tooltip]=\"tooltipText()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltipText()\"\n (click)=\"toggle()\"\n>\n @if (next(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__veil\" aria-hidden=\"true\"></span>\n <span class=\"geo-map-basemap-switcher__content\">\n <span class=\"geo-map-basemap-switcher__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n", styles: [".geo-map-basemap-switcher-host{display:block}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:56px;height:56px;padding:0;overflow:hidden;border:2px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__veil{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 40%,color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent) 100%)}.geo-map-basemap-switcher__content{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;gap:2px;padding:0 6px 6px;color:var(--geo-color-neutral-white, #fff);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;width:14px;height:14px;color:inherit;filter:drop-shadow(0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 45%,transparent))}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{max-width:100%;font-size:var(--geo-font-size-tiny);font-weight:var(--geo-font-weight-semibold);line-height:1.2;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent)}\n"], dependencies: [{ kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6369
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapBasemapSwitcherComponent, isStandalone: true, selector: "geo-map-basemap-switcher", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedId: "selectedIdChange", basemapChange: "basemapChange" }, host: { classAttribute: "geo-map-basemap-switcher-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n [nz-tooltip]=\"tooltipText()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltipText()\"\n (click)=\"toggle()\"\n>\n @if (next(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__veil\" aria-hidden=\"true\"></span>\n <span class=\"geo-map-basemap-switcher__content\">\n <span class=\"geo-map-basemap-switcher__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n", styles: [".geo-map-basemap-switcher-host{display:block}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:90px;height:90px;padding:0;overflow:hidden;border:3px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-2xl);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__veil{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 40%,color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent) 100%)}.geo-map-basemap-switcher__content{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;gap:4px;padding:0 8px 8px;color:var(--geo-color-neutral-white, #fff);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;width:20px;height:20px;color:inherit;filter:drop-shadow(0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 45%,transparent))}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);line-height:1.2;text-align:left;white-space:nowrap;text-shadow:0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent)}\n"], dependencies: [{ kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6236
6370
  }
6237
6371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapBasemapSwitcherComponent, decorators: [{
6238
6372
  type: Component,
6239
- args: [{ selector: 'geo-map-basemap-switcher', standalone: true, imports: [NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-basemap-switcher-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n [nz-tooltip]=\"tooltipText()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltipText()\"\n (click)=\"toggle()\"\n>\n @if (next(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__veil\" aria-hidden=\"true\"></span>\n <span class=\"geo-map-basemap-switcher__content\">\n <span class=\"geo-map-basemap-switcher__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n", styles: [".geo-map-basemap-switcher-host{display:block}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:56px;height:56px;padding:0;overflow:hidden;border:2px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__veil{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 40%,color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent) 100%)}.geo-map-basemap-switcher__content{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;gap:2px;padding:0 6px 6px;color:var(--geo-color-neutral-white, #fff);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;width:14px;height:14px;color:inherit;filter:drop-shadow(0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 45%,transparent))}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{max-width:100%;font-size:var(--geo-font-size-tiny);font-weight:var(--geo-font-weight-semibold);line-height:1.2;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent)}\n"] }]
6373
+ args: [{ selector: 'geo-map-basemap-switcher', standalone: true, imports: [NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-basemap-switcher-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n [nz-tooltip]=\"tooltipText()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltipText()\"\n (click)=\"toggle()\"\n>\n @if (next(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__veil\" aria-hidden=\"true\"></span>\n <span class=\"geo-map-basemap-switcher__content\">\n <span class=\"geo-map-basemap-switcher__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n", styles: [".geo-map-basemap-switcher-host{display:block}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:90px;height:90px;padding:0;overflow:hidden;border:3px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-2xl);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__veil{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 40%,color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent) 100%)}.geo-map-basemap-switcher__content{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;gap:4px;padding:0 8px 8px;color:var(--geo-color-neutral-white, #fff);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;width:20px;height:20px;color:inherit;filter:drop-shadow(0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 45%,transparent))}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);line-height:1.2;text-align:left;white-space:nowrap;text-shadow:0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent)}\n"] }]
6240
6374
  }] });
6241
6375
 
6242
6376
  /**
@@ -6676,7 +6810,7 @@ class GeoMapOpacityComponent {
6676
6810
  return this.layerOptions()[0]?.id ?? null;
6677
6811
  }
6678
6812
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapOpacityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6679
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapOpacityComponent, isStandalone: true, selector: "geo-map-opacity", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, layerId: { classPropertyName: "layerId", publicName: "layerId", isSignal: true, isRequired: false, transformFunction: null }, opacity: { classPropertyName: "opacity", publicName: "opacity", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, applyToFirstLayer: { classPropertyName: "applyToFirstLayer", publicName: "applyToFirstLayer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { layerId: "layerIdChange", opacity: "opacityChange" }, host: { classAttribute: "geo-map-opacity-host" }, ngImport: i0, template: "@if (variant() === 'compact') {\n <button\n type=\"button\"\n class=\"geo-map-opacity__trigger\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomLeft\"\n nzOverlayClassName=\"geo-map-opacity-overlay\"\n [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"open()\"\n (nzVisibleChange)=\"onVisible($event)\"\n [nz-tooltip]=\"title()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"title()\"\n [disabled]=\"!controller()\"\n >\n <geo-icon type=\"bg-colors\" size=\"sm\" />\n </button>\n\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"geo-map-opacity__panel geo-map-opacity__panel--popup\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">\n {{ layerOptions()[0].title }}\n </div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n </nz-dropdown-menu>\n} @else {\n <div class=\"geo-map-opacity__panel\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">{{ layerOptions()[0].title }}</div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-opacity-host{display:block}.geo-map-opacity__trigger{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-height:32px;padding:0}.geo-map-opacity__trigger:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger:active:not(:disabled){transform:scale(.98)}.geo-map-opacity__trigger:disabled{opacity:.45;cursor:not-allowed}.geo-map-opacity__trigger--active,.geo-map-opacity__trigger--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger--icon-only{width:32px;padding:0}.geo-map-opacity-overlay .ant-dropdown-menu{padding:0;border:0;background:transparent;box-shadow:none}.geo-map-opacity__panel{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);min-width:220px;padding:10px 12px}.geo-map-opacity__panel--popup{box-shadow:var(--geo-shadow-md)}.geo-map-opacity__title{margin-bottom:8px;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-opacity__layers{display:flex;flex-direction:column;gap:4px;margin:0 0 10px;padding:0;list-style:none}.geo-map-opacity__layer{width:100%;padding:6px 8px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-800);font:inherit;font-size:var(--geo-font-size-body-small);text-align:left;cursor:pointer}.geo-map-opacity__layer:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__layer--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}.geo-map-opacity__layer-name,.geo-map-opacity__empty{margin-bottom:8px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-600)}.geo-map-opacity__slider{display:flex;align-items:center;gap:10px}.geo-map-opacity__slider geo-slider{flex:1;min-width:0}.geo-map-opacity__value{flex-shrink:0;min-width:40px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-700);text-align:right}\n"], dependencies: [{ kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoSliderComponent, selector: "geo-slider", inputs: ["value", "min", "max", "step", "disabled", "tipFormatter"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6813
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapOpacityComponent, isStandalone: true, selector: "geo-map-opacity", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, layerId: { classPropertyName: "layerId", publicName: "layerId", isSignal: true, isRequired: false, transformFunction: null }, opacity: { classPropertyName: "opacity", publicName: "opacity", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, applyToFirstLayer: { classPropertyName: "applyToFirstLayer", publicName: "applyToFirstLayer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { layerId: "layerIdChange", opacity: "opacityChange" }, host: { classAttribute: "geo-map-opacity-host" }, ngImport: i0, template: "@if (variant() === 'compact') {\n <button\n type=\"button\"\n class=\"geo-map-opacity__trigger\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomLeft\"\n nzOverlayClassName=\"geo-map-opacity-overlay\"\n [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"open()\"\n (nzVisibleChange)=\"onVisible($event)\"\n [nz-tooltip]=\"title()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"title()\"\n [disabled]=\"!controller()\"\n >\n <geo-icon type=\"bg-colors\" size=\"md\" />\n </button>\n\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"geo-map-opacity__panel geo-map-opacity__panel--popup\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">\n {{ layerOptions()[0].title }}\n </div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n </nz-dropdown-menu>\n} @else {\n <div class=\"geo-map-opacity__panel\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">{{ layerOptions()[0].title }}</div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-opacity-host{display:block}.geo-map-opacity__trigger{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-opacity__trigger:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger:active:not(:disabled){transform:scale(.98)}.geo-map-opacity__trigger:disabled{opacity:.45;cursor:not-allowed}.geo-map-opacity__trigger--active,.geo-map-opacity__trigger--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger--icon-only{width:40px;padding:0}.geo-map-opacity-overlay .ant-dropdown-menu{padding:0;border:0;background:transparent;box-shadow:none}.geo-map-opacity__panel{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);min-width:220px;padding:10px 12px}.geo-map-opacity__panel--popup{box-shadow:var(--geo-shadow-md)}.geo-map-opacity__title{margin-bottom:8px;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-opacity__layers{display:flex;flex-direction:column;gap:4px;margin:0 0 10px;padding:0;list-style:none}.geo-map-opacity__layer{width:100%;padding:6px 8px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-800);font:inherit;font-size:var(--geo-font-size-body-small);text-align:left;cursor:pointer}.geo-map-opacity__layer:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__layer--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}.geo-map-opacity__layer-name,.geo-map-opacity__empty{margin-bottom:8px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-600)}.geo-map-opacity__slider{display:flex;align-items:center;gap:10px}.geo-map-opacity__slider geo-slider{flex:1;min-width:0}.geo-map-opacity__value{flex-shrink:0;min-width:40px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-700);text-align:right}\n"], dependencies: [{ kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoSliderComponent, selector: "geo-slider", inputs: ["value", "min", "max", "step", "disabled", "tipFormatter"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6680
6814
  }
6681
6815
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapOpacityComponent, decorators: [{
6682
6816
  type: Component,
@@ -6685,7 +6819,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6685
6819
  NzToolTipModule,
6686
6820
  GeoIconComponent,
6687
6821
  GeoSliderComponent,
6688
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-opacity-host' }, template: "@if (variant() === 'compact') {\n <button\n type=\"button\"\n class=\"geo-map-opacity__trigger\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomLeft\"\n nzOverlayClassName=\"geo-map-opacity-overlay\"\n [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"open()\"\n (nzVisibleChange)=\"onVisible($event)\"\n [nz-tooltip]=\"title()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"title()\"\n [disabled]=\"!controller()\"\n >\n <geo-icon type=\"bg-colors\" size=\"sm\" />\n </button>\n\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"geo-map-opacity__panel geo-map-opacity__panel--popup\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">\n {{ layerOptions()[0].title }}\n </div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n </nz-dropdown-menu>\n} @else {\n <div class=\"geo-map-opacity__panel\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">{{ layerOptions()[0].title }}</div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-opacity-host{display:block}.geo-map-opacity__trigger{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-height:32px;padding:0}.geo-map-opacity__trigger:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger:active:not(:disabled){transform:scale(.98)}.geo-map-opacity__trigger:disabled{opacity:.45;cursor:not-allowed}.geo-map-opacity__trigger--active,.geo-map-opacity__trigger--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger--icon-only{width:32px;padding:0}.geo-map-opacity-overlay .ant-dropdown-menu{padding:0;border:0;background:transparent;box-shadow:none}.geo-map-opacity__panel{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);min-width:220px;padding:10px 12px}.geo-map-opacity__panel--popup{box-shadow:var(--geo-shadow-md)}.geo-map-opacity__title{margin-bottom:8px;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-opacity__layers{display:flex;flex-direction:column;gap:4px;margin:0 0 10px;padding:0;list-style:none}.geo-map-opacity__layer{width:100%;padding:6px 8px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-800);font:inherit;font-size:var(--geo-font-size-body-small);text-align:left;cursor:pointer}.geo-map-opacity__layer:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__layer--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}.geo-map-opacity__layer-name,.geo-map-opacity__empty{margin-bottom:8px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-600)}.geo-map-opacity__slider{display:flex;align-items:center;gap:10px}.geo-map-opacity__slider geo-slider{flex:1;min-width:0}.geo-map-opacity__value{flex-shrink:0;min-width:40px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-700);text-align:right}\n"] }]
6822
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-opacity-host' }, template: "@if (variant() === 'compact') {\n <button\n type=\"button\"\n class=\"geo-map-opacity__trigger\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"bottomLeft\"\n nzOverlayClassName=\"geo-map-opacity-overlay\"\n [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"open()\"\n (nzVisibleChange)=\"onVisible($event)\"\n [nz-tooltip]=\"title()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"title()\"\n [disabled]=\"!controller()\"\n >\n <geo-icon type=\"bg-colors\" size=\"md\" />\n </button>\n\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"geo-map-opacity__panel geo-map-opacity__panel--popup\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">\n {{ layerOptions()[0].title }}\n </div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n </nz-dropdown-menu>\n} @else {\n <div class=\"geo-map-opacity__panel\">\n <div class=\"geo-map-opacity__title\">{{ title() }}</div>\n @if (layerOptions().length > 1) {\n <ul class=\"geo-map-opacity__layers\">\n @for (layer of layerOptions(); track layer.id) {\n <li>\n <button\n type=\"button\"\n class=\"geo-map-opacity__layer\"\n [class.geo-map-opacity__layer--active]=\"\n layer.id === (layerId() || layerOptions()[0].id)\n \"\n (click)=\"selectLayer(layer.id)\"\n >\n {{ layer.title }}\n </button>\n </li>\n }\n </ul>\n } @else if (layerOptions().length === 1) {\n <div class=\"geo-map-opacity__layer-name\">{{ layerOptions()[0].title }}</div>\n } @else {\n <div class=\"geo-map-opacity__empty\">Ch\u01B0a c\u00F3 l\u1EDBp \u0111\u1EC3 ch\u1EC9nh.</div>\n }\n\n <div class=\"geo-map-opacity__slider\">\n <geo-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"1\" />\n <span class=\"geo-map-opacity__value\">{{ opacity() }}%</span>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-opacity-host{display:block}.geo-map-opacity__trigger{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:48px;min-height:48px;padding:0}.geo-map-opacity__trigger:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger:active:not(:disabled){transform:scale(.98)}.geo-map-opacity__trigger:disabled{opacity:.45;cursor:not-allowed}.geo-map-opacity__trigger--active,.geo-map-opacity__trigger--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-opacity__trigger--icon-only{width:40px;padding:0}.geo-map-opacity-overlay .ant-dropdown-menu{padding:0;border:0;background:transparent;box-shadow:none}.geo-map-opacity__panel{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);min-width:220px;padding:10px 12px}.geo-map-opacity__panel--popup{box-shadow:var(--geo-shadow-md)}.geo-map-opacity__title{margin-bottom:8px;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-opacity__layers{display:flex;flex-direction:column;gap:4px;margin:0 0 10px;padding:0;list-style:none}.geo-map-opacity__layer{width:100%;padding:6px 8px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-800);font:inherit;font-size:var(--geo-font-size-body-small);text-align:left;cursor:pointer}.geo-map-opacity__layer:hover{background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-opacity__layer--active{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default);font-weight:var(--geo-font-weight-semibold)}.geo-map-opacity__layer-name,.geo-map-opacity__empty{margin-bottom:8px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-600)}.geo-map-opacity__slider{display:flex;align-items:center;gap:10px}.geo-map-opacity__slider geo-slider{flex:1;min-width:0}.geo-map-opacity__value{flex-shrink:0;min-width:40px;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-700);text-align:right}\n"] }]
6689
6823
  }], ctorParameters: () => [] });
6690
6824
 
6691
6825
  /**
@@ -6698,8 +6832,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6698
6832
  class GeoMapLegendComponent {
6699
6833
  title = input('Chú giải');
6700
6834
  items = input([]);
6701
- /** True khi danh mục chú giải không tải được (`ERR_MAP_LEGEND_CATALOG_MISSING`). */
6702
- catalogMissing = input(false);
6703
6835
  open = model(false);
6704
6836
  closed = output();
6705
6837
  onClose() {
@@ -6707,14 +6839,14 @@ class GeoMapLegendComponent {
6707
6839
  this.closed.emit();
6708
6840
  }
6709
6841
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6710
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapLegendComponent, isStandalone: true, selector: "geo-map-legend", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, catalogMissing: { classPropertyName: "catalogMissing", publicName: "catalogMissing", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", closed: "closed" }, host: { properties: { "class.geo-map-legend-host--open": "open()" }, classAttribute: "geo-map-legend-host" }, ngImport: i0, template: "@if (open()) {\n <aside class=\"geo-map-legend\" role=\"dialog\" [attr.aria-label]=\"title()\">\n <header class=\"geo-map-legend__header\">\n <h3 class=\"geo-map-legend__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-legend__close\"\n aria-label=\"\u0110\u00F3ng ch\u00FA gi\u1EA3i\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n @if (catalogMissing()) {\n <p class=\"geo-map-legend__notice\">\n Kh\u00F4ng t\u1EA3i \u0111\u01B0\u1EE3c danh m\u1EE5c ch\u00FA gi\u1EA3i. Vui l\u00F2ng th\u1EED l\u1EA1i sau.\n </p>\n } @else {\n <ul class=\"geo-map-legend__list\">\n @for (item of items(); track item.code || item.label) {\n <li class=\"geo-map-legend__item\">\n @if (item.swatchUrl) {\n <img class=\"geo-map-legend__swatch\" [src]=\"item.swatchUrl\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-legend__swatch geo-map-legend__swatch--color\"\n [style.background]=\"item.color || 'var(--geo-color-neutral-300)'\"\n ></span>\n }\n <span class=\"geo-map-legend__text\">\n @if (item.code) {\n <span class=\"geo-map-legend__code\">{{ item.code }}</span>\n }\n <span class=\"geo-map-legend__label\">{{ item.label }}</span>\n </span>\n </li>\n } @empty {\n <li class=\"geo-map-legend__empty\">Ch\u01B0a c\u00F3 m\u1EE5c ch\u00FA gi\u1EA3i.</li>\n }\n </ul>\n }\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-legend-host{display:none;max-width:min(320px,100%)}.geo-map-legend-host--open{display:block}.geo-map-legend{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(320px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-legend__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-legend__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-legend__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-legend__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-legend__close:active:not(:disabled){transform:scale(.98)}.geo-map-legend__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-legend__close--active,.geo-map-legend__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-legend__close--icon-only{width:32px;padding:0}.geo-map-legend__list{margin:0;padding:8px 12px 12px;list-style:none;overflow:auto}.geo-map-legend__item{display:flex;align-items:center;gap:10px;padding:6px 4px}.geo-map-legend__swatch{flex-shrink:0;width:20px;height:20px;border-radius:var(--geo-radius-sm);border:1px solid var(--geo-color-neutral-200);object-fit:cover}.geo-map-legend__swatch--color{display:inline-block}.geo-map-legend__text{display:flex;flex-direction:column;gap:1px;min-width:0}.geo-map-legend__code{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-500)}.geo-map-legend__label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-map-legend__empty{padding:8px 4px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-legend__notice{margin:0;padding:12px 16px 14px;font-size:var(--geo-font-size-body-small);color:var(--geo-color-error-default)}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6842
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapLegendComponent, isStandalone: true, selector: "geo-map-legend", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", closed: "closed" }, host: { properties: { "class.geo-map-legend-host--open": "open()" }, classAttribute: "geo-map-legend-host" }, ngImport: i0, template: "@if (open()) {\n <aside class=\"geo-map-legend\" role=\"dialog\" [attr.aria-label]=\"title()\">\n <header class=\"geo-map-legend__header\">\n <h3 class=\"geo-map-legend__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-legend__close\"\n aria-label=\"\u0110\u00F3ng ch\u00FA gi\u1EA3i\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <ul class=\"geo-map-legend__list\">\n @for (item of items(); track item.code || item.label) {\n <li class=\"geo-map-legend__item\">\n @if (item.swatchUrl) {\n <img class=\"geo-map-legend__swatch\" [src]=\"item.swatchUrl\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-legend__swatch geo-map-legend__swatch--color\"\n [style.background]=\"item.color || 'var(--geo-color-neutral-300)'\"\n ></span>\n }\n <span class=\"geo-map-legend__text\">\n @if (item.code) {\n <span class=\"geo-map-legend__code\">{{ item.code }}</span>\n }\n <span class=\"geo-map-legend__label\">{{ item.label }}</span>\n </span>\n </li>\n } @empty {\n <li class=\"geo-map-legend__empty\">Ch\u01B0a c\u00F3 m\u1EE5c ch\u00FA gi\u1EA3i.</li>\n }\n </ul>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-legend-host{display:none;max-width:min(320px,100%)}.geo-map-legend-host--open{display:block}.geo-map-legend{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(320px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-legend__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-legend__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-legend__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-legend__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-legend__close:active:not(:disabled){transform:scale(.98)}.geo-map-legend__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-legend__close--active,.geo-map-legend__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-legend__close--icon-only{width:40px;padding:0}.geo-map-legend__list{margin:0;padding:8px 12px 12px;list-style:none;overflow:auto}.geo-map-legend__item{display:flex;align-items:center;gap:10px;padding:6px 4px}.geo-map-legend__swatch{flex-shrink:0;width:20px;height:20px;border-radius:var(--geo-radius-sm);border:1px solid var(--geo-color-neutral-200);object-fit:cover}.geo-map-legend__swatch--color{display:inline-block}.geo-map-legend__text{display:flex;flex-direction:column;gap:1px;min-width:0}.geo-map-legend__code{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-500)}.geo-map-legend__label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-map-legend__empty{padding:8px 4px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6711
6843
  }
6712
6844
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLegendComponent, decorators: [{
6713
6845
  type: Component,
6714
6846
  args: [{ selector: 'geo-map-legend', standalone: true, imports: [GeoIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
6715
6847
  class: 'geo-map-legend-host',
6716
6848
  '[class.geo-map-legend-host--open]': 'open()',
6717
- }, template: "@if (open()) {\n <aside class=\"geo-map-legend\" role=\"dialog\" [attr.aria-label]=\"title()\">\n <header class=\"geo-map-legend__header\">\n <h3 class=\"geo-map-legend__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-legend__close\"\n aria-label=\"\u0110\u00F3ng ch\u00FA gi\u1EA3i\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n @if (catalogMissing()) {\n <p class=\"geo-map-legend__notice\">\n Kh\u00F4ng t\u1EA3i \u0111\u01B0\u1EE3c danh m\u1EE5c ch\u00FA gi\u1EA3i. Vui l\u00F2ng th\u1EED l\u1EA1i sau.\n </p>\n } @else {\n <ul class=\"geo-map-legend__list\">\n @for (item of items(); track item.code || item.label) {\n <li class=\"geo-map-legend__item\">\n @if (item.swatchUrl) {\n <img class=\"geo-map-legend__swatch\" [src]=\"item.swatchUrl\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-legend__swatch geo-map-legend__swatch--color\"\n [style.background]=\"item.color || 'var(--geo-color-neutral-300)'\"\n ></span>\n }\n <span class=\"geo-map-legend__text\">\n @if (item.code) {\n <span class=\"geo-map-legend__code\">{{ item.code }}</span>\n }\n <span class=\"geo-map-legend__label\">{{ item.label }}</span>\n </span>\n </li>\n } @empty {\n <li class=\"geo-map-legend__empty\">Ch\u01B0a c\u00F3 m\u1EE5c ch\u00FA gi\u1EA3i.</li>\n }\n </ul>\n }\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-legend-host{display:none;max-width:min(320px,100%)}.geo-map-legend-host--open{display:block}.geo-map-legend{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(320px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-legend__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-legend__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-legend__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-legend__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-legend__close:active:not(:disabled){transform:scale(.98)}.geo-map-legend__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-legend__close--active,.geo-map-legend__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-legend__close--icon-only{width:32px;padding:0}.geo-map-legend__list{margin:0;padding:8px 12px 12px;list-style:none;overflow:auto}.geo-map-legend__item{display:flex;align-items:center;gap:10px;padding:6px 4px}.geo-map-legend__swatch{flex-shrink:0;width:20px;height:20px;border-radius:var(--geo-radius-sm);border:1px solid var(--geo-color-neutral-200);object-fit:cover}.geo-map-legend__swatch--color{display:inline-block}.geo-map-legend__text{display:flex;flex-direction:column;gap:1px;min-width:0}.geo-map-legend__code{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-500)}.geo-map-legend__label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-map-legend__empty{padding:8px 4px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-legend__notice{margin:0;padding:12px 16px 14px;font-size:var(--geo-font-size-body-small);color:var(--geo-color-error-default)}\n"] }]
6849
+ }, template: "@if (open()) {\n <aside class=\"geo-map-legend\" role=\"dialog\" [attr.aria-label]=\"title()\">\n <header class=\"geo-map-legend__header\">\n <h3 class=\"geo-map-legend__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-legend__close\"\n aria-label=\"\u0110\u00F3ng ch\u00FA gi\u1EA3i\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <ul class=\"geo-map-legend__list\">\n @for (item of items(); track item.code || item.label) {\n <li class=\"geo-map-legend__item\">\n @if (item.swatchUrl) {\n <img class=\"geo-map-legend__swatch\" [src]=\"item.swatchUrl\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-legend__swatch geo-map-legend__swatch--color\"\n [style.background]=\"item.color || 'var(--geo-color-neutral-300)'\"\n ></span>\n }\n <span class=\"geo-map-legend__text\">\n @if (item.code) {\n <span class=\"geo-map-legend__code\">{{ item.code }}</span>\n }\n <span class=\"geo-map-legend__label\">{{ item.label }}</span>\n </span>\n </li>\n } @empty {\n <li class=\"geo-map-legend__empty\">Ch\u01B0a c\u00F3 m\u1EE5c ch\u00FA gi\u1EA3i.</li>\n }\n </ul>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-legend-host{display:none;max-width:min(320px,100%)}.geo-map-legend-host--open{display:block}.geo-map-legend{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(320px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-legend__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-legend__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-legend__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-legend__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-legend__close:active:not(:disabled){transform:scale(.98)}.geo-map-legend__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-legend__close--active,.geo-map-legend__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-legend__close--icon-only{width:40px;padding:0}.geo-map-legend__list{margin:0;padding:8px 12px 12px;list-style:none;overflow:auto}.geo-map-legend__item{display:flex;align-items:center;gap:10px;padding:6px 4px}.geo-map-legend__swatch{flex-shrink:0;width:20px;height:20px;border-radius:var(--geo-radius-sm);border:1px solid var(--geo-color-neutral-200);object-fit:cover}.geo-map-legend__swatch--color{display:inline-block}.geo-map-legend__text{display:flex;flex-direction:column;gap:1px;min-width:0}.geo-map-legend__code{font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-500)}.geo-map-legend__label{font-size:var(--geo-font-size-body-small);color:var(--geo-color-neutral-800)}.geo-map-legend__empty{padding:8px 4px;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}\n"] }]
6718
6850
  }] });
6719
6851
 
6720
6852
  const GROUP_META = {
@@ -6899,14 +7031,14 @@ class GeoMapLayersDrawerComponent {
6899
7031
  this.closed.emit();
6900
7032
  }
6901
7033
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLayersDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6902
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapLayersDrawerComponent, isStandalone: true, selector: "geo-map-layers-drawer", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, legendItems: { classPropertyName: "legendItems", publicName: "legendItems", isSignal: true, isRequired: false, transformFunction: null }, showOpacity: { classPropertyName: "showOpacity", publicName: "showOpacity", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, layers: { classPropertyName: "layers", publicName: "layers", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", layers: "layersChange", closed: "closed" }, host: { properties: { "class.geo-map-layers-drawer-host--open": "open()" }, classAttribute: "geo-map-layers-drawer-host" }, ngImport: i0, template: "@if (open()) {\n <aside class=\"geo-map-layers-drawer\" role=\"dialog\" aria-label=\"L\u1EDBp b\u1EA3n \u0111\u1ED3\">\n <header class=\"geo-map-layers-drawer__header\">\n <h3 class=\"geo-map-layers-drawer__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-layers-drawer__close\"\n aria-label=\"\u0110\u00F3ng l\u1EDBp b\u1EA3n \u0111\u1ED3\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-layers-drawer__body\">\n <geo-map-layer-panel\n [embedded]=\"true\"\n [controller]=\"controller()\"\n [(layers)]=\"layers\"\n />\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-layers-drawer-host{display:none}.geo-map-layers-drawer-host--open{display:block}.geo-map-layers-drawer{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-layers-drawer__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-layers-drawer__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-layers-drawer__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-layers-drawer__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close:active:not(:disabled){transform:scale(.98)}.geo-map-layers-drawer__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-layers-drawer__close--active,.geo-map-layers-drawer__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close--icon-only{width:32px;padding:0}.geo-map-layers-drawer__body{padding:4px 16px 14px;overflow:auto}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoMapLayerPanelComponent, selector: "geo-map-layer-panel", inputs: ["controller", "title", "embedded", "layers"], outputs: ["layersChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7034
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapLayersDrawerComponent, isStandalone: true, selector: "geo-map-layers-drawer", inputs: { controller: { classPropertyName: "controller", publicName: "controller", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, legendItems: { classPropertyName: "legendItems", publicName: "legendItems", isSignal: true, isRequired: false, transformFunction: null }, showOpacity: { classPropertyName: "showOpacity", publicName: "showOpacity", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, layers: { classPropertyName: "layers", publicName: "layers", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", layers: "layersChange", closed: "closed" }, host: { properties: { "class.geo-map-layers-drawer-host--open": "open()" }, classAttribute: "geo-map-layers-drawer-host" }, ngImport: i0, template: "@if (open()) {\n <aside class=\"geo-map-layers-drawer\" role=\"dialog\" aria-label=\"L\u1EDBp b\u1EA3n \u0111\u1ED3\">\n <header class=\"geo-map-layers-drawer__header\">\n <h3 class=\"geo-map-layers-drawer__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-layers-drawer__close\"\n aria-label=\"\u0110\u00F3ng l\u1EDBp b\u1EA3n \u0111\u1ED3\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-layers-drawer__body\">\n <geo-map-layer-panel\n [embedded]=\"true\"\n [controller]=\"controller()\"\n [(layers)]=\"layers\"\n />\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-layers-drawer-host{display:none}.geo-map-layers-drawer-host--open{display:block}.geo-map-layers-drawer{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-layers-drawer__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-layers-drawer__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-layers-drawer__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-layers-drawer__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close:active:not(:disabled){transform:scale(.98)}.geo-map-layers-drawer__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-layers-drawer__close--active,.geo-map-layers-drawer__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close--icon-only{width:40px;padding:0}.geo-map-layers-drawer__body{padding:4px 16px 14px;overflow:auto}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoMapLayerPanelComponent, selector: "geo-map-layer-panel", inputs: ["controller", "title", "embedded", "layers"], outputs: ["layersChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6903
7035
  }
6904
7036
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLayersDrawerComponent, decorators: [{
6905
7037
  type: Component,
6906
7038
  args: [{ selector: 'geo-map-layers-drawer', standalone: true, imports: [GeoIconComponent, GeoMapLayerPanelComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
6907
7039
  class: 'geo-map-layers-drawer-host',
6908
7040
  '[class.geo-map-layers-drawer-host--open]': 'open()',
6909
- }, template: "@if (open()) {\n <aside class=\"geo-map-layers-drawer\" role=\"dialog\" aria-label=\"L\u1EDBp b\u1EA3n \u0111\u1ED3\">\n <header class=\"geo-map-layers-drawer__header\">\n <h3 class=\"geo-map-layers-drawer__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-layers-drawer__close\"\n aria-label=\"\u0110\u00F3ng l\u1EDBp b\u1EA3n \u0111\u1ED3\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-layers-drawer__body\">\n <geo-map-layer-panel\n [embedded]=\"true\"\n [controller]=\"controller()\"\n [(layers)]=\"layers\"\n />\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-layers-drawer-host{display:none}.geo-map-layers-drawer-host--open{display:block}.geo-map-layers-drawer{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-layers-drawer__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-layers-drawer__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-layers-drawer__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-layers-drawer__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close:active:not(:disabled){transform:scale(.98)}.geo-map-layers-drawer__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-layers-drawer__close--active,.geo-map-layers-drawer__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close--icon-only{width:32px;padding:0}.geo-map-layers-drawer__body{padding:4px 16px 14px;overflow:auto}\n"] }]
7041
+ }, template: "@if (open()) {\n <aside class=\"geo-map-layers-drawer\" role=\"dialog\" aria-label=\"L\u1EDBp b\u1EA3n \u0111\u1ED3\">\n <header class=\"geo-map-layers-drawer__header\">\n <h3 class=\"geo-map-layers-drawer__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-layers-drawer__close\"\n aria-label=\"\u0110\u00F3ng l\u1EDBp b\u1EA3n \u0111\u1ED3\"\n (click)=\"onClose()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-layers-drawer__body\">\n <geo-map-layer-panel\n [embedded]=\"true\"\n [controller]=\"controller()\"\n [(layers)]=\"layers\"\n />\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-layers-drawer-host{display:none}.geo-map-layers-drawer-host--open{display:block}.geo-map-layers-drawer{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden}.geo-map-layers-drawer__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-layers-drawer__title{margin:0;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-layers-drawer__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-layers-drawer__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close:active:not(:disabled){transform:scale(.98)}.geo-map-layers-drawer__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-layers-drawer__close--active,.geo-map-layers-drawer__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-layers-drawer__close--icon-only{width:40px;padding:0}.geo-map-layers-drawer__body{padding:4px 16px 14px;overflow:auto}\n"] }]
6910
7042
  }] });
6911
7043
 
6912
7044
  /**
@@ -7067,8 +7199,6 @@ class GeoMapAdminFilterComponent {
7067
7199
  open = model(false);
7068
7200
  title = input('Đơn vị hành chính');
7069
7201
  nodes = input([]);
7070
- /** `single` — chọn đúng 1 xã/phường (BR-06-03); `multi` — checkbox nhiều cấp (mặc định). */
7071
- selectionMode = input('multi');
7072
7202
  checkedKeys = model([]);
7073
7203
  expandedKeys = model([]);
7074
7204
  apply = output();
@@ -7095,14 +7225,14 @@ class GeoMapAdminFilterComponent {
7095
7225
  this.closed.emit();
7096
7226
  }
7097
7227
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapAdminFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7098
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapAdminFilterComponent, isStandalone: true, selector: "geo-map-admin-filter", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, checkedKeys: { classPropertyName: "checkedKeys", publicName: "checkedKeys", isSignal: true, isRequired: false, transformFunction: null }, expandedKeys: { classPropertyName: "expandedKeys", publicName: "expandedKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", checkedKeys: "checkedKeysChange", expandedKeys: "expandedKeysChange", apply: "apply", reset: "reset", fitProvince: "fitProvince", closed: "closed", selectionChange: "selectionChange" }, host: { properties: { "class.geo-map-admin-filter-host--open": "open()" }, classAttribute: "geo-map-admin-filter-host" }, ngImport: i0, template: "@if (open()) {\n <section class=\"geo-map-admin-filter\" aria-label=\"L\u1ECDc \u0111\u01A1n v\u1ECB h\u00E0nh ch\u00EDnh\">\n <header class=\"geo-map-admin-filter__header\">\n <h3 class=\"geo-map-admin-filter__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-admin-filter__icon-btn\"\n aria-label=\"\u0110\u00F3ng b\u1ED9 l\u1ECDc\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-admin-filter__body\">\n <geo-tree\n [nodes]=\"nodes()\"\n [selectionMode]=\"selectionMode()\"\n [checkable]=\"selectionMode() === 'multi'\"\n [checkedKeys]=\"checkedKeys()\"\n [selectedKeys]=\"checkedKeys()\"\n [expandedKeys]=\"expandedKeys()\"\n (checkedKeysChange)=\"onCheckedChange($event)\"\n (selectedKeysChange)=\"onCheckedChange($event)\"\n (expandedKeysChange)=\"expandedKeys.set($event)\"\n />\n </div>\n\n <footer class=\"geo-map-admin-filter__footer\">\n <geo-button appearance=\"secondary\" (clicked)=\"onFitProvince()\">\n Xem to\u00E0n t\u1EC9nh\n </geo-button>\n <div class=\"geo-map-admin-filter__footer-end\">\n <geo-button appearance=\"secondary\" (clicked)=\"onReset()\">\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n <geo-button appearance=\"primary\" (clicked)=\"onApply()\">\n \u00C1p d\u1EE5ng\n </geo-button>\n </div>\n </footer>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-admin-filter-host{display:none}.geo-map-admin-filter-host--open{display:block}.geo-map-admin-filter{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(320px,100vw - 32px);max-height:min(520px,75vh);display:flex;flex-direction:column;overflow:hidden}.geo-map-admin-filter__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-admin-filter__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-admin-filter__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-admin-filter__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-admin-filter__icon-btn--active,.geo-map-admin-filter__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn--icon-only{width:32px;padding:0}.geo-map-admin-filter__body{padding:8px 10px;overflow:auto;flex:1;min-height:160px}.geo-map-admin-filter__footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__footer-end{display:flex;gap:8px;margin-left:auto}\n"], dependencies: [{ kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoTreeComponent, selector: "geo-tree", inputs: ["nodes", "checkable", "selectionMode", "checkedKeys", "selectedKeys", "expandedKeys", "showLine", "blockNode"], outputs: ["checkedKeysChange", "selectedKeysChange", "expandedKeysChange", "nodeClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7228
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapAdminFilterComponent, isStandalone: true, selector: "geo-map-admin-filter", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, checkedKeys: { classPropertyName: "checkedKeys", publicName: "checkedKeys", isSignal: true, isRequired: false, transformFunction: null }, expandedKeys: { classPropertyName: "expandedKeys", publicName: "expandedKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", checkedKeys: "checkedKeysChange", expandedKeys: "expandedKeysChange", apply: "apply", reset: "reset", fitProvince: "fitProvince", closed: "closed", selectionChange: "selectionChange" }, host: { properties: { "class.geo-map-admin-filter-host--open": "open()" }, classAttribute: "geo-map-admin-filter-host" }, ngImport: i0, template: "@if (open()) {\n <section class=\"geo-map-admin-filter\" aria-label=\"L\u1ECDc \u0111\u01A1n v\u1ECB h\u00E0nh ch\u00EDnh\">\n <header class=\"geo-map-admin-filter__header\">\n <h3 class=\"geo-map-admin-filter__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-admin-filter__icon-btn\"\n aria-label=\"\u0110\u00F3ng b\u1ED9 l\u1ECDc\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-admin-filter__body\">\n <geo-tree\n [nodes]=\"nodes()\"\n [checkable]=\"true\"\n [checkedKeys]=\"checkedKeys()\"\n [expandedKeys]=\"expandedKeys()\"\n (checkedKeysChange)=\"onCheckedChange($event)\"\n (expandedKeysChange)=\"expandedKeys.set($event)\"\n />\n </div>\n\n <footer class=\"geo-map-admin-filter__footer\">\n <geo-button appearance=\"secondary\" (clicked)=\"onFitProvince()\">\n Xem to\u00E0n t\u1EC9nh\n </geo-button>\n <div class=\"geo-map-admin-filter__footer-end\">\n <geo-button appearance=\"secondary\" (clicked)=\"onReset()\">\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n <geo-button appearance=\"primary\" (clicked)=\"onApply()\">\n \u00C1p d\u1EE5ng\n </geo-button>\n </div>\n </footer>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-admin-filter-host{display:none}.geo-map-admin-filter-host--open{display:block}.geo-map-admin-filter{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(320px,100vw - 32px);max-height:min(520px,75vh);display:flex;flex-direction:column;overflow:hidden}.geo-map-admin-filter__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-admin-filter__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-admin-filter__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-admin-filter__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-admin-filter__icon-btn--active,.geo-map-admin-filter__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn--icon-only{width:40px;padding:0}.geo-map-admin-filter__body{padding:8px 10px;overflow:auto;flex:1;min-height:160px}.geo-map-admin-filter__footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__footer-end{display:flex;gap:8px;margin-left:auto}\n"], dependencies: [{ kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoTreeComponent, selector: "geo-tree", inputs: ["nodes", "checkable", "checkedKeys", "expandedKeys", "showLine", "blockNode"], outputs: ["checkedKeysChange", "expandedKeysChange", "nodeClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7099
7229
  }
7100
7230
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapAdminFilterComponent, decorators: [{
7101
7231
  type: Component,
7102
7232
  args: [{ selector: 'geo-map-admin-filter', standalone: true, imports: [GeoButtonComponent, GeoIconComponent, GeoTreeComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
7103
7233
  class: 'geo-map-admin-filter-host',
7104
7234
  '[class.geo-map-admin-filter-host--open]': 'open()',
7105
- }, template: "@if (open()) {\n <section class=\"geo-map-admin-filter\" aria-label=\"L\u1ECDc \u0111\u01A1n v\u1ECB h\u00E0nh ch\u00EDnh\">\n <header class=\"geo-map-admin-filter__header\">\n <h3 class=\"geo-map-admin-filter__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-admin-filter__icon-btn\"\n aria-label=\"\u0110\u00F3ng b\u1ED9 l\u1ECDc\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-admin-filter__body\">\n <geo-tree\n [nodes]=\"nodes()\"\n [selectionMode]=\"selectionMode()\"\n [checkable]=\"selectionMode() === 'multi'\"\n [checkedKeys]=\"checkedKeys()\"\n [selectedKeys]=\"checkedKeys()\"\n [expandedKeys]=\"expandedKeys()\"\n (checkedKeysChange)=\"onCheckedChange($event)\"\n (selectedKeysChange)=\"onCheckedChange($event)\"\n (expandedKeysChange)=\"expandedKeys.set($event)\"\n />\n </div>\n\n <footer class=\"geo-map-admin-filter__footer\">\n <geo-button appearance=\"secondary\" (clicked)=\"onFitProvince()\">\n Xem to\u00E0n t\u1EC9nh\n </geo-button>\n <div class=\"geo-map-admin-filter__footer-end\">\n <geo-button appearance=\"secondary\" (clicked)=\"onReset()\">\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n <geo-button appearance=\"primary\" (clicked)=\"onApply()\">\n \u00C1p d\u1EE5ng\n </geo-button>\n </div>\n </footer>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-admin-filter-host{display:none}.geo-map-admin-filter-host--open{display:block}.geo-map-admin-filter{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(320px,100vw - 32px);max-height:min(520px,75vh);display:flex;flex-direction:column;overflow:hidden}.geo-map-admin-filter__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-admin-filter__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-admin-filter__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-admin-filter__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-admin-filter__icon-btn--active,.geo-map-admin-filter__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn--icon-only{width:32px;padding:0}.geo-map-admin-filter__body{padding:8px 10px;overflow:auto;flex:1;min-height:160px}.geo-map-admin-filter__footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__footer-end{display:flex;gap:8px;margin-left:auto}\n"] }]
7235
+ }, template: "@if (open()) {\n <section class=\"geo-map-admin-filter\" aria-label=\"L\u1ECDc \u0111\u01A1n v\u1ECB h\u00E0nh ch\u00EDnh\">\n <header class=\"geo-map-admin-filter__header\">\n <h3 class=\"geo-map-admin-filter__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-admin-filter__icon-btn\"\n aria-label=\"\u0110\u00F3ng b\u1ED9 l\u1ECDc\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-admin-filter__body\">\n <geo-tree\n [nodes]=\"nodes()\"\n [checkable]=\"true\"\n [checkedKeys]=\"checkedKeys()\"\n [expandedKeys]=\"expandedKeys()\"\n (checkedKeysChange)=\"onCheckedChange($event)\"\n (expandedKeysChange)=\"expandedKeys.set($event)\"\n />\n </div>\n\n <footer class=\"geo-map-admin-filter__footer\">\n <geo-button appearance=\"secondary\" (clicked)=\"onFitProvince()\">\n Xem to\u00E0n t\u1EC9nh\n </geo-button>\n <div class=\"geo-map-admin-filter__footer-end\">\n <geo-button appearance=\"secondary\" (clicked)=\"onReset()\">\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n <geo-button appearance=\"primary\" (clicked)=\"onApply()\">\n \u00C1p d\u1EE5ng\n </geo-button>\n </div>\n </footer>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-admin-filter-host{display:none}.geo-map-admin-filter-host--open{display:block}.geo-map-admin-filter{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(320px,100vw - 32px);max-height:min(520px,75vh);display:flex;flex-direction:column;overflow:hidden}.geo-map-admin-filter__header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__title{margin:0;font-size:var(--geo-font-size-body);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-admin-filter__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0}.geo-map-admin-filter__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-admin-filter__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-admin-filter__icon-btn--active,.geo-map-admin-filter__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-admin-filter__icon-btn--icon-only{width:40px;padding:0}.geo-map-admin-filter__body{padding:8px 10px;overflow:auto;flex:1;min-height:160px}.geo-map-admin-filter__footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-admin-filter__footer-end{display:flex;gap:8px;margin-left:auto}\n"] }]
7106
7236
  }] });
7107
7237
 
7108
7238
  /**
@@ -7246,14 +7376,14 @@ class GeoMapParcelPopupComponent {
7246
7376
  }
7247
7377
  }
7248
7378
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapParcelPopupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7249
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapParcelPopupComponent, isStandalone: true, selector: "geo-map-parcel-popup", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, parcel: { classPropertyName: "parcel", publicName: "parcel", isSignal: true, isRequired: false, transformFunction: null }, audience: { classPropertyName: "audience", publicName: "audience", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", closed: "closed", back: "back", exportClick: "exportClick", diagramClick: "diagramClick" }, host: { properties: { "class.geo-map-parcel-popup-host--open": "open()" }, classAttribute: "geo-map-parcel-popup-host" }, ngImport: i0, template: "@if (open() && parcel(); as data) {\n <aside class=\"geo-map-parcel-popup\" role=\"dialog\" aria-label=\"Th\u00F4ng tin th\u1EEDa \u0111\u1EA5t\">\n <header class=\"geo-map-parcel-popup__header\">\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__back\"\n aria-label=\"Quay l\u1EA1i\"\n (click)=\"onBack()\"\n >\n <geo-icon type=\"arrow-left\" size=\"sm\" />\n </button>\n <h3 class=\"geo-map-parcel-popup__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__close\"\n aria-label=\"\u0110\u00F3ng chi ti\u1EBFt\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-parcel-popup__body\">\n @for (section of sections(); track section.id) {\n <section class=\"geo-map-parcel-popup__section\">\n <div class=\"geo-map-parcel-popup__section-head\">\n <h4 class=\"geo-map-parcel-popup__section-title\">\n <geo-icon [type]=\"section.icon\" size=\"sm\" />\n <span>{{ section.title }}</span>\n </h4>\n @if (section.diagram) {\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__link\"\n (click)=\"onDiagramDetail()\"\n >\n Chi ti\u1EBFt\n </button>\n }\n </div>\n\n @if (section.rows?.length) {\n <dl class=\"geo-map-parcel-popup__rows\">\n @for (row of section.rows; track row.label) {\n <div class=\"geo-map-parcel-popup__row\">\n <dt>{{ row.label }}:</dt>\n <dd>{{ row.value }}</dd>\n </div>\n }\n </dl>\n } @else if (section.value) {\n <p class=\"geo-map-parcel-popup__value\">{{ section.value }}</p>\n }\n\n @if (section.diagram) {\n <div class=\"geo-map-parcel-popup__diagram\">\n @if (data.diagramUrl) {\n <img\n class=\"geo-map-parcel-popup__diagram-img\"\n [src]=\"data.diagramUrl\"\n alt=\"S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t\"\n />\n } @else {\n <div class=\"geo-map-parcel-popup__diagram-placeholder\" aria-hidden=\"true\">\n <geo-icon type=\"picture\" size=\"lg\" />\n <span>S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t</span>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-parcel-popup-host{display:none}.geo-map-parcel-popup-host--open{display:block}.geo-map-parcel-popup{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden;--geo-parcel-content-indent: 24px}.geo-map-parcel-popup__header{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-parcel-popup__title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__back,.geo-map-parcel-popup__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;min-height:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:36px;min-width:36px;min-height:36px;padding:0}.geo-map-parcel-popup__back:hover:not(:disabled),.geo-map-parcel-popup__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:active:not(:disabled),.geo-map-parcel-popup__close:active:not(:disabled){transform:scale(.98)}.geo-map-parcel-popup__back:disabled,.geo-map-parcel-popup__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-parcel-popup__back--active,.geo-map-parcel-popup__back--checked,.geo-map-parcel-popup__close--active,.geo-map-parcel-popup__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back--icon-only,.geo-map-parcel-popup__close--icon-only{width:32px;padding:0}.geo-map-parcel-popup__back{border-radius:var(--geo-radius);background:var(--geo-color-primary-surface-light);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:hover:not(:disabled){background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__close{color:var(--geo-color-neutral-500)}.geo-map-parcel-popup__body{display:flex;flex-direction:column;gap:16px;padding:14px 16px 18px;overflow:auto}.geo-map-parcel-popup__section{display:flex;flex-direction:column;gap:8px}.geo-map-parcel-popup__section-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.geo-map-parcel-popup__section-title{display:inline-flex;align-items:center;gap:8px;margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.3}.geo-map-parcel-popup__section-title geo-icon,.geo-map-parcel-popup__section-title .geo-icon-host{flex-shrink:0;width:16px;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__link:hover{text-decoration:underline}.geo-map-parcel-popup__link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-parcel-popup__rows{margin:0;padding-left:var(--geo-parcel-content-indent);display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:8px;row-gap:6px}.geo-map-parcel-popup__row{display:contents}.geo-map-parcel-popup__row dt{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-regular, 400);color:var(--geo-color-neutral-600)}.geo-map-parcel-popup__row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);word-break:break-word}.geo-map-parcel-popup__value{margin:0;padding-left:var(--geo-parcel-content-indent);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);line-height:1.45}.geo-map-parcel-popup__diagram{margin-left:var(--geo-parcel-content-indent);overflow:hidden;border-radius:var(--geo-radius);border:1px solid var(--geo-color-border-default);background:var(--geo-color-neutral-50)}.geo-map-parcel-popup__diagram-img{display:block;width:100%;height:auto;max-height:160px;object-fit:cover}.geo-map-parcel-popup__diagram-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:120px;padding:16px;color:var(--geo-color-neutral-400);font-size:var(--geo-font-size-caption);background:linear-gradient(135deg,color-mix(in srgb,var(--geo-color-primary-soft) 80%,transparent) 0%,transparent 45%),repeating-linear-gradient(-12deg,transparent,transparent 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 11px)}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7379
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapParcelPopupComponent, isStandalone: true, selector: "geo-map-parcel-popup", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, parcel: { classPropertyName: "parcel", publicName: "parcel", isSignal: true, isRequired: false, transformFunction: null }, audience: { classPropertyName: "audience", publicName: "audience", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", closed: "closed", back: "back", exportClick: "exportClick", diagramClick: "diagramClick" }, host: { properties: { "class.geo-map-parcel-popup-host--open": "open()" }, classAttribute: "geo-map-parcel-popup-host" }, ngImport: i0, template: "@if (open() && parcel(); as data) {\n <aside class=\"geo-map-parcel-popup\" role=\"dialog\" aria-label=\"Th\u00F4ng tin th\u1EEDa \u0111\u1EA5t\">\n <header class=\"geo-map-parcel-popup__header\">\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__back\"\n aria-label=\"Quay l\u1EA1i\"\n (click)=\"onBack()\"\n >\n <geo-icon type=\"arrow-left\" size=\"sm\" />\n </button>\n <h3 class=\"geo-map-parcel-popup__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__close\"\n aria-label=\"\u0110\u00F3ng chi ti\u1EBFt\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-parcel-popup__body\">\n @for (section of sections(); track section.id) {\n <section class=\"geo-map-parcel-popup__section\">\n <div class=\"geo-map-parcel-popup__section-head\">\n <h4 class=\"geo-map-parcel-popup__section-title\">\n <geo-icon [type]=\"section.icon\" size=\"sm\" />\n <span>{{ section.title }}</span>\n </h4>\n @if (section.diagram) {\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__link\"\n (click)=\"onDiagramDetail()\"\n >\n Chi ti\u1EBFt\n </button>\n }\n </div>\n\n @if (section.rows?.length) {\n <dl class=\"geo-map-parcel-popup__rows\">\n @for (row of section.rows; track row.label) {\n <div class=\"geo-map-parcel-popup__row\">\n <dt>{{ row.label }}:</dt>\n <dd>{{ row.value }}</dd>\n </div>\n }\n </dl>\n } @else if (section.value) {\n <p class=\"geo-map-parcel-popup__value\">{{ section.value }}</p>\n }\n\n @if (section.diagram) {\n <div class=\"geo-map-parcel-popup__diagram\">\n @if (data.diagramUrl) {\n <img\n class=\"geo-map-parcel-popup__diagram-img\"\n [src]=\"data.diagramUrl\"\n alt=\"S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t\"\n />\n } @else {\n <div class=\"geo-map-parcel-popup__diagram-placeholder\" aria-hidden=\"true\">\n <geo-icon type=\"picture\" size=\"lg\" />\n <span>S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t</span>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-parcel-popup-host{display:none}.geo-map-parcel-popup-host--open{display:block}.geo-map-parcel-popup{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden;--geo-parcel-content-indent: 24px}.geo-map-parcel-popup__header{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-parcel-popup__title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__back,.geo-map-parcel-popup__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:36px;min-width:36px;min-height:36px;padding:0}.geo-map-parcel-popup__back:hover:not(:disabled),.geo-map-parcel-popup__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:active:not(:disabled),.geo-map-parcel-popup__close:active:not(:disabled){transform:scale(.98)}.geo-map-parcel-popup__back:disabled,.geo-map-parcel-popup__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-parcel-popup__back--active,.geo-map-parcel-popup__back--checked,.geo-map-parcel-popup__close--active,.geo-map-parcel-popup__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back--icon-only,.geo-map-parcel-popup__close--icon-only{width:40px;padding:0}.geo-map-parcel-popup__back{border-radius:var(--geo-radius);background:var(--geo-color-primary-surface-light);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:hover:not(:disabled){background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__close{color:var(--geo-color-neutral-500)}.geo-map-parcel-popup__body{display:flex;flex-direction:column;gap:16px;padding:14px 16px 18px;overflow:auto}.geo-map-parcel-popup__section{display:flex;flex-direction:column;gap:8px}.geo-map-parcel-popup__section-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.geo-map-parcel-popup__section-title{display:inline-flex;align-items:center;gap:8px;margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.3}.geo-map-parcel-popup__section-title geo-icon,.geo-map-parcel-popup__section-title .geo-icon-host{flex-shrink:0;width:16px;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__link:hover{text-decoration:underline}.geo-map-parcel-popup__link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-parcel-popup__rows{margin:0;padding-left:var(--geo-parcel-content-indent);display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:8px;row-gap:6px}.geo-map-parcel-popup__row{display:contents}.geo-map-parcel-popup__row dt{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-regular, 400);color:var(--geo-color-neutral-600)}.geo-map-parcel-popup__row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);word-break:break-word}.geo-map-parcel-popup__value{margin:0;padding-left:var(--geo-parcel-content-indent);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);line-height:1.45}.geo-map-parcel-popup__diagram{margin-left:var(--geo-parcel-content-indent);overflow:hidden;border-radius:var(--geo-radius);border:1px solid var(--geo-color-border-default);background:var(--geo-color-neutral-50)}.geo-map-parcel-popup__diagram-img{display:block;width:100%;height:auto;max-height:160px;object-fit:cover}.geo-map-parcel-popup__diagram-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:120px;padding:16px;color:var(--geo-color-neutral-400);font-size:var(--geo-font-size-caption);background:linear-gradient(135deg,color-mix(in srgb,var(--geo-color-primary-soft) 80%,transparent) 0%,transparent 45%),repeating-linear-gradient(-12deg,transparent,transparent 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 11px)}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7250
7380
  }
7251
7381
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapParcelPopupComponent, decorators: [{
7252
7382
  type: Component,
7253
7383
  args: [{ selector: 'geo-map-parcel-popup', standalone: true, imports: [GeoIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
7254
7384
  class: 'geo-map-parcel-popup-host',
7255
7385
  '[class.geo-map-parcel-popup-host--open]': 'open()',
7256
- }, template: "@if (open() && parcel(); as data) {\n <aside class=\"geo-map-parcel-popup\" role=\"dialog\" aria-label=\"Th\u00F4ng tin th\u1EEDa \u0111\u1EA5t\">\n <header class=\"geo-map-parcel-popup__header\">\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__back\"\n aria-label=\"Quay l\u1EA1i\"\n (click)=\"onBack()\"\n >\n <geo-icon type=\"arrow-left\" size=\"sm\" />\n </button>\n <h3 class=\"geo-map-parcel-popup__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__close\"\n aria-label=\"\u0110\u00F3ng chi ti\u1EBFt\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-parcel-popup__body\">\n @for (section of sections(); track section.id) {\n <section class=\"geo-map-parcel-popup__section\">\n <div class=\"geo-map-parcel-popup__section-head\">\n <h4 class=\"geo-map-parcel-popup__section-title\">\n <geo-icon [type]=\"section.icon\" size=\"sm\" />\n <span>{{ section.title }}</span>\n </h4>\n @if (section.diagram) {\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__link\"\n (click)=\"onDiagramDetail()\"\n >\n Chi ti\u1EBFt\n </button>\n }\n </div>\n\n @if (section.rows?.length) {\n <dl class=\"geo-map-parcel-popup__rows\">\n @for (row of section.rows; track row.label) {\n <div class=\"geo-map-parcel-popup__row\">\n <dt>{{ row.label }}:</dt>\n <dd>{{ row.value }}</dd>\n </div>\n }\n </dl>\n } @else if (section.value) {\n <p class=\"geo-map-parcel-popup__value\">{{ section.value }}</p>\n }\n\n @if (section.diagram) {\n <div class=\"geo-map-parcel-popup__diagram\">\n @if (data.diagramUrl) {\n <img\n class=\"geo-map-parcel-popup__diagram-img\"\n [src]=\"data.diagramUrl\"\n alt=\"S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t\"\n />\n } @else {\n <div class=\"geo-map-parcel-popup__diagram-placeholder\" aria-hidden=\"true\">\n <geo-icon type=\"picture\" size=\"lg\" />\n <span>S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t</span>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-parcel-popup-host{display:none}.geo-map-parcel-popup-host--open{display:block}.geo-map-parcel-popup{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden;--geo-parcel-content-indent: 24px}.geo-map-parcel-popup__header{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-parcel-popup__title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__back,.geo-map-parcel-popup__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;min-height:32px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:36px;min-width:36px;min-height:36px;padding:0}.geo-map-parcel-popup__back:hover:not(:disabled),.geo-map-parcel-popup__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:active:not(:disabled),.geo-map-parcel-popup__close:active:not(:disabled){transform:scale(.98)}.geo-map-parcel-popup__back:disabled,.geo-map-parcel-popup__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-parcel-popup__back--active,.geo-map-parcel-popup__back--checked,.geo-map-parcel-popup__close--active,.geo-map-parcel-popup__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back--icon-only,.geo-map-parcel-popup__close--icon-only{width:32px;padding:0}.geo-map-parcel-popup__back{border-radius:var(--geo-radius);background:var(--geo-color-primary-surface-light);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:hover:not(:disabled){background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__close{color:var(--geo-color-neutral-500)}.geo-map-parcel-popup__body{display:flex;flex-direction:column;gap:16px;padding:14px 16px 18px;overflow:auto}.geo-map-parcel-popup__section{display:flex;flex-direction:column;gap:8px}.geo-map-parcel-popup__section-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.geo-map-parcel-popup__section-title{display:inline-flex;align-items:center;gap:8px;margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.3}.geo-map-parcel-popup__section-title geo-icon,.geo-map-parcel-popup__section-title .geo-icon-host{flex-shrink:0;width:16px;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__link:hover{text-decoration:underline}.geo-map-parcel-popup__link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-parcel-popup__rows{margin:0;padding-left:var(--geo-parcel-content-indent);display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:8px;row-gap:6px}.geo-map-parcel-popup__row{display:contents}.geo-map-parcel-popup__row dt{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-regular, 400);color:var(--geo-color-neutral-600)}.geo-map-parcel-popup__row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);word-break:break-word}.geo-map-parcel-popup__value{margin:0;padding-left:var(--geo-parcel-content-indent);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);line-height:1.45}.geo-map-parcel-popup__diagram{margin-left:var(--geo-parcel-content-indent);overflow:hidden;border-radius:var(--geo-radius);border:1px solid var(--geo-color-border-default);background:var(--geo-color-neutral-50)}.geo-map-parcel-popup__diagram-img{display:block;width:100%;height:auto;max-height:160px;object-fit:cover}.geo-map-parcel-popup__diagram-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:120px;padding:16px;color:var(--geo-color-neutral-400);font-size:var(--geo-font-size-caption);background:linear-gradient(135deg,color-mix(in srgb,var(--geo-color-primary-soft) 80%,transparent) 0%,transparent 45%),repeating-linear-gradient(-12deg,transparent,transparent 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 11px)}\n"] }]
7386
+ }, template: "@if (open() && parcel(); as data) {\n <aside class=\"geo-map-parcel-popup\" role=\"dialog\" aria-label=\"Th\u00F4ng tin th\u1EEDa \u0111\u1EA5t\">\n <header class=\"geo-map-parcel-popup__header\">\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__back\"\n aria-label=\"Quay l\u1EA1i\"\n (click)=\"onBack()\"\n >\n <geo-icon type=\"arrow-left\" size=\"sm\" />\n </button>\n <h3 class=\"geo-map-parcel-popup__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__close\"\n aria-label=\"\u0110\u00F3ng chi ti\u1EBFt\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-parcel-popup__body\">\n @for (section of sections(); track section.id) {\n <section class=\"geo-map-parcel-popup__section\">\n <div class=\"geo-map-parcel-popup__section-head\">\n <h4 class=\"geo-map-parcel-popup__section-title\">\n <geo-icon [type]=\"section.icon\" size=\"sm\" />\n <span>{{ section.title }}</span>\n </h4>\n @if (section.diagram) {\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__link\"\n (click)=\"onDiagramDetail()\"\n >\n Chi ti\u1EBFt\n </button>\n }\n </div>\n\n @if (section.rows?.length) {\n <dl class=\"geo-map-parcel-popup__rows\">\n @for (row of section.rows; track row.label) {\n <div class=\"geo-map-parcel-popup__row\">\n <dt>{{ row.label }}:</dt>\n <dd>{{ row.value }}</dd>\n </div>\n }\n </dl>\n } @else if (section.value) {\n <p class=\"geo-map-parcel-popup__value\">{{ section.value }}</p>\n }\n\n @if (section.diagram) {\n <div class=\"geo-map-parcel-popup__diagram\">\n @if (data.diagramUrl) {\n <img\n class=\"geo-map-parcel-popup__diagram-img\"\n [src]=\"data.diagramUrl\"\n alt=\"S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t\"\n />\n } @else {\n <div class=\"geo-map-parcel-popup__diagram-placeholder\" aria-hidden=\"true\">\n <geo-icon type=\"picture\" size=\"lg\" />\n <span>S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t</span>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-parcel-popup-host{display:none}.geo-map-parcel-popup-host--open{display:block}.geo-map-parcel-popup{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden;--geo-parcel-content-indent: 24px}.geo-map-parcel-popup__header{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-parcel-popup__title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__back,.geo-map-parcel-popup__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:36px;min-width:36px;min-height:36px;padding:0}.geo-map-parcel-popup__back:hover:not(:disabled),.geo-map-parcel-popup__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:active:not(:disabled),.geo-map-parcel-popup__close:active:not(:disabled){transform:scale(.98)}.geo-map-parcel-popup__back:disabled,.geo-map-parcel-popup__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-parcel-popup__back--active,.geo-map-parcel-popup__back--checked,.geo-map-parcel-popup__close--active,.geo-map-parcel-popup__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back--icon-only,.geo-map-parcel-popup__close--icon-only{width:40px;padding:0}.geo-map-parcel-popup__back{border-radius:var(--geo-radius);background:var(--geo-color-primary-surface-light);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:hover:not(:disabled){background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__close{color:var(--geo-color-neutral-500)}.geo-map-parcel-popup__body{display:flex;flex-direction:column;gap:16px;padding:14px 16px 18px;overflow:auto}.geo-map-parcel-popup__section{display:flex;flex-direction:column;gap:8px}.geo-map-parcel-popup__section-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.geo-map-parcel-popup__section-title{display:inline-flex;align-items:center;gap:8px;margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.3}.geo-map-parcel-popup__section-title geo-icon,.geo-map-parcel-popup__section-title .geo-icon-host{flex-shrink:0;width:16px;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__link:hover{text-decoration:underline}.geo-map-parcel-popup__link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-parcel-popup__rows{margin:0;padding-left:var(--geo-parcel-content-indent);display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:8px;row-gap:6px}.geo-map-parcel-popup__row{display:contents}.geo-map-parcel-popup__row dt{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-regular, 400);color:var(--geo-color-neutral-600)}.geo-map-parcel-popup__row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);word-break:break-word}.geo-map-parcel-popup__value{margin:0;padding-left:var(--geo-parcel-content-indent);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);line-height:1.45}.geo-map-parcel-popup__diagram{margin-left:var(--geo-parcel-content-indent);overflow:hidden;border-radius:var(--geo-radius);border:1px solid var(--geo-color-border-default);background:var(--geo-color-neutral-50)}.geo-map-parcel-popup__diagram-img{display:block;width:100%;height:auto;max-height:160px;object-fit:cover}.geo-map-parcel-popup__diagram-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:120px;padding:16px;color:var(--geo-color-neutral-400);font-size:var(--geo-font-size-caption);background:linear-gradient(135deg,color-mix(in srgb,var(--geo-color-primary-soft) 80%,transparent) 0%,transparent 45%),repeating-linear-gradient(-12deg,transparent,transparent 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 11px)}\n"] }]
7257
7387
  }] });
7258
7388
 
7259
7389
  const MODE_TILES = [
@@ -7414,7 +7544,7 @@ class GeoMapSearchComponent {
7414
7544
  this.closed.emit();
7415
7545
  }
7416
7546
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7417
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapSearchComponent, isStandalone: true, selector: "geo-map-search", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, results: { classPropertyName: "results", publicName: "results", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", mode: "modeChange", pageIndex: "pageIndexChange", pageSize: "pageSizeChange", search: "search", reset: "reset", resultSelect: "resultSelect", closed: "closed" }, host: { properties: { "class.geo-map-search-host--open": "open()" }, classAttribute: "geo-map-search-host" }, ngImport: i0, template: "@if (open()) {\n <section class=\"geo-map-search\" aria-label=\"Tra c\u1EE9u th\u00F4ng tin quy ho\u1EA1ch\">\n <header class=\"geo-map-search__header\">\n <h3 class=\"geo-map-search__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn\"\n aria-label=\"\u0110\u00F3ng tra c\u1EE9u\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-search__body\">\n <div class=\"geo-map-search__modes\" role=\"listbox\" aria-label=\"H\u00ECnh th\u1EE9c tra c\u1EE9u\">\n @for (tile of modeTiles; track tile.id) {\n <button\n type=\"button\"\n class=\"geo-map-search__mode\"\n role=\"option\"\n [class.geo-map-search__mode--active]=\"formOpen() && mode() === tile.id\"\n [attr.aria-selected]=\"formOpen() && mode() === tile.id\"\n (click)=\"selectMode(tile.id)\"\n >\n <span class=\"geo-map-search__mode-icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"tile.icon\" size=\"md\" />\n </span>\n <span class=\"geo-map-search__mode-label\">{{ tile.label }}</span>\n </button>\n }\n </div>\n\n @if (formOpen()) {\n <section class=\"geo-map-search__form\" [attr.aria-label]=\"modeHeading()\">\n <div class=\"geo-map-search__form-head\">\n <h4 class=\"geo-map-search__form-title\">{{ modeHeading() }}</h4>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn geo-map-search__icon-btn--sm\"\n aria-label=\"Thu g\u1ECDn form t\u00ECm ki\u1EBFm\"\n (click)=\"collapseForm()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </div>\n\n <div\n class=\"geo-map-search__fields\"\n [class.geo-map-search__fields--inline]=\"fieldsInline()\"\n >\n @for (field of fields(); track field.key) {\n <geo-input\n [label]=\"field.label\"\n [placeholder]=\"field.placeholder\"\n [type]=\"field.type ?? 'text'\"\n [ngModel]=\"fieldValue(field.key)\"\n (ngModelChange)=\"setField(field.key, $event)\"\n (enterPressed)=\"submit()\"\n [allowClear]=\"true\"\n [block]=\"true\"\n />\n }\n </div>\n\n <div class=\"geo-map-search__actions\">\n <geo-button\n appearance=\"primary\"\n icon=\"search\"\n [disabled]=\"loading()\"\n (clicked)=\"submit()\"\n >\n T\u00ECm ki\u1EBFm\n </geo-button>\n <geo-button\n appearance=\"secondary\"\n icon=\"reload\"\n (clicked)=\"onReset()\"\n >\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n </div>\n </section>\n }\n\n @if (formOpen() && (loading() || hasSearched())) {\n <div class=\"geo-map-search__results\" aria-live=\"polite\">\n @if (loading()) {\n <p class=\"geo-map-search__hint\">\u0110ang t\u00ECm ki\u1EBFm\u2026</p>\n } @else if (!results().length) {\n <p class=\"geo-map-search__hint\">{{ emptyText() }}</p>\n } @else {\n <ul class=\"geo-map-search__list\">\n @for (item of results(); track item.id) {\n <li class=\"geo-map-search__result\">\n <div class=\"geo-map-search__result-head\">\n <span class=\"geo-map-search__result-map\">{{ mapLabel(item) }}</span>\n <button\n type=\"button\"\n class=\"geo-map-search__detail-link\"\n (click)=\"selectResult(item)\"\n >\n Chi ti\u1EBFt\n </button>\n </div>\n @if (item.parcel; as parcel) {\n <dl class=\"geo-map-search__result-meta\">\n @if (parcel.ward) {\n <div class=\"geo-map-search__result-row\">\n <dt>X\u00E3:</dt>\n <dd>{{ parcel.ward }}</dd>\n </div>\n }\n @if (parcel.province) {\n <div class=\"geo-map-search__result-row\">\n <dt>T\u1EC9nh:</dt>\n <dd>{{ parcel.province }}</dd>\n </div>\n }\n @if (parcel.area) {\n <div class=\"geo-map-search__result-row\">\n <dt>Di\u1EC7n t\u00EDch:</dt>\n <dd>{{ parcel.area }}</dd>\n </div>\n }\n </dl>\n } @else if (item.subtitle) {\n <p class=\"geo-map-search__result-sub\">{{ item.subtitle }}</p>\n }\n </li>\n }\n </ul>\n\n @if (resolvedTotal() > pageSize()) {\n <geo-pagination\n class=\"geo-map-search__paging\"\n [(pageIndex)]=\"pageIndex\"\n [(pageSize)]=\"pageSize\"\n [total]=\"resolvedTotal()\"\n size=\"small\"\n [simple]=\"true\"\n />\n }\n }\n </div>\n }\n </div>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-search-host{display:none}.geo-map-search-host--open{display:block}.geo-map-search{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(420px,100vw - 32px);max-height:min(640px,82vh);overflow:hidden;display:flex;flex-direction:column}.geo-map-search__header{position:relative;display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 40px 12px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-search__title{margin:0;max-width:100%;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;line-height:1.35;color:var(--geo-color-neutral-900)}.geo-map-search__header .geo-map-search__icon-btn{position:absolute;top:8px;right:8px}.geo-map-search__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-search__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-search__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-search__icon-btn--active,.geo-map-search__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn--icon-only{width:32px;padding:0}.geo-map-search__icon-btn--sm{width:28px;min-width:28px;min-height:28px}.geo-map-search__body{display:flex;flex-direction:column;gap:14px;padding:14px 16px 16px;overflow:auto}.geo-map-search__modes{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 12px}.geo-map-search__mode{display:inline-flex;flex-direction:column;align-items:center;gap:6px;width:104px;padding:0;border:0;background:transparent;cursor:pointer;color:var(--geo-color-primary-default);font:inherit}.geo-map-search__mode:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:var(--geo-radius)}.geo-map-search__mode-icon{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;border:1.5px solid var(--geo-color-primary-default);background:var(--geo-color-primary-soft, var(--geo-color-primary-surface-light));color:var(--geo-color-primary-default);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-search__mode:hover .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-hover)}.geo-map-search__mode--active .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-active);box-shadow:inset 0 0 0 1px var(--geo-color-primary-default)}.geo-map-search__mode-label{text-align:center;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.3;color:var(--geo-color-primary-default)}.geo-map-search__form{display:flex;flex-direction:column;gap:12px;padding-top:4px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-search__form-head{position:relative;display:flex;align-items:center;justify-content:center;min-height:28px;padding:0 28px}.geo-map-search__form-title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);letter-spacing:.03em;color:var(--geo-color-neutral-900)}.geo-map-search__form-head .geo-map-search__icon-btn{position:absolute;top:50%;right:0;transform:translateY(-50%)}.geo-map-search__fields{display:flex;flex-direction:column;gap:10px}.geo-map-search__fields--inline,.geo-map-search__actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.geo-map-search__actions>geo-button{display:block;min-width:0}.geo-map-search__actions .geo-button{width:100%}.geo-map-search__results{display:flex;flex-direction:column;gap:10px;padding-top:4px;border-top:1px solid var(--geo-color-primary-default)}.geo-map-search__hint{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px}.geo-map-search__result{display:flex;flex-direction:column;gap:8px;padding:0}.geo-map-search__result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.geo-map-search__result-map{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.4}.geo-map-search__detail-link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default);text-decoration:none}.geo-map-search__detail-link:hover{text-decoration:underline}.geo-map-search__detail-link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-search__result-meta{margin:0;display:flex;flex-direction:column;gap:4px}.geo-map-search__result-row{display:grid;grid-template-columns:88px 1fr;gap:8px;align-items:baseline}.geo-map-search__result-row dt{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__result-row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-search__result-sub{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__paging{display:flex;justify-content:center;margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoInputComponent, selector: "geo-input", inputs: ["label", "placeholder", "type", "disabled", "readonly", "required", "error", "errorMessage", "maxlength", "prefixIcon", "suffixIcon", "allowClear", "block", "width"], outputs: ["valueChange", "enterPressed"] }, { kind: "component", type: GeoPaginationComponent, selector: "geo-pagination", inputs: ["pageIndex", "pageSize", "total", "size", "simple", "hideOnSinglePage", "showSizeChanger", "pageSizeOptions"], outputs: ["pageIndexChange", "pageSizeChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7547
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapSearchComponent, isStandalone: true, selector: "geo-map-search", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, results: { classPropertyName: "results", publicName: "results", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", mode: "modeChange", pageIndex: "pageIndexChange", pageSize: "pageSizeChange", search: "search", reset: "reset", resultSelect: "resultSelect", closed: "closed" }, host: { properties: { "class.geo-map-search-host--open": "open()" }, classAttribute: "geo-map-search-host" }, ngImport: i0, template: "@if (open()) {\n <section class=\"geo-map-search\" aria-label=\"Tra c\u1EE9u th\u00F4ng tin quy ho\u1EA1ch\">\n <header class=\"geo-map-search__header\">\n <h3 class=\"geo-map-search__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn\"\n aria-label=\"\u0110\u00F3ng tra c\u1EE9u\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-search__body\">\n <div class=\"geo-map-search__modes\" role=\"listbox\" aria-label=\"H\u00ECnh th\u1EE9c tra c\u1EE9u\">\n @for (tile of modeTiles; track tile.id) {\n <button\n type=\"button\"\n class=\"geo-map-search__mode\"\n role=\"option\"\n [class.geo-map-search__mode--active]=\"formOpen() && mode() === tile.id\"\n [attr.aria-selected]=\"formOpen() && mode() === tile.id\"\n (click)=\"selectMode(tile.id)\"\n >\n <span class=\"geo-map-search__mode-icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"tile.icon\" size=\"md\" />\n </span>\n <span class=\"geo-map-search__mode-label\">{{ tile.label }}</span>\n </button>\n }\n </div>\n\n @if (formOpen()) {\n <section class=\"geo-map-search__form\" [attr.aria-label]=\"modeHeading()\">\n <div class=\"geo-map-search__form-head\">\n <h4 class=\"geo-map-search__form-title\">{{ modeHeading() }}</h4>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn geo-map-search__icon-btn--sm\"\n aria-label=\"Thu g\u1ECDn form t\u00ECm ki\u1EBFm\"\n (click)=\"collapseForm()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </div>\n\n <div\n class=\"geo-map-search__fields\"\n [class.geo-map-search__fields--inline]=\"fieldsInline()\"\n >\n @for (field of fields(); track field.key) {\n <geo-input\n [label]=\"field.label\"\n [placeholder]=\"field.placeholder\"\n [type]=\"field.type ?? 'text'\"\n [ngModel]=\"fieldValue(field.key)\"\n (ngModelChange)=\"setField(field.key, $event)\"\n (enterPressed)=\"submit()\"\n [allowClear]=\"true\"\n [block]=\"true\"\n />\n }\n </div>\n\n <div class=\"geo-map-search__actions\">\n <geo-button\n appearance=\"primary\"\n icon=\"search\"\n [disabled]=\"loading()\"\n (clicked)=\"submit()\"\n >\n T\u00ECm ki\u1EBFm\n </geo-button>\n <geo-button\n appearance=\"secondary\"\n icon=\"reload\"\n (clicked)=\"onReset()\"\n >\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n </div>\n </section>\n }\n\n @if (formOpen() && (loading() || hasSearched())) {\n <div class=\"geo-map-search__results\" aria-live=\"polite\">\n @if (loading()) {\n <p class=\"geo-map-search__hint\">\u0110ang t\u00ECm ki\u1EBFm\u2026</p>\n } @else if (!results().length) {\n <p class=\"geo-map-search__hint\">{{ emptyText() }}</p>\n } @else {\n <ul class=\"geo-map-search__list\">\n @for (item of results(); track item.id) {\n <li class=\"geo-map-search__result\">\n <div class=\"geo-map-search__result-head\">\n <span class=\"geo-map-search__result-map\">{{ mapLabel(item) }}</span>\n <button\n type=\"button\"\n class=\"geo-map-search__detail-link\"\n (click)=\"selectResult(item)\"\n >\n Chi ti\u1EBFt\n </button>\n </div>\n @if (item.parcel; as parcel) {\n <dl class=\"geo-map-search__result-meta\">\n @if (parcel.ward) {\n <div class=\"geo-map-search__result-row\">\n <dt>X\u00E3:</dt>\n <dd>{{ parcel.ward }}</dd>\n </div>\n }\n @if (parcel.province) {\n <div class=\"geo-map-search__result-row\">\n <dt>T\u1EC9nh:</dt>\n <dd>{{ parcel.province }}</dd>\n </div>\n }\n @if (parcel.area) {\n <div class=\"geo-map-search__result-row\">\n <dt>Di\u1EC7n t\u00EDch:</dt>\n <dd>{{ parcel.area }}</dd>\n </div>\n }\n </dl>\n } @else if (item.subtitle) {\n <p class=\"geo-map-search__result-sub\">{{ item.subtitle }}</p>\n }\n </li>\n }\n </ul>\n\n @if (resolvedTotal() > pageSize()) {\n <geo-pagination\n class=\"geo-map-search__paging\"\n [(pageIndex)]=\"pageIndex\"\n [(pageSize)]=\"pageSize\"\n [total]=\"resolvedTotal()\"\n size=\"small\"\n [simple]=\"true\"\n />\n }\n }\n </div>\n }\n </div>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-search-host{display:none}.geo-map-search-host--open{display:block}.geo-map-search{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(420px,100vw - 32px);max-height:min(640px,82vh);overflow:hidden;display:flex;flex-direction:column}.geo-map-search__header{position:relative;display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 40px 12px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-search__title{margin:0;max-width:100%;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;line-height:1.35;color:var(--geo-color-neutral-900)}.geo-map-search__header .geo-map-search__icon-btn{position:absolute;top:8px;right:8px}.geo-map-search__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-search__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-search__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-search__icon-btn--active,.geo-map-search__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn--icon-only{width:40px;padding:0}.geo-map-search__icon-btn--sm{width:28px;min-width:28px;min-height:28px}.geo-map-search__body{display:flex;flex-direction:column;gap:14px;padding:14px 16px 16px;overflow:auto}.geo-map-search__modes{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 12px}.geo-map-search__mode{display:inline-flex;flex-direction:column;align-items:center;gap:6px;width:104px;padding:0;border:0;background:transparent;cursor:pointer;color:var(--geo-color-primary-default);font:inherit}.geo-map-search__mode:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:var(--geo-radius)}.geo-map-search__mode-icon{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;border:1.5px solid var(--geo-color-primary-default);background:var(--geo-color-primary-soft, var(--geo-color-primary-surface-light));color:var(--geo-color-primary-default);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-search__mode:hover .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-hover)}.geo-map-search__mode--active .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-active);box-shadow:inset 0 0 0 1px var(--geo-color-primary-default)}.geo-map-search__mode-label{text-align:center;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.3;color:var(--geo-color-primary-default)}.geo-map-search__form{display:flex;flex-direction:column;gap:12px;padding-top:4px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-search__form-head{position:relative;display:flex;align-items:center;justify-content:center;min-height:28px;padding:0 28px}.geo-map-search__form-title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);letter-spacing:.03em;color:var(--geo-color-neutral-900)}.geo-map-search__form-head .geo-map-search__icon-btn{position:absolute;top:50%;right:0;transform:translateY(-50%)}.geo-map-search__fields{display:flex;flex-direction:column;gap:10px}.geo-map-search__fields--inline,.geo-map-search__actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.geo-map-search__actions>geo-button{display:block;min-width:0}.geo-map-search__actions .geo-button{width:100%}.geo-map-search__results{display:flex;flex-direction:column;gap:10px;padding-top:4px;border-top:1px solid var(--geo-color-primary-default)}.geo-map-search__hint{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px}.geo-map-search__result{display:flex;flex-direction:column;gap:8px;padding:0}.geo-map-search__result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.geo-map-search__result-map{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.4}.geo-map-search__detail-link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default);text-decoration:none}.geo-map-search__detail-link:hover{text-decoration:underline}.geo-map-search__detail-link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-search__result-meta{margin:0;display:flex;flex-direction:column;gap:4px}.geo-map-search__result-row{display:grid;grid-template-columns:88px 1fr;gap:8px;align-items:baseline}.geo-map-search__result-row dt{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__result-row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-search__result-sub{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__paging{display:flex;justify-content:center;margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoInputComponent, selector: "geo-input", inputs: ["label", "placeholder", "type", "disabled", "readonly", "required", "error", "errorMessage", "maxlength", "prefixIcon", "suffixIcon", "allowClear", "block", "width"], outputs: ["valueChange", "enterPressed"] }, { kind: "component", type: GeoPaginationComponent, selector: "geo-pagination", inputs: ["pageIndex", "pageSize", "total", "size", "simple", "hideOnSinglePage", "showSizeChanger", "pageSizeOptions"], outputs: ["pageIndexChange", "pageSizeChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7418
7548
  }
7419
7549
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSearchComponent, decorators: [{
7420
7550
  type: Component,
@@ -7427,7 +7557,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
7427
7557
  ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
7428
7558
  class: 'geo-map-search-host',
7429
7559
  '[class.geo-map-search-host--open]': 'open()',
7430
- }, template: "@if (open()) {\n <section class=\"geo-map-search\" aria-label=\"Tra c\u1EE9u th\u00F4ng tin quy ho\u1EA1ch\">\n <header class=\"geo-map-search__header\">\n <h3 class=\"geo-map-search__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn\"\n aria-label=\"\u0110\u00F3ng tra c\u1EE9u\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-search__body\">\n <div class=\"geo-map-search__modes\" role=\"listbox\" aria-label=\"H\u00ECnh th\u1EE9c tra c\u1EE9u\">\n @for (tile of modeTiles; track tile.id) {\n <button\n type=\"button\"\n class=\"geo-map-search__mode\"\n role=\"option\"\n [class.geo-map-search__mode--active]=\"formOpen() && mode() === tile.id\"\n [attr.aria-selected]=\"formOpen() && mode() === tile.id\"\n (click)=\"selectMode(tile.id)\"\n >\n <span class=\"geo-map-search__mode-icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"tile.icon\" size=\"md\" />\n </span>\n <span class=\"geo-map-search__mode-label\">{{ tile.label }}</span>\n </button>\n }\n </div>\n\n @if (formOpen()) {\n <section class=\"geo-map-search__form\" [attr.aria-label]=\"modeHeading()\">\n <div class=\"geo-map-search__form-head\">\n <h4 class=\"geo-map-search__form-title\">{{ modeHeading() }}</h4>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn geo-map-search__icon-btn--sm\"\n aria-label=\"Thu g\u1ECDn form t\u00ECm ki\u1EBFm\"\n (click)=\"collapseForm()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </div>\n\n <div\n class=\"geo-map-search__fields\"\n [class.geo-map-search__fields--inline]=\"fieldsInline()\"\n >\n @for (field of fields(); track field.key) {\n <geo-input\n [label]=\"field.label\"\n [placeholder]=\"field.placeholder\"\n [type]=\"field.type ?? 'text'\"\n [ngModel]=\"fieldValue(field.key)\"\n (ngModelChange)=\"setField(field.key, $event)\"\n (enterPressed)=\"submit()\"\n [allowClear]=\"true\"\n [block]=\"true\"\n />\n }\n </div>\n\n <div class=\"geo-map-search__actions\">\n <geo-button\n appearance=\"primary\"\n icon=\"search\"\n [disabled]=\"loading()\"\n (clicked)=\"submit()\"\n >\n T\u00ECm ki\u1EBFm\n </geo-button>\n <geo-button\n appearance=\"secondary\"\n icon=\"reload\"\n (clicked)=\"onReset()\"\n >\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n </div>\n </section>\n }\n\n @if (formOpen() && (loading() || hasSearched())) {\n <div class=\"geo-map-search__results\" aria-live=\"polite\">\n @if (loading()) {\n <p class=\"geo-map-search__hint\">\u0110ang t\u00ECm ki\u1EBFm\u2026</p>\n } @else if (!results().length) {\n <p class=\"geo-map-search__hint\">{{ emptyText() }}</p>\n } @else {\n <ul class=\"geo-map-search__list\">\n @for (item of results(); track item.id) {\n <li class=\"geo-map-search__result\">\n <div class=\"geo-map-search__result-head\">\n <span class=\"geo-map-search__result-map\">{{ mapLabel(item) }}</span>\n <button\n type=\"button\"\n class=\"geo-map-search__detail-link\"\n (click)=\"selectResult(item)\"\n >\n Chi ti\u1EBFt\n </button>\n </div>\n @if (item.parcel; as parcel) {\n <dl class=\"geo-map-search__result-meta\">\n @if (parcel.ward) {\n <div class=\"geo-map-search__result-row\">\n <dt>X\u00E3:</dt>\n <dd>{{ parcel.ward }}</dd>\n </div>\n }\n @if (parcel.province) {\n <div class=\"geo-map-search__result-row\">\n <dt>T\u1EC9nh:</dt>\n <dd>{{ parcel.province }}</dd>\n </div>\n }\n @if (parcel.area) {\n <div class=\"geo-map-search__result-row\">\n <dt>Di\u1EC7n t\u00EDch:</dt>\n <dd>{{ parcel.area }}</dd>\n </div>\n }\n </dl>\n } @else if (item.subtitle) {\n <p class=\"geo-map-search__result-sub\">{{ item.subtitle }}</p>\n }\n </li>\n }\n </ul>\n\n @if (resolvedTotal() > pageSize()) {\n <geo-pagination\n class=\"geo-map-search__paging\"\n [(pageIndex)]=\"pageIndex\"\n [(pageSize)]=\"pageSize\"\n [total]=\"resolvedTotal()\"\n size=\"small\"\n [simple]=\"true\"\n />\n }\n }\n </div>\n }\n </div>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-search-host{display:none}.geo-map-search-host--open{display:block}.geo-map-search{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(420px,100vw - 32px);max-height:min(640px,82vh);overflow:hidden;display:flex;flex-direction:column}.geo-map-search__header{position:relative;display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 40px 12px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-search__title{margin:0;max-width:100%;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;line-height:1.35;color:var(--geo-color-neutral-900)}.geo-map-search__header .geo-map-search__icon-btn{position:absolute;top:8px;right:8px}.geo-map-search__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-search__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-search__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-search__icon-btn--active,.geo-map-search__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn--icon-only{width:32px;padding:0}.geo-map-search__icon-btn--sm{width:28px;min-width:28px;min-height:28px}.geo-map-search__body{display:flex;flex-direction:column;gap:14px;padding:14px 16px 16px;overflow:auto}.geo-map-search__modes{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 12px}.geo-map-search__mode{display:inline-flex;flex-direction:column;align-items:center;gap:6px;width:104px;padding:0;border:0;background:transparent;cursor:pointer;color:var(--geo-color-primary-default);font:inherit}.geo-map-search__mode:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:var(--geo-radius)}.geo-map-search__mode-icon{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;border:1.5px solid var(--geo-color-primary-default);background:var(--geo-color-primary-soft, var(--geo-color-primary-surface-light));color:var(--geo-color-primary-default);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-search__mode:hover .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-hover)}.geo-map-search__mode--active .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-active);box-shadow:inset 0 0 0 1px var(--geo-color-primary-default)}.geo-map-search__mode-label{text-align:center;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.3;color:var(--geo-color-primary-default)}.geo-map-search__form{display:flex;flex-direction:column;gap:12px;padding-top:4px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-search__form-head{position:relative;display:flex;align-items:center;justify-content:center;min-height:28px;padding:0 28px}.geo-map-search__form-title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);letter-spacing:.03em;color:var(--geo-color-neutral-900)}.geo-map-search__form-head .geo-map-search__icon-btn{position:absolute;top:50%;right:0;transform:translateY(-50%)}.geo-map-search__fields{display:flex;flex-direction:column;gap:10px}.geo-map-search__fields--inline,.geo-map-search__actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.geo-map-search__actions>geo-button{display:block;min-width:0}.geo-map-search__actions .geo-button{width:100%}.geo-map-search__results{display:flex;flex-direction:column;gap:10px;padding-top:4px;border-top:1px solid var(--geo-color-primary-default)}.geo-map-search__hint{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px}.geo-map-search__result{display:flex;flex-direction:column;gap:8px;padding:0}.geo-map-search__result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.geo-map-search__result-map{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.4}.geo-map-search__detail-link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default);text-decoration:none}.geo-map-search__detail-link:hover{text-decoration:underline}.geo-map-search__detail-link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-search__result-meta{margin:0;display:flex;flex-direction:column;gap:4px}.geo-map-search__result-row{display:grid;grid-template-columns:88px 1fr;gap:8px;align-items:baseline}.geo-map-search__result-row dt{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__result-row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-search__result-sub{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__paging{display:flex;justify-content:center;margin-top:2px}\n"] }]
7560
+ }, template: "@if (open()) {\n <section class=\"geo-map-search\" aria-label=\"Tra c\u1EE9u th\u00F4ng tin quy ho\u1EA1ch\">\n <header class=\"geo-map-search__header\">\n <h3 class=\"geo-map-search__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn\"\n aria-label=\"\u0110\u00F3ng tra c\u1EE9u\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-search__body\">\n <div class=\"geo-map-search__modes\" role=\"listbox\" aria-label=\"H\u00ECnh th\u1EE9c tra c\u1EE9u\">\n @for (tile of modeTiles; track tile.id) {\n <button\n type=\"button\"\n class=\"geo-map-search__mode\"\n role=\"option\"\n [class.geo-map-search__mode--active]=\"formOpen() && mode() === tile.id\"\n [attr.aria-selected]=\"formOpen() && mode() === tile.id\"\n (click)=\"selectMode(tile.id)\"\n >\n <span class=\"geo-map-search__mode-icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"tile.icon\" size=\"md\" />\n </span>\n <span class=\"geo-map-search__mode-label\">{{ tile.label }}</span>\n </button>\n }\n </div>\n\n @if (formOpen()) {\n <section class=\"geo-map-search__form\" [attr.aria-label]=\"modeHeading()\">\n <div class=\"geo-map-search__form-head\">\n <h4 class=\"geo-map-search__form-title\">{{ modeHeading() }}</h4>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn geo-map-search__icon-btn--sm\"\n aria-label=\"Thu g\u1ECDn form t\u00ECm ki\u1EBFm\"\n (click)=\"collapseForm()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </div>\n\n <div\n class=\"geo-map-search__fields\"\n [class.geo-map-search__fields--inline]=\"fieldsInline()\"\n >\n @for (field of fields(); track field.key) {\n <geo-input\n [label]=\"field.label\"\n [placeholder]=\"field.placeholder\"\n [type]=\"field.type ?? 'text'\"\n [ngModel]=\"fieldValue(field.key)\"\n (ngModelChange)=\"setField(field.key, $event)\"\n (enterPressed)=\"submit()\"\n [allowClear]=\"true\"\n [block]=\"true\"\n />\n }\n </div>\n\n <div class=\"geo-map-search__actions\">\n <geo-button\n appearance=\"primary\"\n icon=\"search\"\n [disabled]=\"loading()\"\n (clicked)=\"submit()\"\n >\n T\u00ECm ki\u1EBFm\n </geo-button>\n <geo-button\n appearance=\"secondary\"\n icon=\"reload\"\n (clicked)=\"onReset()\"\n >\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n </div>\n </section>\n }\n\n @if (formOpen() && (loading() || hasSearched())) {\n <div class=\"geo-map-search__results\" aria-live=\"polite\">\n @if (loading()) {\n <p class=\"geo-map-search__hint\">\u0110ang t\u00ECm ki\u1EBFm\u2026</p>\n } @else if (!results().length) {\n <p class=\"geo-map-search__hint\">{{ emptyText() }}</p>\n } @else {\n <ul class=\"geo-map-search__list\">\n @for (item of results(); track item.id) {\n <li class=\"geo-map-search__result\">\n <div class=\"geo-map-search__result-head\">\n <span class=\"geo-map-search__result-map\">{{ mapLabel(item) }}</span>\n <button\n type=\"button\"\n class=\"geo-map-search__detail-link\"\n (click)=\"selectResult(item)\"\n >\n Chi ti\u1EBFt\n </button>\n </div>\n @if (item.parcel; as parcel) {\n <dl class=\"geo-map-search__result-meta\">\n @if (parcel.ward) {\n <div class=\"geo-map-search__result-row\">\n <dt>X\u00E3:</dt>\n <dd>{{ parcel.ward }}</dd>\n </div>\n }\n @if (parcel.province) {\n <div class=\"geo-map-search__result-row\">\n <dt>T\u1EC9nh:</dt>\n <dd>{{ parcel.province }}</dd>\n </div>\n }\n @if (parcel.area) {\n <div class=\"geo-map-search__result-row\">\n <dt>Di\u1EC7n t\u00EDch:</dt>\n <dd>{{ parcel.area }}</dd>\n </div>\n }\n </dl>\n } @else if (item.subtitle) {\n <p class=\"geo-map-search__result-sub\">{{ item.subtitle }}</p>\n }\n </li>\n }\n </ul>\n\n @if (resolvedTotal() > pageSize()) {\n <geo-pagination\n class=\"geo-map-search__paging\"\n [(pageIndex)]=\"pageIndex\"\n [(pageSize)]=\"pageSize\"\n [total]=\"resolvedTotal()\"\n size=\"small\"\n [simple]=\"true\"\n />\n }\n }\n </div>\n }\n </div>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-search-host{display:none}.geo-map-search-host--open{display:block}.geo-map-search{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(420px,100vw - 32px);max-height:min(640px,82vh);overflow:hidden;display:flex;flex-direction:column}.geo-map-search__header{position:relative;display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 40px 12px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-search__title{margin:0;max-width:100%;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;line-height:1.35;color:var(--geo-color-neutral-900)}.geo-map-search__header .geo-map-search__icon-btn{position:absolute;top:8px;right:8px}.geo-map-search__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-search__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-search__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-search__icon-btn--active,.geo-map-search__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn--icon-only{width:40px;padding:0}.geo-map-search__icon-btn--sm{width:28px;min-width:28px;min-height:28px}.geo-map-search__body{display:flex;flex-direction:column;gap:14px;padding:14px 16px 16px;overflow:auto}.geo-map-search__modes{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 12px}.geo-map-search__mode{display:inline-flex;flex-direction:column;align-items:center;gap:6px;width:104px;padding:0;border:0;background:transparent;cursor:pointer;color:var(--geo-color-primary-default);font:inherit}.geo-map-search__mode:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:var(--geo-radius)}.geo-map-search__mode-icon{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;border:1.5px solid var(--geo-color-primary-default);background:var(--geo-color-primary-soft, var(--geo-color-primary-surface-light));color:var(--geo-color-primary-default);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-search__mode:hover .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-hover)}.geo-map-search__mode--active .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-active);box-shadow:inset 0 0 0 1px var(--geo-color-primary-default)}.geo-map-search__mode-label{text-align:center;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.3;color:var(--geo-color-primary-default)}.geo-map-search__form{display:flex;flex-direction:column;gap:12px;padding-top:4px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-search__form-head{position:relative;display:flex;align-items:center;justify-content:center;min-height:28px;padding:0 28px}.geo-map-search__form-title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);letter-spacing:.03em;color:var(--geo-color-neutral-900)}.geo-map-search__form-head .geo-map-search__icon-btn{position:absolute;top:50%;right:0;transform:translateY(-50%)}.geo-map-search__fields{display:flex;flex-direction:column;gap:10px}.geo-map-search__fields--inline,.geo-map-search__actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.geo-map-search__actions>geo-button{display:block;min-width:0}.geo-map-search__actions .geo-button{width:100%}.geo-map-search__results{display:flex;flex-direction:column;gap:10px;padding-top:4px;border-top:1px solid var(--geo-color-primary-default)}.geo-map-search__hint{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px}.geo-map-search__result{display:flex;flex-direction:column;gap:8px;padding:0}.geo-map-search__result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.geo-map-search__result-map{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.4}.geo-map-search__detail-link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default);text-decoration:none}.geo-map-search__detail-link:hover{text-decoration:underline}.geo-map-search__detail-link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-search__result-meta{margin:0;display:flex;flex-direction:column;gap:4px}.geo-map-search__result-row{display:grid;grid-template-columns:88px 1fr;gap:8px;align-items:baseline}.geo-map-search__result-row dt{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__result-row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-search__result-sub{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__paging{display:flex;justify-content:center;margin-top:2px}\n"] }]
7431
7561
  }] });
7432
7562
 
7433
7563
  /**
@@ -7441,7 +7571,6 @@ class GeoMapShellComponent {
7441
7571
  destroyRef = inject(DestroyRef);
7442
7572
  snapshotRef = viewChild(GeoMapSnapshotComponent);
7443
7573
  zoomRef = viewChild(GeoMapZoomComponent);
7444
- locateRef = viewChild(GeoMapLocateComponent);
7445
7574
  center = input([...GEO_MAP_DEFAULT_CENTER]);
7446
7575
  zoom = input(GEO_MAP_DEFAULT_ZOOM);
7447
7576
  height = input('560px');
@@ -7451,19 +7580,12 @@ class GeoMapShellComponent {
7451
7580
  /** Extra overlays merged after demo thematic + traffic. */
7452
7581
  layers = input([]);
7453
7582
  legendItems = input(GEO_MAP_DEMO_LEGEND_ITEMS);
7583
+ /** Host app sets true when the legend catalog (loại đất/ký hiệu/màu) failed to load. */
7584
+ legendCatalogMissing = input(false);
7454
7585
  showNav = input(true);
7455
7586
  includeDemoLayers = input(true);
7456
7587
  adminNodes = input(GEO_MAP_DEMO_ADMIN_NODES);
7457
- /** `single` — chọn đúng 1 xã/phường (BR-06-03); `multi` — checkbox nhiều cấp (mặc định). */
7458
- adminSelectionMode = input('multi');
7459
7588
  locationLabel = input('Phường 1 — TP Đà Lạt, Lâm Đồng');
7460
- /**
7461
- * Ghi chú pháp lý hiển thị khi đang đo (BR-10-03). `null` ẩn ghi chú —
7462
- * mặc định giữ nguyên câu chữ đã dùng ở `qh-map-shell`.
7463
- */
7464
- measureDisclaimer = input('Giá trị tham khảo trên bản đồ, không có giá trị pháp lý. Diện tích pháp lý của thửa đất lấy theo hồ sơ địa chính.');
7465
- /** True khi danh mục chú giải không tải được (`ERR_MAP_LEGEND_CATALOG_MISSING`). */
7466
- legendCatalogMissing = input(false);
7467
7589
  parcelAudience = input('citizen');
7468
7590
  provinceExtent = input(GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326);
7469
7591
  /** When true, shell seeds mock search results (Storybook / demos). */
@@ -7499,8 +7621,6 @@ class GeoMapShellComponent {
7499
7621
  resultSelect = output();
7500
7622
  parcelExport = output();
7501
7623
  adminApply = output();
7502
- snapshotCaptured = output();
7503
- snapshotError = output();
7504
7624
  controller = signal(null);
7505
7625
  /** Active map pointer tool (`none` = default arrow cursor). */
7506
7626
  toolMode = signal('none');
@@ -7688,6 +7808,9 @@ class GeoMapShellComponent {
7688
7808
  case 'fit-province':
7689
7809
  this.zoomRef()?.fitProvince();
7690
7810
  break;
7811
+ case 'locate':
7812
+ this.triggerLocate();
7813
+ break;
7691
7814
  case 'pan':
7692
7815
  if (this.toolMode() === 'pan') {
7693
7816
  this.exitToolMode();
@@ -7767,9 +7890,6 @@ class GeoMapShellComponent {
7767
7890
  case 'snapshot':
7768
7891
  this.snapshotRef()?.capture();
7769
7892
  break;
7770
- case 'locate':
7771
- this.locateRef()?.locate();
7772
- break;
7773
7893
  default:
7774
7894
  break;
7775
7895
  }
@@ -7904,6 +8024,18 @@ class GeoMapShellComponent {
7904
8024
  }
7905
8025
  this.setMapCursor('grab');
7906
8026
  }
8027
+ /** Backing action for the `locate` toolbar entry (`GEO_MAP_LOCATE_TOOLBAR_ACTION`). */
8028
+ triggerLocate() {
8029
+ const ctrl = this.controller();
8030
+ if (!ctrl) {
8031
+ return;
8032
+ }
8033
+ runGeoMapLocate(ctrl, {
8034
+ onLocated: () => this.located.emit(),
8035
+ onDenied: () => this.locateDenied.emit(),
8036
+ onError: (error) => this.locateError.emit(error),
8037
+ });
8038
+ }
7907
8039
  setMapCursor(cursor) {
7908
8040
  const el = this.controller()?.getMap()?.getTargetElement();
7909
8041
  if (!el) {
@@ -7982,7 +8114,7 @@ class GeoMapShellComponent {
7982
8114
  this.managedLayers.set(next);
7983
8115
  }
7984
8116
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7985
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapShellComponent, isStandalone: true, selector: "geo-map-shell", inputs: { center: { classPropertyName: "center", publicName: "center", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showMousePosition: { classPropertyName: "showMousePosition", publicName: "showMousePosition", isSignal: true, isRequired: false, transformFunction: null }, basemapOptions: { classPropertyName: "basemapOptions", publicName: "basemapOptions", isSignal: true, isRequired: false, transformFunction: null }, toolbarActions: { classPropertyName: "toolbarActions", publicName: "toolbarActions", isSignal: true, isRequired: false, transformFunction: null }, layers: { classPropertyName: "layers", publicName: "layers", isSignal: true, isRequired: false, transformFunction: null }, legendItems: { classPropertyName: "legendItems", publicName: "legendItems", isSignal: true, isRequired: false, transformFunction: null }, showNav: { classPropertyName: "showNav", publicName: "showNav", isSignal: true, isRequired: false, transformFunction: null }, includeDemoLayers: { classPropertyName: "includeDemoLayers", publicName: "includeDemoLayers", isSignal: true, isRequired: false, transformFunction: null }, adminNodes: { classPropertyName: "adminNodes", publicName: "adminNodes", isSignal: true, isRequired: false, transformFunction: null }, adminSelectionMode: { classPropertyName: "adminSelectionMode", publicName: "adminSelectionMode", isSignal: true, isRequired: false, transformFunction: null }, locationLabel: { classPropertyName: "locationLabel", publicName: "locationLabel", isSignal: true, isRequired: false, transformFunction: null }, measureDisclaimer: { classPropertyName: "measureDisclaimer", publicName: "measureDisclaimer", isSignal: true, isRequired: false, transformFunction: null }, legendCatalogMissing: { classPropertyName: "legendCatalogMissing", publicName: "legendCatalogMissing", isSignal: true, isRequired: false, transformFunction: null }, parcelAudience: { classPropertyName: "parcelAudience", publicName: "parcelAudience", isSignal: true, isRequired: false, transformFunction: null }, provinceExtent: { classPropertyName: "provinceExtent", publicName: "provinceExtent", isSignal: true, isRequired: false, transformFunction: null }, demoSearch: { classPropertyName: "demoSearch", publicName: "demoSearch", isSignal: true, isRequired: false, transformFunction: null }, homeMode: { classPropertyName: "homeMode", publicName: "homeMode", isSignal: true, isRequired: false, transformFunction: null }, basemapId: { classPropertyName: "basemapId", publicName: "basemapId", isSignal: true, isRequired: false, transformFunction: null }, measureMode: { classPropertyName: "measureMode", publicName: "measureMode", isSignal: true, isRequired: false, transformFunction: null }, checkedMap: { classPropertyName: "checkedMap", publicName: "checkedMap", isSignal: true, isRequired: false, transformFunction: null }, layersOpen: { classPropertyName: "layersOpen", publicName: "layersOpen", isSignal: true, isRequired: false, transformFunction: null }, legendOpen: { classPropertyName: "legendOpen", publicName: "legendOpen", isSignal: true, isRequired: false, transformFunction: null }, helpOpen: { classPropertyName: "helpOpen", publicName: "helpOpen", isSignal: true, isRequired: false, transformFunction: null }, swipeActive: { classPropertyName: "swipeActive", publicName: "swipeActive", isSignal: true, isRequired: false, transformFunction: null }, searchOpen: { classPropertyName: "searchOpen", publicName: "searchOpen", isSignal: true, isRequired: false, transformFunction: null }, adminFilterOpen: { classPropertyName: "adminFilterOpen", publicName: "adminFilterOpen", isSignal: true, isRequired: false, transformFunction: null }, parcelOpen: { classPropertyName: "parcelOpen", publicName: "parcelOpen", isSignal: true, isRequired: false, transformFunction: null }, managedLayers: { classPropertyName: "managedLayers", publicName: "managedLayers", isSignal: true, isRequired: false, transformFunction: null }, searchResults: { classPropertyName: "searchResults", publicName: "searchResults", isSignal: true, isRequired: false, transformFunction: null }, selectedParcel: { classPropertyName: "selectedParcel", publicName: "selectedParcel", isSignal: true, isRequired: false, transformFunction: null }, adminCheckedKeys: { classPropertyName: "adminCheckedKeys", publicName: "adminCheckedKeys", isSignal: true, isRequired: false, transformFunction: null }, adminExpandedKeys: { classPropertyName: "adminExpandedKeys", publicName: "adminExpandedKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { basemapId: "basemapIdChange", measureMode: "measureModeChange", checkedMap: "checkedMapChange", layersOpen: "layersOpenChange", legendOpen: "legendOpenChange", helpOpen: "helpOpenChange", swipeActive: "swipeActiveChange", searchOpen: "searchOpenChange", adminFilterOpen: "adminFilterOpenChange", parcelOpen: "parcelOpenChange", managedLayers: "managedLayersChange", searchResults: "searchResultsChange", selectedParcel: "selectedParcelChange", adminCheckedKeys: "adminCheckedKeysChange", adminExpandedKeys: "adminExpandedKeysChange", mapReady: "mapReady", mapClick: "mapClick", located: "located", locateDenied: "locateDenied", locateError: "locateError", actionClick: "actionClick", search: "search", searchReset: "searchReset", resultSelect: "resultSelect", parcelExport: "parcelExport", adminApply: "adminApply", snapshotCaptured: "snapshotCaptured", snapshotError: "snapshotError" }, host: { properties: { "style.height": "height()" }, classAttribute: "geo-map-shell-host" }, viewQueries: [{ propertyName: "snapshotRef", first: true, predicate: GeoMapSnapshotComponent, descendants: true, isSignal: true }, { propertyName: "zoomRef", first: true, predicate: GeoMapZoomComponent, descendants: true, isSignal: true }, { propertyName: "locateRef", first: true, predicate: GeoMapLocateComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [selectionMode]=\"adminSelectionMode()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n [catalogMissing]=\"legendCatalogMissing()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot + locate (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n (captured)=\"snapshotCaptured.emit()\"\n (captureError)=\"snapshotError.emit($event)\"\n />\n <geo-map-locate\n class=\"geo-map-shell__locate-bridge\"\n [controller]=\"controller()\"\n (located)=\"located.emit($event)\"\n (denied)=\"locateDenied.emit()\"\n (locateError)=\"locateError.emit($event)\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n @if (measureMode() !== 'none' && measureDisclaimer()) {\n <p class=\"geo-map-shell__measure-disclaimer\" role=\"note\">\n {{ measureDisclaimer() }}\n </p>\n }\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge,.geo-map-shell__locate-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:48px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell__measure-disclaimer{margin:0;padding:6px 12px;border-radius:var(--geo-radius);background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-border-default);font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-700);text-align:center}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"], dependencies: [{ kind: "component", type: GeoMapComponent, selector: "geo-map", inputs: ["center", "zoom", "minZoom", "maxZoom", "viewProjection", "basemap", "layers", "height", "registerProjections", "projections", "showMousePosition", "mousePositionProjection", "showZoomControl"], outputs: ["mapReady", "mapClick", "viewChange", "initError"] }, { kind: "component", type: GeoMapToolbarComponent, selector: "geo-map-toolbar", inputs: ["controller", "actions", "compact", "checkedMap"], outputs: ["checkedMapChange", "actionClick", "actionToggle"] }, { kind: "component", type: GeoMapZoomComponent, selector: "geo-map-zoom", inputs: ["controller", "showNav", "showFitProvince", "provinceExtent", "fullscreenTarget"] }, { kind: "component", type: GeoMapSnapshotComponent, selector: "geo-map-snapshot", inputs: ["controller", "label", "filename"], outputs: ["captured", "captureError"] }, { kind: "component", type: GeoMapMeasureComponent, selector: "geo-map-measure", inputs: ["controller", "mode", "showResult"], outputs: ["modeChange", "measureChange"] }, { kind: "component", type: GeoMapLayersDrawerComponent, selector: "geo-map-layers-drawer", inputs: ["controller", "open", "title", "legendItems", "showOpacity", "showLegend", "layers"], outputs: ["openChange", "layersChange", "closed"] }, { kind: "component", type: GeoMapLegendComponent, selector: "geo-map-legend", inputs: ["title", "items", "catalogMissing", "open"], outputs: ["openChange", "closed"] }, { kind: "component", type: GeoMapHelpComponent, selector: "geo-map-help", inputs: ["open", "title", "sections"], outputs: ["openChange"] }, { kind: "component", type: GeoMapSwipeComponent, selector: "geo-map-swipe", inputs: ["controller", "active", "position", "layerId"], outputs: ["activeChange", "positionChange"] }, { kind: "component", type: GeoMapSearchComponent, selector: "geo-map-search", inputs: ["open", "title", "mode", "results", "loading", "pageIndex", "pageSize", "total", "emptyText"], outputs: ["openChange", "modeChange", "pageIndexChange", "pageSizeChange", "search", "reset", "resultSelect", "closed"] }, { kind: "component", type: GeoMapAdminFilterComponent, selector: "geo-map-admin-filter", inputs: ["open", "title", "nodes", "selectionMode", "checkedKeys", "expandedKeys"], outputs: ["openChange", "checkedKeysChange", "expandedKeysChange", "apply", "reset", "fitProvince", "closed", "selectionChange"] }, { kind: "component", type: GeoMapParcelPopupComponent, selector: "geo-map-parcel-popup", inputs: ["open", "title", "parcel", "audience", "showExport"], outputs: ["openChange", "closed", "back", "exportClick", "diagramClick"] }, { kind: "component", type: GeoMapLocationChipComponent, selector: "geo-map-location-chip", inputs: ["label", "icon"] }, { kind: "component", type: GeoMapBasemapSwitcherComponent, selector: "geo-map-basemap-switcher", inputs: ["options", "selectedId", "label", "tooltip"], outputs: ["selectedIdChange", "basemapChange"] }, { kind: "component", type: GeoMapLocateComponent, selector: "geo-map-locate", inputs: ["controller", "label"], outputs: ["located", "denied", "locateError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
8117
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapShellComponent, isStandalone: true, selector: "geo-map-shell", inputs: { center: { classPropertyName: "center", publicName: "center", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showMousePosition: { classPropertyName: "showMousePosition", publicName: "showMousePosition", isSignal: true, isRequired: false, transformFunction: null }, basemapOptions: { classPropertyName: "basemapOptions", publicName: "basemapOptions", isSignal: true, isRequired: false, transformFunction: null }, toolbarActions: { classPropertyName: "toolbarActions", publicName: "toolbarActions", isSignal: true, isRequired: false, transformFunction: null }, layers: { classPropertyName: "layers", publicName: "layers", isSignal: true, isRequired: false, transformFunction: null }, legendItems: { classPropertyName: "legendItems", publicName: "legendItems", isSignal: true, isRequired: false, transformFunction: null }, legendCatalogMissing: { classPropertyName: "legendCatalogMissing", publicName: "legendCatalogMissing", isSignal: true, isRequired: false, transformFunction: null }, showNav: { classPropertyName: "showNav", publicName: "showNav", isSignal: true, isRequired: false, transformFunction: null }, includeDemoLayers: { classPropertyName: "includeDemoLayers", publicName: "includeDemoLayers", isSignal: true, isRequired: false, transformFunction: null }, adminNodes: { classPropertyName: "adminNodes", publicName: "adminNodes", isSignal: true, isRequired: false, transformFunction: null }, locationLabel: { classPropertyName: "locationLabel", publicName: "locationLabel", isSignal: true, isRequired: false, transformFunction: null }, parcelAudience: { classPropertyName: "parcelAudience", publicName: "parcelAudience", isSignal: true, isRequired: false, transformFunction: null }, provinceExtent: { classPropertyName: "provinceExtent", publicName: "provinceExtent", isSignal: true, isRequired: false, transformFunction: null }, demoSearch: { classPropertyName: "demoSearch", publicName: "demoSearch", isSignal: true, isRequired: false, transformFunction: null }, homeMode: { classPropertyName: "homeMode", publicName: "homeMode", isSignal: true, isRequired: false, transformFunction: null }, basemapId: { classPropertyName: "basemapId", publicName: "basemapId", isSignal: true, isRequired: false, transformFunction: null }, measureMode: { classPropertyName: "measureMode", publicName: "measureMode", isSignal: true, isRequired: false, transformFunction: null }, checkedMap: { classPropertyName: "checkedMap", publicName: "checkedMap", isSignal: true, isRequired: false, transformFunction: null }, layersOpen: { classPropertyName: "layersOpen", publicName: "layersOpen", isSignal: true, isRequired: false, transformFunction: null }, legendOpen: { classPropertyName: "legendOpen", publicName: "legendOpen", isSignal: true, isRequired: false, transformFunction: null }, helpOpen: { classPropertyName: "helpOpen", publicName: "helpOpen", isSignal: true, isRequired: false, transformFunction: null }, swipeActive: { classPropertyName: "swipeActive", publicName: "swipeActive", isSignal: true, isRequired: false, transformFunction: null }, searchOpen: { classPropertyName: "searchOpen", publicName: "searchOpen", isSignal: true, isRequired: false, transformFunction: null }, adminFilterOpen: { classPropertyName: "adminFilterOpen", publicName: "adminFilterOpen", isSignal: true, isRequired: false, transformFunction: null }, parcelOpen: { classPropertyName: "parcelOpen", publicName: "parcelOpen", isSignal: true, isRequired: false, transformFunction: null }, managedLayers: { classPropertyName: "managedLayers", publicName: "managedLayers", isSignal: true, isRequired: false, transformFunction: null }, searchResults: { classPropertyName: "searchResults", publicName: "searchResults", isSignal: true, isRequired: false, transformFunction: null }, selectedParcel: { classPropertyName: "selectedParcel", publicName: "selectedParcel", isSignal: true, isRequired: false, transformFunction: null }, adminCheckedKeys: { classPropertyName: "adminCheckedKeys", publicName: "adminCheckedKeys", isSignal: true, isRequired: false, transformFunction: null }, adminExpandedKeys: { classPropertyName: "adminExpandedKeys", publicName: "adminExpandedKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { basemapId: "basemapIdChange", measureMode: "measureModeChange", checkedMap: "checkedMapChange", layersOpen: "layersOpenChange", legendOpen: "legendOpenChange", helpOpen: "helpOpenChange", swipeActive: "swipeActiveChange", searchOpen: "searchOpenChange", adminFilterOpen: "adminFilterOpenChange", parcelOpen: "parcelOpenChange", managedLayers: "managedLayersChange", searchResults: "searchResultsChange", selectedParcel: "selectedParcelChange", adminCheckedKeys: "adminCheckedKeysChange", adminExpandedKeys: "adminExpandedKeysChange", mapReady: "mapReady", mapClick: "mapClick", located: "located", locateDenied: "locateDenied", locateError: "locateError", actionClick: "actionClick", search: "search", searchReset: "searchReset", resultSelect: "resultSelect", parcelExport: "parcelExport", adminApply: "adminApply" }, host: { properties: { "style.height": "height()" }, classAttribute: "geo-map-shell-host" }, viewQueries: [{ propertyName: "snapshotRef", first: true, predicate: GeoMapSnapshotComponent, descendants: true, isSignal: true }, { propertyName: "zoomRef", first: true, predicate: GeoMapZoomComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n @if (legendCatalogMissing()) {\n <div class=\"geo-map-shell__notice\">\n <geo-alert\n type=\"warning\"\n [showIcon]=\"true\"\n title=\"Ch\u01B0a c\u00F3 danh m\u1EE5c ch\u00FA gi\u1EA3i\"\n message=\"Danh m\u1EE5c lo\u1EA1i \u0111\u1EA5t v\u00E0 k\u00FD hi\u1EC7u/m\u00E0u c\u1EE7a t\u1EC9nh ch\u01B0a \u0111\u01B0\u1EE3c n\u1EA1p v\u00E0o h\u1EC7 th\u1ED1ng. B\u1EA3n \u0111\u1ED3 v\u1EABn hi\u1EC3n th\u1ECB b\u00ECnh th\u01B0\u1EDDng.\"\n />\n </div>\n }\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: [".geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__notice{position:absolute;top:16px;left:50%;z-index:8;transform:translate(-50%);width:min(480px,100% - 32px);pointer-events:none}.geo-map-shell__notice>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:64px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"], dependencies: [{ kind: "component", type: GeoMapComponent, selector: "geo-map", inputs: ["center", "zoom", "minZoom", "maxZoom", "viewProjection", "basemap", "layers", "height", "registerProjections", "projections", "showMousePosition", "mousePositionProjection", "showZoomControl"], outputs: ["mapReady", "mapClick", "viewChange", "initError"] }, { kind: "component", type: GeoMapToolbarComponent, selector: "geo-map-toolbar", inputs: ["controller", "actions", "compact", "checkedMap"], outputs: ["checkedMapChange", "actionClick", "actionToggle"] }, { kind: "component", type: GeoMapZoomComponent, selector: "geo-map-zoom", inputs: ["controller", "showNav", "showFitProvince", "provinceExtent", "fullscreenTarget"] }, { kind: "component", type: GeoMapSnapshotComponent, selector: "geo-map-snapshot", inputs: ["controller", "label", "filename"], outputs: ["captured", "captureError"] }, { kind: "component", type: GeoMapMeasureComponent, selector: "geo-map-measure", inputs: ["controller", "mode", "showResult"], outputs: ["modeChange", "measureChange"] }, { kind: "component", type: GeoMapLayersDrawerComponent, selector: "geo-map-layers-drawer", inputs: ["controller", "open", "title", "legendItems", "showOpacity", "showLegend", "layers"], outputs: ["openChange", "layersChange", "closed"] }, { kind: "component", type: GeoMapLegendComponent, selector: "geo-map-legend", inputs: ["title", "items", "open"], outputs: ["openChange", "closed"] }, { kind: "component", type: GeoMapHelpComponent, selector: "geo-map-help", inputs: ["open", "title", "sections"], outputs: ["openChange"] }, { kind: "component", type: GeoMapSwipeComponent, selector: "geo-map-swipe", inputs: ["controller", "active", "position", "layerId"], outputs: ["activeChange", "positionChange"] }, { kind: "component", type: GeoMapSearchComponent, selector: "geo-map-search", inputs: ["open", "title", "mode", "results", "loading", "pageIndex", "pageSize", "total", "emptyText"], outputs: ["openChange", "modeChange", "pageIndexChange", "pageSizeChange", "search", "reset", "resultSelect", "closed"] }, { kind: "component", type: GeoMapAdminFilterComponent, selector: "geo-map-admin-filter", inputs: ["open", "title", "nodes", "checkedKeys", "expandedKeys"], outputs: ["openChange", "checkedKeysChange", "expandedKeysChange", "apply", "reset", "fitProvince", "closed", "selectionChange"] }, { kind: "component", type: GeoMapParcelPopupComponent, selector: "geo-map-parcel-popup", inputs: ["open", "title", "parcel", "audience", "showExport"], outputs: ["openChange", "closed", "back", "exportClick", "diagramClick"] }, { kind: "component", type: GeoMapLocationChipComponent, selector: "geo-map-location-chip", inputs: ["label", "icon"] }, { kind: "component", type: GeoMapBasemapSwitcherComponent, selector: "geo-map-basemap-switcher", inputs: ["options", "selectedId", "label", "tooltip"], outputs: ["selectedIdChange", "basemapChange"] }, { kind: "component", type: GeoAlertComponent, selector: "geo-alert", inputs: ["type", "title", "message", "closable", "visible", "showIcon"], outputs: ["visibleChange", "closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7986
8118
  }
7987
8119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapShellComponent, decorators: [{
7988
8120
  type: Component,
@@ -8001,11 +8133,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8001
8133
  GeoMapParcelPopupComponent,
8002
8134
  GeoMapLocationChipComponent,
8003
8135
  GeoMapBasemapSwitcherComponent,
8004
- GeoMapLocateComponent,
8136
+ GeoAlertComponent,
8005
8137
  ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
8006
8138
  class: 'geo-map-shell-host',
8007
8139
  '[style.height]': 'height()',
8008
- }, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [selectionMode]=\"adminSelectionMode()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n [catalogMissing]=\"legendCatalogMissing()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot + locate (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n (captured)=\"snapshotCaptured.emit()\"\n (captureError)=\"snapshotError.emit($event)\"\n />\n <geo-map-locate\n class=\"geo-map-shell__locate-bridge\"\n [controller]=\"controller()\"\n (located)=\"located.emit($event)\"\n (denied)=\"locateDenied.emit()\"\n (locateError)=\"locateError.emit($event)\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n @if (measureMode() !== 'none' && measureDisclaimer()) {\n <p class=\"geo-map-shell__measure-disclaimer\" role=\"note\">\n {{ measureDisclaimer() }}\n </p>\n }\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: ["@charset \"UTF-8\";.geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge,.geo-map-shell__locate-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:48px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell__measure-disclaimer{margin:0;padding:6px 12px;border-radius:var(--geo-radius);background:var(--geo-color-neutral-white);border:1px solid var(--geo-color-border-default);font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-700);text-align:center}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"] }]
8140
+ }, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n @if (legendCatalogMissing()) {\n <div class=\"geo-map-shell__notice\">\n <geo-alert\n type=\"warning\"\n [showIcon]=\"true\"\n title=\"Ch\u01B0a c\u00F3 danh m\u1EE5c ch\u00FA gi\u1EA3i\"\n message=\"Danh m\u1EE5c lo\u1EA1i \u0111\u1EA5t v\u00E0 k\u00FD hi\u1EC7u/m\u00E0u c\u1EE7a t\u1EC9nh ch\u01B0a \u0111\u01B0\u1EE3c n\u1EA1p v\u00E0o h\u1EC7 th\u1ED1ng. B\u1EA3n \u0111\u1ED3 v\u1EABn hi\u1EC3n th\u1ECB b\u00ECnh th\u01B0\u1EDDng.\"\n />\n </div>\n }\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: [".geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__notice{position:absolute;top:16px;left:50%;z-index:8;transform:translate(-50%);width:min(480px,100% - 32px);pointer-events:none}.geo-map-shell__notice>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:64px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"] }]
8009
8141
  }], ctorParameters: () => [] });
8010
8142
 
8011
8143
  /*
@@ -8016,5 +8148,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8016
8148
  * Generated bundle index. Do not edit.
8017
8149
  */
8018
8150
 
8019
- export { DEFAULT_UI_ROW_ACTIONS, DEFAULT_UI_TABLE_PAGE_SIZE_OPTIONS, GEO_ICON_SIZE_MAP, GEO_LAYOUT_DEFAULT_NOTIFICATIONS, GEO_LAYOUT_DEFAULT_SUBSYSTEMS, GEO_LAYOUT_DEFAULT_USER, GEO_LAYOUT_DEFAULT_USER_MENU, GEO_MAP_BASEMAP_LAYER_ID, GEO_MAP_BUILTIN_PROJECTIONS, GEO_MAP_DEFAULT_BASEMAP_OPTIONS, GEO_MAP_DEFAULT_CENTER, GEO_MAP_DEFAULT_HEIGHT, GEO_MAP_DEFAULT_HELP_SECTIONS, GEO_MAP_DEFAULT_MAX_ZOOM, GEO_MAP_DEFAULT_MIN_ZOOM, GEO_MAP_DEFAULT_PLANNING_LAYERS, GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326, GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, GEO_MAP_DEFAULT_VIEW_PROJECTION, GEO_MAP_DEFAULT_ZOOM, GEO_MAP_DEMO_ADMIN_NODES, GEO_MAP_DEMO_LEGEND_ITEMS, GEO_MAP_DEMO_PARCEL_DETAIL, GEO_MAP_DEMO_THEMATIC_LAYERS, GEO_MAP_ENV_PLACEHOLDERS, GEO_MAP_ESRI_IMAGERY_URL, GEO_MAP_ESRI_STREETS_URL, GEO_MAP_ESRI_TRANSPORT_URL, GEO_MAP_HIGHLIGHT_LAYER_ID, GEO_MAP_LOCATE_TOOLBAR_ACTION, GEO_MAP_MEASURE_LAYER_ID, GEO_MAP_SELECTION_LAYER_ID, GEO_MAP_TOOLBAR_ASSET_BASE, GEO_MAP_TOOLBAR_ICONS, GEO_MAP_TRAFFIC_LAYER_ID, GEO_MAP_TRAFFIC_OVERLAY, GEO_STATUS_COLOR_MAP, GEO_STATUS_LABELS, GEO_TOAST_DEFAULT_TITLES, GEO_TOAST_ICONS, GEO_TYPOGRAPHY_TAG, GEO_TYPOGRAPHY_VARIANTS, GeoAlertComponent, GeoBackButtonComponent, GeoBreadcrumbComponent, GeoButtonComponent, GeoChartComponent, GeoCheckboxComponent, GeoColumnPickerComponent, GeoConfirmModalComponent, GeoDashboardComponent, GeoDatePickerComponent, GeoDateRangePickerComponent, GeoEmptyStateComponent, GeoFeedbackFormComponent, GeoFilePickerComponent, GeoForgotPasswordComponent, GeoFormModalComponent, GeoIconComponent, GeoInputComponent, GeoLayoutActionsDirective, GeoLayoutComponent, GeoLayoutFooterComponent, GeoLayoutHeaderActionsComponent, GeoLayoutHeaderComponent, GeoLayoutSidebarComponent, GeoListPageComponent, GeoLoginComponent, GeoMapAdminFilterComponent, GeoMapBasemapSwitcherComponent, GeoMapComponent, GeoMapController, GeoMapHelpComponent, GeoMapLayerCardComponent, GeoMapLayerPanelComponent, GeoMapLayerService, GeoMapLayersDrawerComponent, GeoMapLegendComponent, GeoMapLocateComponent, GeoMapLocationChipComponent, GeoMapMeasureComponent, GeoMapOpacityComponent, GeoMapParcelPopupComponent, GeoMapProjectionError, GeoMapProjectionService, GeoMapSearchComponent, GeoMapService, GeoMapShellComponent, GeoMapSnapshotComponent, GeoMapSwipeComponent, GeoMapToolbarComponent, GeoMapZoomComponent, GeoOverlapResultComponent, GeoPageHeaderComponent, GeoPageTitleComponent, GeoPaginationComponent, GeoRadioComponent, GeoRowActionsComponent, GeoSelectComponent, GeoSliderComponent, GeoStatCardComponent, GeoStatusTagComponent, GeoStepFormLayoutComponent, GeoStepperComponent, GeoTabDirective, GeoTableComponent, GeoTableFilterComponent, GeoTablePaginationComponent, GeoTableToolbarComponent, GeoTabsComponent, GeoTextareaComponent, GeoToastComponent, GeoToastService, GeoTreeComponent, GeoTypographyComponent, GeoUploadComponent, NgZorroAntdModule, UI_ALERT_DEFAULT_TITLES, UI_STATUS_LABELS, UI_TABLE_MOBILE_BREAKPOINT, applyColumnPickerState, cssVar, geoColorCssVars, geoColorTokens, geoFormatBytes, geoFormatSpeed, geoRadiusCssVars, geoRadiusTokens, geoShadowTokens, geoTypographyTokens, geoUploadPercent, loadColumnPickerState, mergeColumnPickerItems, pickInlineRowActions, pickOverflowRowActions, saveColumnPickerState };
8151
+ export { DEFAULT_UI_ROW_ACTIONS, DEFAULT_UI_TABLE_PAGE_SIZE_OPTIONS, GEO_ICON_SIZE_MAP, GEO_LAYOUT_DEFAULT_NOTIFICATIONS, GEO_LAYOUT_DEFAULT_SUBSYSTEMS, GEO_LAYOUT_DEFAULT_USER, GEO_LAYOUT_DEFAULT_USER_MENU, GEO_MAP_BASEMAP_LAYER_ID, GEO_MAP_BUILTIN_PROJECTIONS, GEO_MAP_DEFAULT_BASEMAP_OPTIONS, GEO_MAP_DEFAULT_CENTER, GEO_MAP_DEFAULT_HEIGHT, GEO_MAP_DEFAULT_HELP_SECTIONS, GEO_MAP_DEFAULT_MAX_ZOOM, GEO_MAP_DEFAULT_MIN_ZOOM, GEO_MAP_DEFAULT_PLANNING_LAYERS, GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326, GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, GEO_MAP_DEFAULT_VIEW_PROJECTION, GEO_MAP_DEFAULT_ZOOM, GEO_MAP_DEMO_ADMIN_NODES, GEO_MAP_DEMO_LEGEND_ITEMS, GEO_MAP_DEMO_PARCEL_DETAIL, GEO_MAP_DEMO_THEMATIC_LAYERS, GEO_MAP_ENV_PLACEHOLDERS, GEO_MAP_ESRI_IMAGERY_URL, GEO_MAP_ESRI_STREETS_URL, GEO_MAP_ESRI_TRANSPORT_URL, GEO_MAP_HIGHLIGHT_LAYER_ID, GEO_MAP_LOCATE_TOOLBAR_ACTION, GEO_MAP_MEASURE_LAYER_ID, GEO_MAP_SELECTION_LAYER_ID, GEO_MAP_TOOLBAR_ASSET_BASE, GEO_MAP_TOOLBAR_ICONS, GEO_MAP_TRAFFIC_LAYER_ID, GEO_MAP_TRAFFIC_OVERLAY, GEO_STATUS_COLOR_MAP, GEO_STATUS_LABELS, GEO_TOAST_DEFAULT_TITLES, GEO_TOAST_ICONS, GEO_TYPOGRAPHY_TAG, GEO_TYPOGRAPHY_VARIANTS, GeoAccordionComponent, GeoAccordionPanelDirective, GeoAlertComponent, GeoBackButtonComponent, GeoBreadcrumbComponent, GeoButtonComponent, GeoChartComponent, GeoCheckboxComponent, GeoColumnPickerComponent, GeoConfirmModalComponent, GeoDashboardComponent, GeoDatePickerComponent, GeoDateRangePickerComponent, GeoDetailViewComponent, GeoDetailViewItemDirective, GeoEmptyStateComponent, GeoFeedbackFormComponent, GeoFilePickerComponent, GeoForgotPasswordComponent, GeoFormModalComponent, GeoIconComponent, GeoInputComponent, GeoLayoutActionsDirective, GeoLayoutComponent, GeoLayoutFooterComponent, GeoLayoutHeaderActionsComponent, GeoLayoutHeaderComponent, GeoLayoutSidebarComponent, GeoListPageComponent, GeoLoginComponent, GeoMapAdminFilterComponent, GeoMapBasemapSwitcherComponent, GeoMapComponent, GeoMapController, GeoMapHelpComponent, GeoMapLayerCardComponent, GeoMapLayerPanelComponent, GeoMapLayerService, GeoMapLayersDrawerComponent, GeoMapLegendComponent, GeoMapLocateComponent, GeoMapLocationChipComponent, GeoMapMeasureComponent, GeoMapOpacityComponent, GeoMapParcelPopupComponent, GeoMapProjectionError, GeoMapProjectionService, GeoMapSearchComponent, GeoMapService, GeoMapShellComponent, GeoMapSnapshotComponent, GeoMapSwipeComponent, GeoMapToolbarComponent, GeoMapZoomComponent, GeoOverlapResultComponent, GeoPageHeaderComponent, GeoPageTitleComponent, GeoPaginationComponent, GeoRadioComponent, GeoRowActionsComponent, GeoSelectComponent, GeoSliderComponent, GeoStatCardComponent, GeoStatusTagComponent, GeoStepFormLayoutComponent, GeoStepperComponent, GeoSwitchComponent, GeoTabDirective, GeoTableComponent, GeoTableFilterComponent, GeoTablePaginationComponent, GeoTableToolbarComponent, GeoTabsComponent, GeoTextareaComponent, GeoToastComponent, GeoToastService, GeoTreeComponent, GeoTypographyComponent, GeoUploadComponent, NgZorroAntdModule, UI_ALERT_DEFAULT_TITLES, UI_STATUS_LABELS, UI_TABLE_MOBILE_BREAKPOINT, applyColumnPickerState, cssVar, geoColorCssVars, geoColorTokens, geoFormatBytes, geoFormatSpeed, geoRadiusCssVars, geoRadiusTokens, geoShadowTokens, geoTypographyTokens, geoUploadPercent, loadColumnPickerState, mergeColumnPickerItems, pickInlineRowActions, pickOverflowRowActions, saveColumnPickerState };
8020
8152
  //# sourceMappingURL=geoit-ui.mjs.map