@geoit/ui 0.0.7 → 0.1.0

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 (39) hide show
  1. package/ai/AGENTS.md +4 -0
  2. package/ai/README.md +4 -1
  3. package/ai/catalog.json +194 -64
  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 +0 -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-legend/geo-map-legend.component.mjs +3 -5
  20. package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +3 -22
  21. package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +1 -13
  22. package/esm2022/lib/figma/geo-switch/geo-switch.component.mjs +44 -0
  23. package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +3 -17
  24. package/esm2022/lib/figma/index.mjs +6 -1
  25. package/fesm2022/geoit-ui.mjs +173 -87
  26. package/fesm2022/geoit-ui.mjs.map +1 -1
  27. package/lib/figma/geo-accordion/geo-accordion.component.d.ts +34 -0
  28. package/lib/figma/geo-accordion/geo-accordion.types.d.ts +7 -0
  29. package/lib/figma/geo-chart/geo-chart.component.d.ts +0 -9
  30. package/lib/figma/geo-detail-view/geo-detail-view.component.d.ts +30 -0
  31. package/lib/figma/geo-detail-view/geo-detail-view.types.d.ts +8 -0
  32. package/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.d.ts +1 -3
  33. package/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.d.ts +1 -3
  34. package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +2 -19
  35. package/lib/figma/geo-map/geo-map.constants.d.ts +0 -6
  36. package/lib/figma/geo-switch/geo-switch.component.d.ts +25 -0
  37. package/lib/figma/geo-tree/geo-tree.component.d.ts +1 -5
  38. package/lib/figma/index.d.ts +5 -0
  39. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ import { QueryList, TemplateRef } from '@angular/core';
2
+ import { GeoAccordionItem } from './geo-accordion.types';
3
+ import * as i0 from "@angular/core";
4
+ export declare class GeoAccordionPanelDirective {
5
+ readonly key: import("@angular/core").InputSignal<string>;
6
+ readonly template: TemplateRef<any>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<GeoAccordionPanelDirective, never>;
8
+ static ɵdir: i0.ɵɵDirectiveDeclaration<GeoAccordionPanelDirective, "[uiPanel]", never, { "key": { "alias": "uiPanel"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
9
+ }
10
+ /**
11
+ * Collapsible panel group.
12
+ *
13
+ * @summary Nhóm panel thu gọn/mở rộng (nz-collapse); mỗi panel chiếu nội dung qua `[uiPanel]`.
14
+ * @whenToUse Gom nhiều nhóm thông tin dài trên cùng trang (FAQ, chi tiết theo mục).
15
+ * @doNotUseWhen Điều hướng giữa các view ngang hàng — use geo-tabs.
16
+ */
17
+ export declare class GeoAccordionComponent {
18
+ readonly items: import("@angular/core").InputSignal<GeoAccordionItem[]>;
19
+ /** `true` → chỉ 1 panel mở tại một thời điểm (maps to `nzAccordion`). */
20
+ readonly accordion: import("@angular/core").InputSignal<boolean>;
21
+ readonly bordered: import("@angular/core").InputSignal<boolean>;
22
+ readonly ghost: import("@angular/core").InputSignal<boolean>;
23
+ readonly activeKeys: import("@angular/core").ModelSignal<string[]>;
24
+ readonly panelChange: import("@angular/core").OutputEmitterRef<{
25
+ key: string;
26
+ active: boolean;
27
+ }>;
28
+ panelTemplates: QueryList<GeoAccordionPanelDirective>;
29
+ isActive(key: string): boolean;
30
+ onActiveChange(key: string, active: boolean): void;
31
+ getTemplate(key: string): TemplateRef<unknown> | null;
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<GeoAccordionComponent, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoAccordionComponent, "geo-accordion", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "accordion": { "alias": "accordion"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "ghost": { "alias": "ghost"; "required": false; "isSignal": true; }; "activeKeys": { "alias": "activeKeys"; "required": false; "isSignal": true; }; }, { "activeKeys": "activeKeysChange"; "panelChange": "panelChange"; }, ["panelTemplates"], never, true, never>;
34
+ }
@@ -0,0 +1,7 @@
1
+ export interface GeoAccordionItem {
2
+ key: string;
3
+ title: string;
4
+ disabled?: boolean;
5
+ /** Text phụ hiển thị bên phải header (vd: trạng thái, số lượng). */
6
+ extra?: string;
7
+ }
@@ -32,15 +32,6 @@ export declare class GeoChartComponent {
32
32
  percent: number;
33
33
  }[]>;
34
34
  colorOf(item: GeoChartDatum, index: number): string;
35
- /**
36
- * `@for` track dùng qua method thay vì `item.id ?? item.label` trực tiếp trong template —
37
- * Angular linker (18.2.14) sinh sai scope biến tạm cho track expression chứa `??` khi bị
38
- * hoist lên module scope, gây `ReferenceError: tmp_x_0 is not defined` lúc chạy.
39
- */
40
- trackDatum(item: GeoChartDatum): string;
41
- trackSegment(seg: {
42
- datum: GeoChartDatum;
43
- }): string;
44
35
  barWidth(value: number): string;
45
36
  setSort(next: GeoChartSort): void;
46
37
  onSegment(datum: GeoChartDatum, index: number): void;
@@ -0,0 +1,30 @@
1
+ import { QueryList, TemplateRef } from '@angular/core';
2
+ import { GeoDetailViewItem } from './geo-detail-view.types';
3
+ import * as i0 from "@angular/core";
4
+ export type GeoDetailViewLayout = 'horizontal' | 'vertical';
5
+ export type GeoDetailViewSize = 'default' | 'small';
6
+ export declare class GeoDetailViewItemDirective {
7
+ readonly key: import("@angular/core").InputSignal<string>;
8
+ readonly template: TemplateRef<any>;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<GeoDetailViewItemDirective, never>;
10
+ static ɵdir: i0.ɵɵDirectiveDeclaration<GeoDetailViewItemDirective, "[uiDetailItem]", never, { "key": { "alias": "uiDetailItem"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
11
+ }
12
+ /**
13
+ * Read-only key/value grid for viewing entity details.
14
+ *
15
+ * @summary Lưới label/value chỉ đọc (nz-descriptions); value tùy biến qua `[uiDetailItem]`.
16
+ * @whenToUse Trang/khối xem chi tiết hồ sơ, thửa đất, người dùng… (không chỉnh sửa).
17
+ * @doNotUseWhen Cần nhập liệu — use geo-input/geo-select trong form.
18
+ */
19
+ export declare class GeoDetailViewComponent {
20
+ readonly title: import("@angular/core").InputSignal<string>;
21
+ readonly items: import("@angular/core").InputSignal<GeoDetailViewItem[]>;
22
+ readonly column: import("@angular/core").InputSignal<number>;
23
+ readonly bordered: import("@angular/core").InputSignal<boolean>;
24
+ readonly layout: import("@angular/core").InputSignal<GeoDetailViewLayout>;
25
+ readonly size: import("@angular/core").InputSignal<GeoDetailViewSize>;
26
+ itemTemplates: QueryList<GeoDetailViewItemDirective>;
27
+ getTemplate(key: string): TemplateRef<unknown> | null;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<GeoDetailViewComponent, never>;
29
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoDetailViewComponent, "geo-detail-view", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "column": { "alias": "column"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, ["itemTemplates"], never, true, never>;
30
+ }
@@ -0,0 +1,8 @@
1
+ export interface GeoDetailViewItem {
2
+ key: string;
3
+ label: string;
4
+ /** Bỏ qua nếu dùng `[uiDetailItem]` để chiếu nội dung tùy biến. */
5
+ value?: string | number | null;
6
+ /** Số cột chiếm dụng (mặc định 1). */
7
+ span?: number;
8
+ }
@@ -11,8 +11,6 @@ export declare class GeoMapAdminFilterComponent {
11
11
  readonly open: import("@angular/core").ModelSignal<boolean>;
12
12
  readonly title: import("@angular/core").InputSignal<string>;
13
13
  readonly nodes: import("@angular/core").InputSignal<GeoTreeNode[]>;
14
- /** `single` — chọn đúng 1 xã/phường (BR-06-03); `multi` — checkbox nhiều cấp (mặc định). */
15
- readonly selectionMode: import("@angular/core").InputSignal<"multi" | "single">;
16
14
  readonly checkedKeys: import("@angular/core").ModelSignal<(string | number)[]>;
17
15
  readonly expandedKeys: import("@angular/core").ModelSignal<(string | number)[]>;
18
16
  readonly apply: import("@angular/core").OutputEmitterRef<(string | number)[]>;
@@ -26,5 +24,5 @@ export declare class GeoMapAdminFilterComponent {
26
24
  onFitProvince(): void;
27
25
  close(): void;
28
26
  static ɵfac: i0.ɵɵFactoryDeclaration<GeoMapAdminFilterComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapAdminFilterComponent, "geo-map-admin-filter", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "checkedKeys": { "alias": "checkedKeys"; "required": false; "isSignal": true; }; "expandedKeys": { "alias": "expandedKeys"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "checkedKeys": "checkedKeysChange"; "expandedKeys": "expandedKeysChange"; "apply": "apply"; "reset": "reset"; "fitProvince": "fitProvince"; "closed": "closed"; "selectionChange": "selectionChange"; }, never, never, true, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapAdminFilterComponent, "geo-map-admin-filter", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "checkedKeys": { "alias": "checkedKeys"; "required": false; "isSignal": true; }; "expandedKeys": { "alias": "expandedKeys"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "checkedKeys": "checkedKeysChange"; "expandedKeys": "expandedKeysChange"; "apply": "apply"; "reset": "reset"; "fitProvince": "fitProvince"; "closed": "closed"; "selectionChange": "selectionChange"; }, never, never, true, never>;
30
28
  }
@@ -10,11 +10,9 @@ import * as i0 from "@angular/core";
10
10
  export declare class GeoMapLegendComponent {
11
11
  readonly title: import("@angular/core").InputSignal<string>;
12
12
  readonly items: import("@angular/core").InputSignal<GeoMapLegendItem[]>;
13
- /** True khi danh mục chú giải không tải được (`ERR_MAP_LEGEND_CATALOG_MISSING`). */
14
- readonly catalogMissing: import("@angular/core").InputSignal<boolean>;
15
13
  readonly open: import("@angular/core").ModelSignal<boolean>;
16
14
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
17
15
  onClose(): void;
18
16
  static ɵfac: i0.ɵɵFactoryDeclaration<GeoMapLegendComponent, never>;
19
- static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapLegendComponent, "geo-map-legend", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "catalogMissing": { "alias": "catalogMissing"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, never, true, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapLegendComponent, "geo-map-legend", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, never, true, never>;
20
18
  }
@@ -1,6 +1,6 @@
1
1
  import { GeoMapController } from '../../geo-map.controller';
2
2
  import type { GeoTreeNode } from '../../../geo-tree/geo-tree.types';
3
- import type { GeoMapBasemap, GeoMapBasemapOption, GeoMapClickEvent, GeoMapLayerConfig, GeoMapLegendItem, GeoMapLocateErrorReason, GeoMapMeasureMode, GeoMapParcelAudience, GeoMapParcelDetail, GeoMapSearchQuery, GeoMapSearchResultItem, GeoMapToolbarAction } from '../../geo-map.types';
3
+ import type { GeoMapBasemap, GeoMapBasemapOption, GeoMapClickEvent, GeoMapLayerConfig, GeoMapLegendItem, GeoMapMeasureMode, GeoMapParcelAudience, GeoMapParcelDetail, GeoMapSearchQuery, GeoMapSearchResultItem, GeoMapToolbarAction } from '../../geo-map.types';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
6
  * Map viewport + portal chrome (toolbar, layers drawer, legend, help, swipe, …).
@@ -13,7 +13,6 @@ export declare class GeoMapShellComponent {
13
13
  private readonly destroyRef;
14
14
  private readonly snapshotRef;
15
15
  private readonly zoomRef;
16
- private readonly locateRef;
17
16
  readonly center: import("@angular/core").InputSignal<number[]>;
18
17
  readonly zoom: import("@angular/core").InputSignal<number>;
19
18
  readonly height: import("@angular/core").InputSignal<string>;
@@ -26,16 +25,7 @@ export declare class GeoMapShellComponent {
26
25
  readonly showNav: import("@angular/core").InputSignal<boolean>;
27
26
  readonly includeDemoLayers: import("@angular/core").InputSignal<boolean>;
28
27
  readonly adminNodes: import("@angular/core").InputSignal<GeoTreeNode[]>;
29
- /** `single` — chọn đúng 1 xã/phường (BR-06-03); `multi` — checkbox nhiều cấp (mặc định). */
30
- readonly adminSelectionMode: import("@angular/core").InputSignal<"multi" | "single">;
31
28
  readonly locationLabel: import("@angular/core").InputSignal<string>;
32
- /**
33
- * Ghi chú pháp lý hiển thị khi đang đo (BR-10-03). `null` ẩn ghi chú —
34
- * mặc định giữ nguyên câu chữ đã dùng ở `qh-map-shell`.
35
- */
36
- readonly measureDisclaimer: import("@angular/core").InputSignal<string | null>;
37
- /** True khi danh mục chú giải không tải được (`ERR_MAP_LEGEND_CATALOG_MISSING`). */
38
- readonly legendCatalogMissing: import("@angular/core").InputSignal<boolean>;
39
29
  readonly parcelAudience: import("@angular/core").InputSignal<GeoMapParcelAudience>;
40
30
  readonly provinceExtent: import("@angular/core").InputSignal<readonly [number, number, number, number]>;
41
31
  /** When true, shell seeds mock search results (Storybook / demos). */
@@ -62,20 +52,13 @@ export declare class GeoMapShellComponent {
62
52
  readonly adminExpandedKeys: import("@angular/core").ModelSignal<(string | number)[]>;
63
53
  readonly mapReady: import("@angular/core").OutputEmitterRef<GeoMapController>;
64
54
  readonly mapClick: import("@angular/core").OutputEmitterRef<GeoMapClickEvent>;
65
- readonly located: import("@angular/core").OutputEmitterRef<[number, number]>;
66
55
  readonly locateDenied: import("@angular/core").OutputEmitterRef<void>;
67
- readonly locateError: import("@angular/core").OutputEmitterRef<{
68
- reason: GeoMapLocateErrorReason;
69
- message?: string;
70
- }>;
71
56
  readonly actionClick: import("@angular/core").OutputEmitterRef<GeoMapToolbarAction>;
72
57
  readonly search: import("@angular/core").OutputEmitterRef<GeoMapSearchQuery>;
73
58
  readonly searchReset: import("@angular/core").OutputEmitterRef<void>;
74
59
  readonly resultSelect: import("@angular/core").OutputEmitterRef<GeoMapSearchResultItem>;
75
60
  readonly parcelExport: import("@angular/core").OutputEmitterRef<GeoMapParcelDetail>;
76
61
  readonly adminApply: import("@angular/core").OutputEmitterRef<(string | number)[]>;
77
- readonly snapshotCaptured: import("@angular/core").OutputEmitterRef<void>;
78
- readonly snapshotError: import("@angular/core").OutputEmitterRef<unknown>;
79
62
  readonly controller: import("@angular/core").WritableSignal<GeoMapController | null>;
80
63
  /** Active map pointer tool (`none` = default arrow cursor). */
81
64
  readonly toolMode: import("@angular/core").WritableSignal<"area" | "none" | "distance" | "pan">;
@@ -116,5 +99,5 @@ export declare class GeoMapShellComponent {
116
99
  private buildDemoSearchResults;
117
100
  private ensureSwipeOverlayVisible;
118
101
  static ɵfac: i0.ɵɵFactoryDeclaration<GeoMapShellComponent, never>;
119
- static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapShellComponent, "geo-map-shell", never, { "center": { "alias": "center"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "showMousePosition": { "alias": "showMousePosition"; "required": false; "isSignal": true; }; "basemapOptions": { "alias": "basemapOptions"; "required": false; "isSignal": true; }; "toolbarActions": { "alias": "toolbarActions"; "required": false; "isSignal": true; }; "layers": { "alias": "layers"; "required": false; "isSignal": true; }; "legendItems": { "alias": "legendItems"; "required": false; "isSignal": true; }; "showNav": { "alias": "showNav"; "required": false; "isSignal": true; }; "includeDemoLayers": { "alias": "includeDemoLayers"; "required": false; "isSignal": true; }; "adminNodes": { "alias": "adminNodes"; "required": false; "isSignal": true; }; "adminSelectionMode": { "alias": "adminSelectionMode"; "required": false; "isSignal": true; }; "locationLabel": { "alias": "locationLabel"; "required": false; "isSignal": true; }; "measureDisclaimer": { "alias": "measureDisclaimer"; "required": false; "isSignal": true; }; "legendCatalogMissing": { "alias": "legendCatalogMissing"; "required": false; "isSignal": true; }; "parcelAudience": { "alias": "parcelAudience"; "required": false; "isSignal": true; }; "provinceExtent": { "alias": "provinceExtent"; "required": false; "isSignal": true; }; "demoSearch": { "alias": "demoSearch"; "required": false; "isSignal": true; }; "homeMode": { "alias": "homeMode"; "required": false; "isSignal": true; }; "basemapId": { "alias": "basemapId"; "required": false; "isSignal": true; }; "measureMode": { "alias": "measureMode"; "required": false; "isSignal": true; }; "checkedMap": { "alias": "checkedMap"; "required": false; "isSignal": true; }; "layersOpen": { "alias": "layersOpen"; "required": false; "isSignal": true; }; "legendOpen": { "alias": "legendOpen"; "required": false; "isSignal": true; }; "helpOpen": { "alias": "helpOpen"; "required": false; "isSignal": true; }; "swipeActive": { "alias": "swipeActive"; "required": false; "isSignal": true; }; "searchOpen": { "alias": "searchOpen"; "required": false; "isSignal": true; }; "adminFilterOpen": { "alias": "adminFilterOpen"; "required": false; "isSignal": true; }; "parcelOpen": { "alias": "parcelOpen"; "required": false; "isSignal": true; }; "managedLayers": { "alias": "managedLayers"; "required": false; "isSignal": true; }; "searchResults": { "alias": "searchResults"; "required": false; "isSignal": true; }; "selectedParcel": { "alias": "selectedParcel"; "required": false; "isSignal": true; }; "adminCheckedKeys": { "alias": "adminCheckedKeys"; "required": false; "isSignal": true; }; "adminExpandedKeys": { "alias": "adminExpandedKeys"; "required": false; "isSignal": true; }; }, { "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"; }, never, ["[geoMapShellTopRight]"], true, never>;
102
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapShellComponent, "geo-map-shell", never, { "center": { "alias": "center"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "showMousePosition": { "alias": "showMousePosition"; "required": false; "isSignal": true; }; "basemapOptions": { "alias": "basemapOptions"; "required": false; "isSignal": true; }; "toolbarActions": { "alias": "toolbarActions"; "required": false; "isSignal": true; }; "layers": { "alias": "layers"; "required": false; "isSignal": true; }; "legendItems": { "alias": "legendItems"; "required": false; "isSignal": true; }; "showNav": { "alias": "showNav"; "required": false; "isSignal": true; }; "includeDemoLayers": { "alias": "includeDemoLayers"; "required": false; "isSignal": true; }; "adminNodes": { "alias": "adminNodes"; "required": false; "isSignal": true; }; "locationLabel": { "alias": "locationLabel"; "required": false; "isSignal": true; }; "parcelAudience": { "alias": "parcelAudience"; "required": false; "isSignal": true; }; "provinceExtent": { "alias": "provinceExtent"; "required": false; "isSignal": true; }; "demoSearch": { "alias": "demoSearch"; "required": false; "isSignal": true; }; "homeMode": { "alias": "homeMode"; "required": false; "isSignal": true; }; "basemapId": { "alias": "basemapId"; "required": false; "isSignal": true; }; "measureMode": { "alias": "measureMode"; "required": false; "isSignal": true; }; "checkedMap": { "alias": "checkedMap"; "required": false; "isSignal": true; }; "layersOpen": { "alias": "layersOpen"; "required": false; "isSignal": true; }; "legendOpen": { "alias": "legendOpen"; "required": false; "isSignal": true; }; "helpOpen": { "alias": "helpOpen"; "required": false; "isSignal": true; }; "swipeActive": { "alias": "swipeActive"; "required": false; "isSignal": true; }; "searchOpen": { "alias": "searchOpen"; "required": false; "isSignal": true; }; "adminFilterOpen": { "alias": "adminFilterOpen"; "required": false; "isSignal": true; }; "parcelOpen": { "alias": "parcelOpen"; "required": false; "isSignal": true; }; "managedLayers": { "alias": "managedLayers"; "required": false; "isSignal": true; }; "searchResults": { "alias": "searchResults"; "required": false; "isSignal": true; }; "selectedParcel": { "alias": "selectedParcel"; "required": false; "isSignal": true; }; "adminCheckedKeys": { "alias": "adminCheckedKeys"; "required": false; "isSignal": true; }; "adminExpandedKeys": { "alias": "adminExpandedKeys"; "required": false; "isSignal": true; }; }, { "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"; "locateDenied": "locateDenied"; "actionClick": "actionClick"; "search": "search"; "searchReset": "searchReset"; "resultSelect": "resultSelect"; "parcelExport": "parcelExport"; "adminApply": "adminApply"; }, never, ["[geoMapShellTopRight]"], true, never>;
120
103
  }
@@ -39,12 +39,6 @@ export declare const GEO_MAP_DEFAULT_BASEMAP_OPTIONS: GeoMapBasemapOption[];
39
39
  export declare const GEO_MAP_TRAFFIC_OVERLAY: GeoMapXyzLayerConfig;
40
40
  /** Built-in toolbar actions — Figma map chrome (Dat Dai Lam Dong 2026). */
41
41
  export declare const GEO_MAP_DEFAULT_TOOLBAR_ACTIONS: GeoMapToolbarAction[];
42
- /**
43
- * Toolbar action cho định vị (UC-14) — KHÔNG có trong `GEO_MAP_DEFAULT_TOOLBAR_ACTIONS` để
44
- * không đổi giao diện các consumer hiện có (M02/M07). Ghép thêm khi cần:
45
- * `toolbarActions: [...GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, GEO_MAP_LOCATE_TOOLBAR_ACTION]`.
46
- */
47
- export declare const GEO_MAP_LOCATE_TOOLBAR_ACTION: GeoMapToolbarAction;
48
42
  /**
49
43
  * Demo thematic overlays for Storybook (offline-friendly GeoJSON).
50
44
  * Groups match portal layers popover: QHSDD · địa chính · hiện trạng.
@@ -0,0 +1,25 @@
1
+ import * as i0 from "@angular/core";
2
+ export type GeoSwitchSize = 'default' | 'small';
3
+ /**
4
+ * On/off toggle with optional trailing label.
5
+ *
6
+ * @summary Công tắc bật/tắt (nz-switch); nhãn tùy chọn bên cạnh.
7
+ * @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.
8
+ * @doNotUseWhen Lựa chọn trong form cần submit — use geo-checkbox.
9
+ */
10
+ export declare class GeoSwitchComponent {
11
+ readonly label: import("@angular/core").InputSignal<string>;
12
+ /** Two-way: `[(checked)]`. */
13
+ readonly checked: import("@angular/core").ModelSignal<boolean>;
14
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
15
+ readonly loading: import("@angular/core").InputSignal<boolean>;
16
+ readonly size: import("@angular/core").InputSignal<GeoSwitchSize>;
17
+ /** Text hiển thị trong pill khi bật. */
18
+ readonly checkedLabel: import("@angular/core").InputSignal<string>;
19
+ /** Text hiển thị trong pill khi tắt. */
20
+ readonly uncheckedLabel: import("@angular/core").InputSignal<string>;
21
+ onChange(value: boolean): void;
22
+ onLabelClick(): void;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<GeoSwitchComponent, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoSwitchComponent, "geo-switch", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "checkedLabel": { "alias": "checkedLabel"; "required": false; "isSignal": true; }; "uncheckedLabel": { "alias": "uncheckedLabel"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
25
+ }
@@ -8,15 +8,11 @@ import * as i0 from "@angular/core";
8
8
  export declare class GeoTreeComponent {
9
9
  readonly nodes: import("@angular/core").InputSignal<GeoTreeNode[]>;
10
10
  readonly checkable: import("@angular/core").InputSignal<boolean>;
11
- /** `single` — click chọn đúng 1 node (BR-06-03); `multi` — giữ hành vi checkbox hiện có. */
12
- readonly selectionMode: import("@angular/core").InputSignal<"multi" | "single">;
13
11
  readonly checkedKeys: import("@angular/core").ModelSignal<(string | number)[]>;
14
- readonly selectedKeys: import("@angular/core").ModelSignal<(string | number)[]>;
15
12
  readonly expandedKeys: import("@angular/core").ModelSignal<(string | number)[]>;
16
13
  readonly showLine: import("@angular/core").InputSignal<boolean>;
17
14
  readonly blockNode: import("@angular/core").InputSignal<boolean>;
18
15
  readonly nodeClick: import("@angular/core").OutputEmitterRef<NzFormatEmitEvent>;
19
- onNodeClick(event: NzFormatEmitEvent): void;
20
16
  static ɵfac: i0.ɵɵFactoryDeclaration<GeoTreeComponent, never>;
21
- static ɵcmp: i0.ɵɵComponentDeclaration<GeoTreeComponent, "geo-tree", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "checkable": { "alias": "checkable"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "checkedKeys": { "alias": "checkedKeys"; "required": false; "isSignal": true; }; "selectedKeys": { "alias": "selectedKeys"; "required": false; "isSignal": true; }; "expandedKeys": { "alias": "expandedKeys"; "required": false; "isSignal": true; }; "showLine": { "alias": "showLine"; "required": false; "isSignal": true; }; "blockNode": { "alias": "blockNode"; "required": false; "isSignal": true; }; }, { "checkedKeys": "checkedKeysChange"; "selectedKeys": "selectedKeysChange"; "expandedKeys": "expandedKeysChange"; "nodeClick": "nodeClick"; }, never, never, true, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoTreeComponent, "geo-tree", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "checkable": { "alias": "checkable"; "required": false; "isSignal": true; }; "checkedKeys": { "alias": "checkedKeys"; "required": false; "isSignal": true; }; "expandedKeys": { "alias": "expandedKeys"; "required": false; "isSignal": true; }; "showLine": { "alias": "showLine"; "required": false; "isSignal": true; }; "blockNode": { "alias": "blockNode"; "required": false; "isSignal": true; }; }, { "checkedKeys": "checkedKeysChange"; "expandedKeys": "expandedKeysChange"; "nodeClick": "nodeClick"; }, never, never, true, never>;
22
18
  }
@@ -6,6 +6,7 @@ export * from './geo-breadcrumb/geo-breadcrumb.types';
6
6
  export * from './geo-button/geo-button.component';
7
7
  export * from './geo-button/geo-button.types';
8
8
  export * from './geo-checkbox/geo-checkbox.component';
9
+ export * from './geo-switch/geo-switch.component';
9
10
  export * from './geo-confirm-modal/geo-confirm-modal.component';
10
11
  export * from './geo-confirm-modal/geo-confirm-modal.types';
11
12
  export * from './geo-date-picker/geo-date-picker.component';
@@ -42,6 +43,8 @@ export * from './geo-layout/header/geo-layout-header.component';
42
43
  export * from './geo-layout/footer/geo-layout-footer.component';
43
44
  export * from './geo-tabs/geo-tabs.component';
44
45
  export * from './geo-tabs/geo-tabs.types';
46
+ export * from './geo-accordion/geo-accordion.component';
47
+ export * from './geo-accordion/geo-accordion.types';
45
48
  export * from './geo-table/geo-table.component';
46
49
  export * from './geo-table/geo-table.types';
47
50
  export * from './geo-table/geo-table-filter/geo-table-filter.component';
@@ -66,6 +69,8 @@ export * from './geo-chart/geo-chart.component';
66
69
  export * from './geo-chart/geo-chart.types';
67
70
  export * from './geo-empty-state/geo-empty-state.component';
68
71
  export * from './geo-page-header/geo-page-header.component';
72
+ export * from './geo-detail-view/geo-detail-view.component';
73
+ export * from './geo-detail-view/geo-detail-view.types';
69
74
  export * from './geo-login/geo-login.component';
70
75
  export * from './geo-login/geo-login.types';
71
76
  export * from './geo-forgot-password/geo-forgot-password.component';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoit/ui",
3
- "version": "0.0.7",
3
+ "version": "0.1.0",
4
4
  "description": "GEO UI — Angular 18 + ng-zorro design system components",
5
5
  "peerDependencies": {
6
6
  "@angular/animations": "^18.2.0",