@geoit/ui 0.0.4 → 0.0.6

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 (258) hide show
  1. package/AGENTS.md +12 -8
  2. package/README.md +94 -66
  3. package/ai/AGENTS.md +106 -16
  4. package/ai/README.md +35 -1
  5. package/ai/catalog.json +2855 -275
  6. package/ai/components/geo-alert.md +3 -3
  7. package/ai/components/geo-back-button.md +2 -2
  8. package/ai/components/geo-breadcrumb.md +1 -1
  9. package/ai/components/geo-button.md +3 -3
  10. package/ai/components/geo-chart.md +115 -0
  11. package/ai/components/geo-checkbox.md +4 -6
  12. package/ai/components/geo-column-picker.md +3 -3
  13. package/ai/components/geo-confirm-modal.md +4 -5
  14. package/ai/components/geo-dashboard.md +102 -0
  15. package/ai/components/geo-date-picker.md +5 -3
  16. package/ai/components/geo-date-range-picker.md +5 -3
  17. package/ai/components/geo-empty-state.md +75 -0
  18. package/ai/components/geo-feedback-form.md +97 -0
  19. package/ai/components/geo-file-picker.md +4 -2
  20. package/ai/components/geo-forgot-password.md +81 -0
  21. package/ai/components/geo-form-modal.md +9 -10
  22. package/ai/components/geo-icon.md +3 -3
  23. package/ai/components/geo-input.md +8 -6
  24. package/ai/components/geo-layout-footer.md +70 -0
  25. package/ai/components/geo-layout-header-actions.md +82 -0
  26. package/ai/components/geo-layout-header.md +89 -0
  27. package/ai/components/geo-layout-sidebar.md +86 -0
  28. package/ai/components/geo-layout.md +155 -0
  29. package/ai/components/geo-list-page.md +75 -0
  30. package/ai/components/geo-login.md +106 -0
  31. package/ai/components/geo-map-admin-filter.md +85 -0
  32. package/ai/components/geo-map-basemap-switcher.md +79 -0
  33. package/ai/components/geo-map-help.md +72 -0
  34. package/ai/components/geo-map-layer-card.md +73 -0
  35. package/ai/components/geo-map-layer-panel.md +75 -0
  36. package/ai/components/geo-map-layers-drawer.md +78 -0
  37. package/ai/components/geo-map-legend.md +74 -0
  38. package/ai/components/geo-map-locate.md +75 -0
  39. package/ai/components/geo-map-location-chip.md +71 -0
  40. package/ai/components/geo-map-measure.md +74 -0
  41. package/ai/components/geo-map-opacity.md +75 -0
  42. package/ai/components/geo-map-parcel-popup.md +84 -0
  43. package/ai/components/geo-map-search.md +89 -0
  44. package/ai/components/geo-map-shell.md +146 -0
  45. package/ai/components/geo-map-snapshot.md +75 -0
  46. package/ai/components/geo-map-swipe.md +73 -0
  47. package/ai/components/geo-map-toolbar.md +81 -0
  48. package/ai/components/geo-map-zoom.md +74 -0
  49. package/ai/components/geo-map.md +212 -0
  50. package/ai/components/geo-overlap-result.md +88 -0
  51. package/ai/components/geo-page-header.md +72 -0
  52. package/ai/components/geo-page-title.md +1 -1
  53. package/ai/components/geo-pagination.md +4 -7
  54. package/ai/components/geo-radio.md +3 -1
  55. package/ai/components/geo-row-actions.md +3 -3
  56. package/ai/components/geo-select.md +4 -2
  57. package/ai/components/geo-slider.md +6 -8
  58. package/ai/components/geo-stat-card.md +98 -0
  59. package/ai/components/geo-status-tag.md +2 -2
  60. package/ai/components/geo-step-form-layout.md +7 -8
  61. package/ai/components/geo-stepper.md +3 -4
  62. package/ai/components/geo-table-filter.md +4 -5
  63. package/ai/components/geo-table-pagination.md +4 -7
  64. package/ai/components/geo-table-toolbar.md +7 -7
  65. package/ai/components/geo-table.md +17 -20
  66. package/ai/components/geo-tabs.md +4 -6
  67. package/ai/components/geo-textarea.md +4 -2
  68. package/ai/components/geo-toast.md +4 -4
  69. package/ai/components/geo-tree.md +4 -6
  70. package/ai/components/geo-typography.md +1 -1
  71. package/ai/components/geo-upload.md +9 -10
  72. package/ai/mockup.html +1194 -0
  73. package/ai/recipes.md +184 -85
  74. package/esm2022/lib/figma/geo-alert/geo-alert.component.mjs +19 -36
  75. package/esm2022/lib/figma/geo-back-button/geo-back-button.component.mjs +14 -24
  76. package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.component.mjs +8 -11
  77. package/esm2022/lib/figma/geo-button/geo-button.component.mjs +30 -59
  78. package/esm2022/lib/figma/geo-chart/geo-chart.component.mjs +88 -0
  79. package/esm2022/lib/figma/geo-chart/geo-chart.types.mjs +2 -0
  80. package/esm2022/lib/figma/geo-checkbox/geo-checkbox.component.mjs +11 -22
  81. package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.component.mjs +22 -54
  82. package/esm2022/lib/figma/geo-dashboard/geo-dashboard.component.mjs +49 -0
  83. package/esm2022/lib/figma/geo-dashboard/geo-dashboard.types.mjs +2 -0
  84. package/esm2022/lib/figma/geo-date-picker/geo-date-picker.component.mjs +48 -78
  85. package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.component.mjs +47 -75
  86. package/esm2022/lib/figma/geo-empty-state/geo-empty-state.component.mjs +25 -0
  87. package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.component.mjs +75 -0
  88. package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.types.mjs +2 -0
  89. package/esm2022/lib/figma/geo-file-picker/geo-file-picker.component.mjs +59 -81
  90. package/esm2022/lib/figma/geo-forgot-password/geo-forgot-password.component.mjs +51 -0
  91. package/esm2022/lib/figma/geo-form-modal/geo-form-modal.component.mjs +45 -112
  92. package/esm2022/lib/figma/geo-icon/geo-icon.component.mjs +22 -32
  93. package/esm2022/lib/figma/geo-input/geo-input.component.mjs +41 -70
  94. package/esm2022/lib/figma/geo-layout/footer/geo-layout-footer.component.mjs +18 -0
  95. package/esm2022/lib/figma/geo-layout/geo-layout-actions.directive.mjs +15 -0
  96. package/esm2022/lib/figma/geo-layout/geo-layout.component.mjs +79 -0
  97. package/esm2022/lib/figma/geo-layout/geo-layout.types.mjs +42 -0
  98. package/esm2022/lib/figma/geo-layout/header/geo-layout-header.component.mjs +60 -0
  99. package/esm2022/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.mjs +70 -0
  100. package/esm2022/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.mjs +90 -0
  101. package/esm2022/lib/figma/geo-list-page/geo-list-page.component.mjs +22 -0
  102. package/esm2022/lib/figma/geo-login/geo-login.component.mjs +58 -0
  103. package/esm2022/lib/figma/geo-login/geo-login.types.mjs +2 -0
  104. package/esm2022/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.mjs +52 -0
  105. package/esm2022/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.mjs +61 -0
  106. package/esm2022/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.mjs +26 -0
  107. package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.mjs +24 -0
  108. package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.mjs +146 -0
  109. package/esm2022/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.mjs +37 -0
  110. package/esm2022/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.mjs +30 -0
  111. package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.mjs +72 -0
  112. package/esm2022/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.mjs +21 -0
  113. package/esm2022/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.mjs +375 -0
  114. package/esm2022/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.mjs +94 -0
  115. package/esm2022/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.mjs +136 -0
  116. package/esm2022/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.mjs +182 -0
  117. package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +577 -0
  118. package/esm2022/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.mjs +93 -0
  119. package/esm2022/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.mjs +129 -0
  120. package/esm2022/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.mjs +64 -0
  121. package/esm2022/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.mjs +295 -0
  122. package/esm2022/lib/figma/geo-map/geo-map-toolbar.icons.mjs +18 -0
  123. package/esm2022/lib/figma/geo-map/geo-map.component.mjs +144 -0
  124. package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +497 -0
  125. package/esm2022/lib/figma/geo-map/geo-map.controller.mjs +71 -0
  126. package/esm2022/lib/figma/geo-map/geo-map.types.mjs +2 -0
  127. package/esm2022/lib/figma/geo-map/services/geo-map-layer.service.mjs +368 -0
  128. package/esm2022/lib/figma/geo-map/services/geo-map-projection.service.mjs +110 -0
  129. package/esm2022/lib/figma/geo-map/services/geo-map.service.mjs +540 -0
  130. package/esm2022/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.mjs +47 -0
  131. package/esm2022/lib/figma/geo-map/utils/geo-map-interactions.util.mjs +30 -0
  132. package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.component.mjs +25 -0
  133. package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.types.mjs +2 -0
  134. package/esm2022/lib/figma/geo-page-header/geo-page-header.component.mjs +23 -0
  135. package/esm2022/lib/figma/geo-page-title/geo-page-title.component.mjs +20 -35
  136. package/esm2022/lib/figma/geo-pagination/geo-pagination.component.mjs +13 -43
  137. package/esm2022/lib/figma/geo-radio/geo-radio.component.mjs +32 -52
  138. package/esm2022/lib/figma/geo-select/geo-select.component.mjs +46 -72
  139. package/esm2022/lib/figma/geo-slider/geo-slider.component.mjs +12 -28
  140. package/esm2022/lib/figma/geo-stat-card/geo-stat-card.component.mjs +163 -0
  141. package/esm2022/lib/figma/geo-stat-card/geo-stat-card.types.mjs +2 -0
  142. package/esm2022/lib/figma/geo-status-tag/geo-status-tag.component.mjs +23 -27
  143. package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.component.mjs +39 -96
  144. package/esm2022/lib/figma/geo-stepper/geo-stepper.component.mjs +18 -33
  145. package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.mjs +14 -24
  146. package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.mjs +18 -36
  147. package/esm2022/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.mjs +41 -98
  148. package/esm2022/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.mjs +40 -73
  149. package/esm2022/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.mjs +26 -56
  150. package/esm2022/lib/figma/geo-table/geo-table.component.mjs +110 -210
  151. package/esm2022/lib/figma/geo-tabs/geo-tabs.component.mjs +33 -63
  152. package/esm2022/lib/figma/geo-textarea/geo-textarea.component.mjs +28 -44
  153. package/esm2022/lib/figma/geo-toast/geo-toast.component.mjs +18 -39
  154. package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +12 -40
  155. package/esm2022/lib/figma/geo-typography/geo-typography.component.mjs +49 -64
  156. package/esm2022/lib/figma/geo-upload/geo-upload.component.mjs +50 -101
  157. package/esm2022/lib/figma/index.mjs +50 -1
  158. package/esm2022/lib/styles/tokens.mjs +56 -24
  159. package/fesm2022/geoit-ui.mjs +5981 -1825
  160. package/fesm2022/geoit-ui.mjs.map +1 -1
  161. package/lib/figma/geo-alert/geo-alert.component.d.ts +10 -11
  162. package/lib/figma/geo-back-button/geo-back-button.component.d.ts +6 -7
  163. package/lib/figma/geo-breadcrumb/geo-breadcrumb.component.d.ts +2 -2
  164. package/lib/figma/geo-button/geo-button.component.d.ts +21 -17
  165. package/lib/figma/geo-chart/geo-chart.component.d.ts +40 -0
  166. package/lib/figma/geo-chart/geo-chart.types.d.ts +13 -0
  167. package/lib/figma/geo-checkbox/geo-checkbox.component.d.ts +6 -7
  168. package/lib/figma/geo-confirm-modal/geo-confirm-modal.component.d.ts +15 -17
  169. package/lib/figma/geo-dashboard/geo-dashboard.component.d.ts +29 -0
  170. package/lib/figma/geo-dashboard/geo-dashboard.types.d.ts +7 -0
  171. package/lib/figma/geo-date-picker/geo-date-picker.component.d.ts +26 -21
  172. package/lib/figma/geo-date-range-picker/geo-date-range-picker.component.d.ts +25 -20
  173. package/lib/figma/geo-empty-state/geo-empty-state.component.d.ts +17 -0
  174. package/lib/figma/geo-feedback-form/geo-feedback-form.component.d.ts +36 -0
  175. package/lib/figma/geo-feedback-form/geo-feedback-form.types.d.ts +8 -0
  176. package/lib/figma/geo-file-picker/geo-file-picker.component.d.ts +23 -20
  177. package/lib/figma/geo-forgot-password/geo-forgot-password.component.d.ts +24 -0
  178. package/lib/figma/geo-form-modal/geo-form-modal.component.d.ts +33 -35
  179. package/lib/figma/geo-icon/geo-icon.component.d.ts +7 -7
  180. package/lib/figma/geo-input/geo-input.component.d.ts +23 -21
  181. package/lib/figma/geo-layout/footer/geo-layout-footer.component.d.ts +10 -0
  182. package/lib/figma/geo-layout/geo-layout-actions.directive.d.ts +6 -0
  183. package/lib/figma/geo-layout/geo-layout.component.d.ts +48 -0
  184. package/lib/figma/geo-layout/geo-layout.types.d.ts +44 -0
  185. package/lib/figma/geo-layout/header/geo-layout-header.component.d.ts +31 -0
  186. package/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.d.ts +32 -0
  187. package/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.d.ts +34 -0
  188. package/lib/figma/geo-list-page/geo-list-page.component.d.ts +16 -0
  189. package/lib/figma/geo-login/geo-login.component.d.ts +27 -0
  190. package/lib/figma/geo-login/geo-login.types.d.ts +6 -0
  191. package/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.d.ts +28 -0
  192. package/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.d.ts +26 -0
  193. package/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.d.ts +20 -0
  194. package/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.d.ts +15 -0
  195. package/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.d.ts +40 -0
  196. package/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.d.ts +25 -0
  197. package/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.d.ts +18 -0
  198. package/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.d.ts +24 -0
  199. package/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.d.ts +14 -0
  200. package/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.d.ts +49 -0
  201. package/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.d.ts +30 -0
  202. package/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.d.ts +44 -0
  203. package/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.d.ts +56 -0
  204. package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +103 -0
  205. package/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.d.ts +21 -0
  206. package/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.d.ts +33 -0
  207. package/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.d.ts +30 -0
  208. package/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.d.ts +67 -0
  209. package/lib/figma/geo-map/geo-map-toolbar.icons.d.ts +17 -0
  210. package/lib/figma/geo-map/geo-map.component.d.ts +53 -0
  211. package/lib/figma/geo-map/geo-map.constants.d.ts +73 -0
  212. package/lib/figma/geo-map/geo-map.controller.d.ts +49 -0
  213. package/lib/figma/geo-map/geo-map.types.d.ts +224 -0
  214. package/lib/figma/geo-map/services/geo-map-layer.service.d.ts +42 -0
  215. package/lib/figma/geo-map/services/geo-map-projection.service.d.ts +32 -0
  216. package/lib/figma/geo-map/services/geo-map.service.d.ts +99 -0
  217. package/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.d.ts +13 -0
  218. package/lib/figma/geo-map/utils/geo-map-interactions.util.d.ts +9 -0
  219. package/lib/figma/geo-overlap-result/geo-overlap-result.component.d.ts +18 -0
  220. package/lib/figma/geo-overlap-result/geo-overlap-result.types.d.ts +7 -0
  221. package/lib/figma/geo-page-header/geo-page-header.component.d.ts +16 -0
  222. package/lib/figma/geo-page-title/geo-page-title.component.d.ts +9 -9
  223. package/lib/figma/geo-pagination/geo-pagination.component.d.ts +9 -14
  224. package/lib/figma/geo-radio/geo-radio.component.d.ts +17 -15
  225. package/lib/figma/geo-select/geo-select.component.d.ts +24 -19
  226. package/lib/figma/geo-slider/geo-slider.component.d.ts +7 -9
  227. package/lib/figma/geo-stat-card/geo-stat-card.component.d.ts +50 -0
  228. package/lib/figma/geo-stat-card/geo-stat-card.types.d.ts +11 -0
  229. package/lib/figma/geo-status-tag/geo-status-tag.component.d.ts +7 -7
  230. package/lib/figma/geo-step-form-layout/geo-step-form-layout.component.d.ts +27 -29
  231. package/lib/figma/geo-stepper/geo-stepper.component.d.ts +6 -8
  232. package/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.d.ts +6 -7
  233. package/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.d.ts +11 -12
  234. package/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.d.ts +21 -28
  235. package/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.d.ts +17 -20
  236. package/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.d.ts +17 -18
  237. package/lib/figma/geo-table/geo-table.component.d.ts +58 -62
  238. package/lib/figma/geo-tabs/geo-tabs.component.d.ts +14 -17
  239. package/lib/figma/geo-textarea/geo-textarea.component.d.ts +15 -13
  240. package/lib/figma/geo-toast/geo-toast.component.d.ts +11 -12
  241. package/lib/figma/geo-tree/geo-tree.component.d.ts +8 -13
  242. package/lib/figma/geo-typography/geo-typography.component.d.ts +13 -13
  243. package/lib/figma/geo-upload/geo-upload.component.d.ts +26 -28
  244. package/lib/figma/index.d.ts +49 -0
  245. package/lib/styles/tokens.d.ts +56 -23
  246. package/package.json +4 -2
  247. package/src/lib/figma/geo-map/assets/toolbar/fullscreen.svg +8 -0
  248. package/src/lib/figma/geo-map/assets/toolbar/home.svg +3 -0
  249. package/src/lib/figma/geo-map/assets/toolbar/layers.svg +3 -0
  250. package/src/lib/figma/geo-map/assets/toolbar/measure-area.svg +12 -0
  251. package/src/lib/figma/geo-map/assets/toolbar/measure-distance.svg +5 -0
  252. package/src/lib/figma/geo-map/assets/toolbar/pan.svg +13 -0
  253. package/src/lib/figma/geo-map/assets/toolbar/search.svg +3 -0
  254. package/src/lib/figma/geo-map/assets/toolbar/zoom-in.svg +3 -0
  255. package/src/lib/figma/geo-map/assets/toolbar/zoom-out.svg +5 -0
  256. package/src/lib/styles/design-tokens.scss +108 -35
  257. package/src/lib/styles/scrollbar.scss +2 -2
  258. package/src/lib/styles/theme.scss +1 -1
package/ai/catalog.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "package": "@geoit/ui",
3
3
  "import": "@geoit/ui",
4
- "version": "0.0.4",
5
- "generatedAt": "2026-07-27T01:57:41.109Z",
4
+ "version": "0.0.6",
5
+ "generatedAt": "2026-09-03T03:52:29.749Z",
6
6
  "styles": [
7
7
  "@geoit/ui/src/lib/styles/design-tokens.scss",
8
8
  "@geoit/ui/src/lib/styles/theme.scss"
9
9
  ],
10
10
  "tokens": {
11
- "radius": "var(--geo-radius) /* 6px */",
11
+ "radius": "var(--geo-radius) /* 8px — scale: sm 6 / md 10 / lg 12 / xl 14 */",
12
12
  "primary": "var(--geo-color-primary-default)",
13
13
  "docs": "node_modules/@geoit/ui/src/lib/styles/design-tokens.scss"
14
14
  },
@@ -72,7 +72,7 @@
72
72
  "name": "visible",
73
73
  "type": "boolean",
74
74
  "default": "true",
75
- "note": ""
75
+ "note": "Two-way `model()` (supports banana binding)."
76
76
  },
77
77
  {
78
78
  "name": "showIcon",
@@ -84,7 +84,7 @@
84
84
  "outputs": [
85
85
  {
86
86
  "name": "closed",
87
- "type": "EventEmitter<void>",
87
+ "type": "OutputEmitterRef<void>",
88
88
  "note": ""
89
89
  }
90
90
  ],
@@ -152,7 +152,7 @@
152
152
  "outputs": [
153
153
  {
154
154
  "name": "clicked",
155
- "type": "EventEmitter<MouseEvent>",
155
+ "type": "OutputEmitterRef<MouseEvent>",
156
156
  "note": ""
157
157
  }
158
158
  ],
@@ -251,8 +251,8 @@
251
251
  },
252
252
  {
253
253
  "name": "icon",
254
- "type": "string",
255
- "default": "",
254
+ "type": "string | undefined",
255
+ "default": "undefined",
256
256
  "note": ""
257
257
  },
258
258
  {
@@ -313,7 +313,7 @@
313
313
  "outputs": [
314
314
  {
315
315
  "name": "clicked",
316
- "type": "EventEmitter<MouseEvent>",
316
+ "type": "OutputEmitterRef<MouseEvent>",
317
317
  "note": ""
318
318
  }
319
319
  ],
@@ -336,6 +336,104 @@
336
336
  "geo-confirm-modal"
337
337
  ]
338
338
  },
339
+ {
340
+ "name": "GeoChartComponent",
341
+ "selector": "geo-chart",
342
+ "category": "data",
343
+ "summary": "Bar / donut chart for dashboard statistics (ApexCharts).",
344
+ "whenToUse": "KPI breakdowns on dashboard pages.",
345
+ "doNotUseWhen": "Maps / spatial — use geo-map; single KPI — use geo-stat-card.",
346
+ "howTo": "Biểu đồ bar/donut cho dashboard. [data] = { label, value, color? }[]; (segmentClick) khi click lát.",
347
+ "tips": [
348
+ "Màu ưu tiên CSS var(--geo-color-*).",
349
+ "KPI đơn → geo-stat-card; ghép sẵn → geo-dashboard."
350
+ ],
351
+ "binding": "none",
352
+ "cva": false,
353
+ "path": "projects/geo-ui/src/lib/figma/geo-chart/geo-chart.component.ts",
354
+ "doc": "ai/components/geo-chart.md",
355
+ "inputs": [
356
+ {
357
+ "name": "type",
358
+ "type": "'bar' | 'donut'",
359
+ "default": "'bar'",
360
+ "note": ""
361
+ },
362
+ {
363
+ "name": "title",
364
+ "type": "string",
365
+ "default": "''",
366
+ "note": ""
367
+ },
368
+ {
369
+ "name": "data",
370
+ "type": "GeoChartDatum[]",
371
+ "default": "[]",
372
+ "note": ""
373
+ },
374
+ {
375
+ "name": "height",
376
+ "type": "number",
377
+ "default": "260",
378
+ "note": ""
379
+ },
380
+ {
381
+ "name": "showLegend",
382
+ "type": "boolean",
383
+ "default": "true",
384
+ "note": ""
385
+ },
386
+ {
387
+ "name": "showSort",
388
+ "type": "boolean",
389
+ "default": "false",
390
+ "note": ""
391
+ },
392
+ {
393
+ "name": "sort",
394
+ "type": "'none' | 'asc' | 'desc'",
395
+ "default": "'desc'",
396
+ "note": "Two-way `model()` (supports banana binding)."
397
+ },
398
+ {
399
+ "name": "emptyText",
400
+ "type": "string",
401
+ "default": "'Chưa có dữ liệu thống kê.'",
402
+ "note": ""
403
+ },
404
+ {
405
+ "name": "unit",
406
+ "type": "string",
407
+ "default": "''",
408
+ "note": ""
409
+ }
410
+ ],
411
+ "outputs": [
412
+ {
413
+ "name": "segmentClick",
414
+ "type": "OutputEmitterRef<GeoChartSegmentClick>",
415
+ "note": ""
416
+ },
417
+ {
418
+ "name": "sortChange",
419
+ "type": "OutputEmitterRef<'none' | 'asc' | 'desc'>",
420
+ "note": ""
421
+ }
422
+ ],
423
+ "examples": [
424
+ {
425
+ "title": "Bar",
426
+ "lang": "html",
427
+ "code": "<geo-chart type=\"bar\" title=\"Theo xã\" [data]=\"wardData\" [height]=\"280\"></geo-chart>"
428
+ }
429
+ ],
430
+ "example": "<geo-chart type=\"bar\" title=\"Theo xã\" [data]=\"wardData\" [height]=\"280\"></geo-chart>",
431
+ "related": [
432
+ "geo-stat-card",
433
+ "geo-dashboard",
434
+ "geo-empty-state"
435
+ ]
436
+ },
339
437
  {
340
438
  "name": "GeoCheckboxComponent",
341
439
  "selector": "geo-checkbox",
@@ -364,7 +462,7 @@
364
462
  "name": "checked",
365
463
  "type": "boolean",
366
464
  "default": "false",
367
- "note": ""
465
+ "note": "Two-way: `[(checked)]`. — Two-way `model()` (supports banana binding)."
368
466
  },
369
467
  {
370
468
  "name": "disabled",
@@ -379,13 +477,7 @@
379
477
  "note": ""
380
478
  }
381
479
  ],
382
- "outputs": [
383
- {
384
- "name": "checkedChange",
385
- "type": "EventEmitter<boolean>",
386
- "note": ""
387
- }
388
- ],
480
+ "outputs": [],
389
481
  "examples": [
390
482
  {
391
483
  "title": "Basic",
@@ -442,15 +534,15 @@
442
534
  },
443
535
  {
444
536
  "name": "storageKey",
445
- "type": "string",
446
- "default": "",
537
+ "type": "string | undefined",
538
+ "default": "undefined",
447
539
  "note": "Lưu trạng thái ẩn/hiện cột theo session khi người dùng áp dụng"
448
540
  }
449
541
  ],
450
542
  "outputs": [
451
543
  {
452
544
  "name": "apply",
453
- "type": "EventEmitter<GeoColumnPickerApplyPayload>",
545
+ "type": "OutputEmitterRef<GeoColumnPickerApplyPayload>",
454
546
  "note": ""
455
547
  }
456
548
  ],
@@ -494,7 +586,7 @@
494
586
  "name": "visible",
495
587
  "type": "boolean",
496
588
  "default": "false",
497
- "note": ""
589
+ "note": "Two-way `model()` (supports banana binding)."
498
590
  },
499
591
  {
500
592
  "name": "title",
@@ -558,19 +650,14 @@
558
650
  }
559
651
  ],
560
652
  "outputs": [
561
- {
562
- "name": "visibleChange",
563
- "type": "EventEmitter<boolean>",
564
- "note": ""
565
- },
566
653
  {
567
654
  "name": "confirm",
568
- "type": "EventEmitter<void>",
655
+ "type": "OutputEmitterRef<void>",
569
656
  "note": ""
570
657
  },
571
658
  {
572
659
  "name": "cancel",
573
- "type": "EventEmitter<void>",
660
+ "type": "OutputEmitterRef<void>",
574
661
  "note": ""
575
662
  }
576
663
  ],
@@ -593,6 +680,108 @@
593
680
  "geo-toast"
594
681
  ]
595
682
  },
683
+ {
684
+ "name": "GeoDashboardComponent",
685
+ "selector": "geo-dashboard",
686
+ "category": "layout",
687
+ "summary": "Composed dashboard: period, KPI cards, ward/mismatch charts.",
688
+ "whenToUse": "TCQH overview pages (thống kê nhanh).",
689
+ "doNotUseWhen": "Custom layouts — compose geo-stat-card + geo-chart yourself.",
690
+ "howTo": "Dashboard ghép sẵn: stats + biểu đồ xã + lệch kỳ. [(period)] điều khiển kỳ thống kê.",
691
+ "tips": [
692
+ "Tự layout → geo-stat-card + geo-chart."
693
+ ],
694
+ "binding": "none",
695
+ "cva": false,
696
+ "path": "projects/geo-ui/src/lib/figma/geo-dashboard/geo-dashboard.component.ts",
697
+ "doc": "ai/components/geo-dashboard.md",
698
+ "inputs": [
699
+ {
700
+ "name": "title",
701
+ "type": "string",
702
+ "default": "'Dashboard thống kê'",
703
+ "note": ""
704
+ },
705
+ {
706
+ "name": "breadcrumb",
707
+ "type": "GeoBreadcrumbItem[]",
708
+ "default": "[ { label: 'Trang chủ', link: '/' }, { label: 'Dashboard' }, ]",
709
+ "note": ""
710
+ },
711
+ {
712
+ "name": "stats",
713
+ "type": "GeoStatCardItem[]",
714
+ "default": "[]",
715
+ "note": ""
716
+ },
717
+ {
718
+ "name": "wardChartTitle",
719
+ "type": "string",
720
+ "default": "'Diện tích quy hoạch theo phường/xã'",
721
+ "note": ""
722
+ },
723
+ {
724
+ "name": "wardData",
725
+ "type": "GeoChartDatum[]",
726
+ "default": "[]",
727
+ "note": ""
728
+ },
729
+ {
730
+ "name": "mismatchChartTitle",
731
+ "type": "string",
732
+ "default": "'Tỷ lệ thửa quy hoạch khác mục đích hiện trạng'",
733
+ "note": ""
734
+ },
735
+ {
736
+ "name": "mismatchData",
737
+ "type": "GeoChartDatum[]",
738
+ "default": "[]",
739
+ "note": ""
740
+ },
741
+ {
742
+ "name": "wardUnit",
743
+ "type": "string",
744
+ "default": "'ha'",
745
+ "note": ""
746
+ },
747
+ {
748
+ "name": "period",
749
+ "type": "GeoDateRangeValue",
750
+ "default": "null",
751
+ "note": "Two-way `model()` (supports banana binding)."
752
+ }
753
+ ],
754
+ "outputs": [
755
+ {
756
+ "name": "periodChange",
757
+ "type": "OutputEmitterRef<GeoDateRangeValue>",
758
+ "note": ""
759
+ },
760
+ {
761
+ "name": "mismatchSegmentClick",
762
+ "type": "OutputEmitterRef<GeoChartSegmentClick>",
763
+ "note": ""
764
+ },
765
+ {
766
+ "name": "wardSegmentClick",
767
+ "type": "OutputEmitterRef<GeoChartSegmentClick>",
768
+ "note": ""
769
+ }
770
+ ],
771
+ "examples": [
772
+ {
773
+ "title": "Basic",
774
+ "lang": "html",
775
+ "code": "<geo-dashboard [stats]=\"stats\" [wardData]=\"wards\" [mismatchData]=\"mismatch\" [(period)]=\"period\"></geo-dashboard>"
776
+ }
777
+ ],
778
+ "example": "<geo-dashboard [stats]=\"stats\" [wardData]=\"wards\" [mismatchData]=\"mismatch\" [(period)]=\"period\"></geo-dashboard>",
779
+ "related": [
780
+ "geo-stat-card",
781
+ "geo-chart",
782
+ "geo-page-header"
783
+ ]
784
+ },
596
785
  {
597
786
  "name": "GeoDatePickerComponent",
598
787
  "selector": "geo-date-picker",
@@ -691,21 +880,21 @@
691
880
  },
692
881
  {
693
882
  "name": "width",
694
- "type": "number | string",
695
- "default": "",
883
+ "type": "number | string | undefined",
884
+ "default": "undefined",
696
885
  "note": ""
697
886
  },
698
887
  {
699
888
  "name": "disabledDate",
700
- "type": "(current: Date)",
701
- "default": "> boolean",
889
+ "type": "((current: Date) => boolean) | undefined",
890
+ "default": "undefined",
702
891
  "note": ""
703
892
  }
704
893
  ],
705
894
  "outputs": [
706
895
  {
707
896
  "name": "valueChange",
708
- "type": "EventEmitter<Date | null>",
897
+ "type": "OutputEmitterRef<Date | null>",
709
898
  "note": ""
710
899
  }
711
900
  ],
@@ -814,14 +1003,14 @@
814
1003
  },
815
1004
  {
816
1005
  "name": "width",
817
- "type": "number | string",
818
- "default": "",
1006
+ "type": "number | string | undefined",
1007
+ "default": "undefined",
819
1008
  "note": ""
820
1009
  },
821
1010
  {
822
1011
  "name": "disabledDate",
823
- "type": "(current: Date)",
824
- "default": "> boolean",
1012
+ "type": "((current: Date) => boolean) | undefined",
1013
+ "default": "undefined",
825
1014
  "note": ""
826
1015
  },
827
1016
  {
@@ -834,7 +1023,7 @@
834
1023
  "outputs": [
835
1024
  {
836
1025
  "name": "valueChange",
837
- "type": "EventEmitter<[Date, Date] | null>",
1026
+ "type": "OutputEmitterRef<[Date, Date] | null>",
838
1027
  "note": ""
839
1028
  }
840
1029
  ],
@@ -856,6 +1045,159 @@
856
1045
  "geo-table-filter"
857
1046
  ]
858
1047
  },
1048
+ {
1049
+ "name": "GeoEmptyStateComponent",
1050
+ "selector": "geo-empty-state",
1051
+ "category": "feedback",
1052
+ "summary": "Empty region placeholder (icon + title + optional action).",
1053
+ "whenToUse": "No data / no results areas inside pages or cards.",
1054
+ "doNotUseWhen": "Inline form validation — use field errorMessage / geo-alert.",
1055
+ "howTo": "",
1056
+ "tips": [],
1057
+ "binding": "none",
1058
+ "cva": false,
1059
+ "path": "projects/geo-ui/src/lib/figma/geo-empty-state/geo-empty-state.component.ts",
1060
+ "doc": "ai/components/geo-empty-state.md",
1061
+ "inputs": [
1062
+ {
1063
+ "name": "title",
1064
+ "type": "string",
1065
+ "default": "'Không có dữ liệu'",
1066
+ "note": ""
1067
+ },
1068
+ {
1069
+ "name": "description",
1070
+ "type": "string",
1071
+ "default": "''",
1072
+ "note": ""
1073
+ },
1074
+ {
1075
+ "name": "icon",
1076
+ "type": "string",
1077
+ "default": "'inbox'",
1078
+ "note": ""
1079
+ },
1080
+ {
1081
+ "name": "actionLabel",
1082
+ "type": "string",
1083
+ "default": "''",
1084
+ "note": ""
1085
+ }
1086
+ ],
1087
+ "outputs": [
1088
+ {
1089
+ "name": "actionClick",
1090
+ "type": "OutputEmitterRef<void>",
1091
+ "note": ""
1092
+ }
1093
+ ],
1094
+ "examples": [
1095
+ {
1096
+ "title": "Example",
1097
+ "lang": "html",
1098
+ "code": "<geo-empty-state title=\"Chưa có dữ liệu\" description=\"Thử đổi bộ lọc.\"></geo-empty-state>"
1099
+ }
1100
+ ],
1101
+ "example": "<geo-empty-state title=\"Chưa có dữ liệu\" description=\"Thử đổi bộ lọc.\"></geo-empty-state>",
1102
+ "related": []
1103
+ },
1104
+ {
1105
+ "name": "GeoFeedbackFormComponent",
1106
+ "selector": "geo-feedback-form",
1107
+ "category": "forms",
1108
+ "summary": "Citizen feedback / phản ánh form with validation.",
1109
+ "whenToUse": "Public feedback submission pages.",
1110
+ "doNotUseWhen": "Admin feedback inbox — use geo-list-page + geo-table.",
1111
+ "howTo": "",
1112
+ "tips": [],
1113
+ "binding": "none",
1114
+ "cva": false,
1115
+ "path": "projects/geo-ui/src/lib/figma/geo-feedback-form/geo-feedback-form.component.ts",
1116
+ "doc": "ai/components/geo-feedback-form.md",
1117
+ "inputs": [
1118
+ {
1119
+ "name": "title",
1120
+ "type": "string",
1121
+ "default": "'Gửi phản ánh, kiến nghị'",
1122
+ "note": ""
1123
+ },
1124
+ {
1125
+ "name": "description",
1126
+ "type": "string",
1127
+ "default": "'Nội dung sẽ được chuyển tới cán bộ xử lý. Vui lòng mô tả rõ vấn đề và vị trí (nếu có).'",
1128
+ "note": "Mô tả ngắn dưới tiêu đề — giúp người dân hiểu quy trình xử lý."
1129
+ },
1130
+ {
1131
+ "name": "maxLength",
1132
+ "type": "number",
1133
+ "default": "1000",
1134
+ "note": ""
1135
+ },
1136
+ {
1137
+ "name": "loading",
1138
+ "type": "boolean",
1139
+ "default": "false",
1140
+ "note": ""
1141
+ },
1142
+ {
1143
+ "name": "showCancel",
1144
+ "type": "boolean",
1145
+ "default": "true",
1146
+ "note": "Ẩn nút Hủy khi form dùng trên trang riêng (không phải dialog)."
1147
+ },
1148
+ {
1149
+ "name": "fill",
1150
+ "type": "boolean",
1151
+ "default": "false",
1152
+ "note": "Form chiếm hết chiều rộng/cao vùng chứa (trang full content)."
1153
+ },
1154
+ {
1155
+ "name": "submitLabel",
1156
+ "type": "string",
1157
+ "default": "'Gửi phản ánh'",
1158
+ "note": ""
1159
+ },
1160
+ {
1161
+ "name": "cancelLabel",
1162
+ "type": "string",
1163
+ "default": "'Hủy'",
1164
+ "note": ""
1165
+ },
1166
+ {
1167
+ "name": "senderName",
1168
+ "type": "string",
1169
+ "default": "''",
1170
+ "note": "Two-way `model()` (supports banana binding)."
1171
+ },
1172
+ {
1173
+ "name": "content",
1174
+ "type": "string",
1175
+ "default": "''",
1176
+ "note": "Two-way `model()` (supports banana binding)."
1177
+ }
1178
+ ],
1179
+ "outputs": [
1180
+ {
1181
+ "name": "submittedFeedback",
1182
+ "type": "OutputEmitterRef<GeoFeedbackPayload>",
1183
+ "note": ""
1184
+ },
1185
+ {
1186
+ "name": "cancelled",
1187
+ "type": "OutputEmitterRef<void>",
1188
+ "note": ""
1189
+ }
1190
+ ],
1191
+ "examples": [
1192
+ {
1193
+ "title": "Example",
1194
+ "lang": "html",
1195
+ "code": "<geo-feedback-form (submittedFeedback)=\"send($event)\"></geo-feedback-form>"
1196
+ }
1197
+ ],
1198
+ "example": "<geo-feedback-form (submittedFeedback)=\"send($event)\"></geo-feedback-form>",
1199
+ "related": []
1200
+ },
859
1201
  {
860
1202
  "name": "GeoFilePickerComponent",
861
1203
  "selector": "geo-file-picker",
@@ -936,8 +1278,8 @@
936
1278
  },
937
1279
  {
938
1280
  "name": "width",
939
- "type": "number | string",
940
- "default": "",
1281
+ "type": "number | string | undefined",
1282
+ "default": "undefined",
941
1283
  "note": ""
942
1284
  },
943
1285
  {
@@ -950,7 +1292,7 @@
950
1292
  "outputs": [
951
1293
  {
952
1294
  "name": "fileChange",
953
- "type": "EventEmitter<File | File[] | null>",
1295
+ "type": "OutputEmitterRef<File | File[] | null>",
954
1296
  "note": ""
955
1297
  }
956
1298
  ],
@@ -973,6 +1315,79 @@
973
1315
  "geo-input"
974
1316
  ]
975
1317
  },
1318
+ {
1319
+ "name": "GeoForgotPasswordComponent",
1320
+ "selector": "geo-forgot-password",
1321
+ "category": "forms",
1322
+ "summary": "Forgot-password form (email + submit / back to login).",
1323
+ "whenToUse": "Password reset entry page.",
1324
+ "doNotUseWhen": "Inside login card — navigate to a dedicated route.",
1325
+ "howTo": "",
1326
+ "tips": [],
1327
+ "binding": "none",
1328
+ "cva": false,
1329
+ "path": "projects/geo-ui/src/lib/figma/geo-forgot-password/geo-forgot-password.component.ts",
1330
+ "doc": "ai/components/geo-forgot-password.md",
1331
+ "inputs": [
1332
+ {
1333
+ "name": "title",
1334
+ "type": "string",
1335
+ "default": "'Quên mật khẩu'",
1336
+ "note": ""
1337
+ },
1338
+ {
1339
+ "name": "subtitle",
1340
+ "type": "string",
1341
+ "default": "'Nhập email đã đăng ký để nhận mật khẩu mới.'",
1342
+ "note": ""
1343
+ },
1344
+ {
1345
+ "name": "loading",
1346
+ "type": "boolean",
1347
+ "default": "false",
1348
+ "note": ""
1349
+ },
1350
+ {
1351
+ "name": "errorMessage",
1352
+ "type": "string",
1353
+ "default": "''",
1354
+ "note": ""
1355
+ },
1356
+ {
1357
+ "name": "successMessage",
1358
+ "type": "string",
1359
+ "default": "''",
1360
+ "note": ""
1361
+ },
1362
+ {
1363
+ "name": "email",
1364
+ "type": "string",
1365
+ "default": "''",
1366
+ "note": "Two-way `model()` (supports banana binding)."
1367
+ }
1368
+ ],
1369
+ "outputs": [
1370
+ {
1371
+ "name": "submitEmail",
1372
+ "type": "OutputEmitterRef<string>",
1373
+ "note": ""
1374
+ },
1375
+ {
1376
+ "name": "backToLogin",
1377
+ "type": "OutputEmitterRef<void>",
1378
+ "note": ""
1379
+ }
1380
+ ],
1381
+ "examples": [
1382
+ {
1383
+ "title": "Example",
1384
+ "lang": "html",
1385
+ "code": "<geo-forgot-password\n (submitEmail)=\"reset($event)\"\n (backToLogin)=\"goLogin()\"\n></geo-forgot-password>"
1386
+ }
1387
+ ],
1388
+ "example": "<geo-forgot-password\n (submitEmail)=\"reset($event)\"\n (backToLogin)=\"goLogin()\"\n></geo-forgot-password>",
1389
+ "related": []
1390
+ },
976
1391
  {
977
1392
  "name": "GeoFormModalComponent",
978
1393
  "selector": "geo-form-modal",
@@ -995,7 +1410,7 @@
995
1410
  "name": "open",
996
1411
  "type": "boolean",
997
1412
  "default": "false",
998
- "note": "Tương đương `open` (antd) / `nzVisible` (ng-zorro)."
1413
+ "note": "Tương đương `open` (antd) / `nzVisible` (ng-zorro). — Two-way `model()` (supports banana binding)."
999
1414
  },
1000
1415
  {
1001
1416
  "name": "title",
@@ -1023,8 +1438,8 @@
1023
1438
  },
1024
1439
  {
1025
1440
  "name": "cancelIcon",
1026
- "type": "string",
1027
- "default": "",
1441
+ "type": "string | undefined",
1442
+ "default": "undefined",
1028
1443
  "note": "Icon nút cancel (vd. `left` cho Quay lại)."
1029
1444
  },
1030
1445
  {
@@ -1035,8 +1450,8 @@
1035
1450
  },
1036
1451
  {
1037
1452
  "name": "okIcon",
1038
- "type": "string",
1039
- "default": "",
1453
+ "type": "string | undefined",
1454
+ "default": "undefined",
1040
1455
  "note": "Icon nút OK (vd. `right` cho Tiếp theo)."
1041
1456
  },
1042
1457
  {
@@ -1137,34 +1552,29 @@
1137
1552
  }
1138
1553
  ],
1139
1554
  "outputs": [
1140
- {
1141
- "name": "openChange",
1142
- "type": "EventEmitter<boolean>",
1143
- "note": ""
1144
- },
1145
1555
  {
1146
1556
  "name": "ok",
1147
- "type": "EventEmitter<void>",
1557
+ "type": "OutputEmitterRef<void>",
1148
1558
  "note": ""
1149
1559
  },
1150
1560
  {
1151
1561
  "name": "secondaryOk",
1152
- "type": "EventEmitter<void>",
1562
+ "type": "OutputEmitterRef<void>",
1153
1563
  "note": ""
1154
1564
  },
1155
1565
  {
1156
1566
  "name": "cancel",
1157
- "type": "EventEmitter<void>",
1567
+ "type": "OutputEmitterRef<void>",
1158
1568
  "note": ""
1159
1569
  },
1160
1570
  {
1161
1571
  "name": "afterOpen",
1162
- "type": "EventEmitter<void>",
1572
+ "type": "OutputEmitterRef<void>",
1163
1573
  "note": ""
1164
1574
  },
1165
1575
  {
1166
1576
  "name": "afterClose",
1167
- "type": "EventEmitter<void>",
1577
+ "type": "OutputEmitterRef<void>",
1168
1578
  "note": ""
1169
1579
  }
1170
1580
  ],
@@ -1209,7 +1619,7 @@
1209
1619
  "inputs": [
1210
1620
  {
1211
1621
  "name": "type",
1212
- "type": "",
1622
+ "type": "string",
1213
1623
  "default": "",
1214
1624
  "note": "Tên icon Ant Design (vd. `close`, `search`, `appstore`)."
1215
1625
  },
@@ -1233,8 +1643,8 @@
1233
1643
  },
1234
1644
  {
1235
1645
  "name": "color",
1236
- "type": "string",
1237
- "default": "",
1646
+ "type": "string | undefined",
1647
+ "default": "undefined",
1238
1648
  "note": "CSS color — ưu tiên design token, vd. `var(--geo-color-primary-default)`"
1239
1649
  }
1240
1650
  ],
@@ -1312,84 +1722,2245 @@
1312
1722
  "note": ""
1313
1723
  },
1314
1724
  {
1315
- "name": "error",
1316
- "type": "boolean",
1317
- "default": "false",
1318
- "note": ""
1319
- },
1725
+ "name": "error",
1726
+ "type": "boolean",
1727
+ "default": "false",
1728
+ "note": ""
1729
+ },
1730
+ {
1731
+ "name": "errorMessage",
1732
+ "type": "string",
1733
+ "default": "''",
1734
+ "note": ""
1735
+ },
1736
+ {
1737
+ "name": "maxlength",
1738
+ "type": "number | undefined",
1739
+ "default": "undefined",
1740
+ "note": ""
1741
+ },
1742
+ {
1743
+ "name": "prefixIcon",
1744
+ "type": "string | undefined",
1745
+ "default": "undefined",
1746
+ "note": ""
1747
+ },
1748
+ {
1749
+ "name": "suffixIcon",
1750
+ "type": "string | undefined",
1751
+ "default": "undefined",
1752
+ "note": ""
1753
+ },
1754
+ {
1755
+ "name": "allowClear",
1756
+ "type": "boolean",
1757
+ "default": "false",
1758
+ "note": ""
1759
+ },
1760
+ {
1761
+ "name": "block",
1762
+ "type": "boolean",
1763
+ "default": "false",
1764
+ "note": ""
1765
+ },
1766
+ {
1767
+ "name": "width",
1768
+ "type": "number | string | undefined",
1769
+ "default": "undefined",
1770
+ "note": ""
1771
+ }
1772
+ ],
1773
+ "outputs": [
1774
+ {
1775
+ "name": "valueChange",
1776
+ "type": "OutputEmitterRef<string>",
1777
+ "note": ""
1778
+ },
1779
+ {
1780
+ "name": "enterPressed",
1781
+ "type": "OutputEmitterRef<void>",
1782
+ "note": ""
1783
+ }
1784
+ ],
1785
+ "examples": [
1786
+ {
1787
+ "title": "Basic",
1788
+ "lang": "html",
1789
+ "code": "<geo-input label=\"Họ tên\" [required]=\"true\" [block]=\"true\" [(ngModel)]=\"name\"></geo-input>"
1790
+ },
1791
+ {
1792
+ "title": "Full options",
1793
+ "lang": "html",
1794
+ "code": "<geo-input\n label=\"Mã hồ sơ\"\n placeholder=\"Nhập mã hồ sơ\"\n type=\"text\"\n prefixIcon=\"search\"\n [allowClear]=\"true\"\n [required]=\"true\"\n [block]=\"true\"\n [maxlength]=\"50\"\n [error]=\"codeError\"\n errorMessage=\"Mã không được để trống\"\n [(ngModel)]=\"code\"\n (enterPressed)=\"onSearch()\"\n (valueChange)=\"onCode($event)\"\n></geo-input>"
1795
+ }
1796
+ ],
1797
+ "example": "<geo-input label=\"Họ tên\" [required]=\"true\" [block]=\"true\" [(ngModel)]=\"name\"></geo-input>",
1798
+ "related": [
1799
+ "geo-textarea",
1800
+ "geo-select",
1801
+ "geo-form-modal"
1802
+ ]
1803
+ },
1804
+ {
1805
+ "name": "GeoLayoutComponent",
1806
+ "selector": "geo-layout",
1807
+ "category": "layout",
1808
+ "summary": "App shell composing sidebar + header + content + footer.",
1809
+ "whenToUse": "Host application chrome mirroring layout/feature MainLayout.",
1810
+ "doNotUseWhen": "In-page wizards — use geo-step-form-layout; dialogs — use geo-form-modal.",
1811
+ "howTo": "",
1812
+ "tips": [],
1813
+ "binding": "none",
1814
+ "cva": false,
1815
+ "path": "projects/geo-ui/src/lib/figma/geo-layout/geo-layout.component.ts",
1816
+ "doc": "ai/components/geo-layout.md",
1817
+ "inputs": [
1818
+ {
1819
+ "name": "menuItems",
1820
+ "type": "GeoLayoutMenuItem[]",
1821
+ "default": "[]",
1822
+ "note": ""
1823
+ },
1824
+ {
1825
+ "name": "brandTitle",
1826
+ "type": "string",
1827
+ "default": "'iLIS'",
1828
+ "note": ""
1829
+ },
1830
+ {
1831
+ "name": "logoSrc",
1832
+ "type": "string",
1833
+ "default": "''",
1834
+ "note": ""
1835
+ },
1836
+ {
1837
+ "name": "logoAlt",
1838
+ "type": "string",
1839
+ "default": "'Logo'",
1840
+ "note": ""
1841
+ },
1842
+ {
1843
+ "name": "sidebarBackgroundSrc",
1844
+ "type": "string",
1845
+ "default": "''",
1846
+ "note": ""
1847
+ },
1848
+ {
1849
+ "name": "breadcrumbs",
1850
+ "type": "GeoBreadcrumbItem[]",
1851
+ "default": "[]",
1852
+ "note": ""
1853
+ },
1854
+ {
1855
+ "name": "fallbackBreadcrumb",
1856
+ "type": "string",
1857
+ "default": "'Hệ thống thông tin đất đai - VNPT iLIS'",
1858
+ "note": ""
1859
+ },
1860
+ {
1861
+ "name": "expanded",
1862
+ "type": "boolean",
1863
+ "default": "true",
1864
+ "note": "Two-way `model()` (supports banana binding)."
1865
+ },
1866
+ {
1867
+ "name": "isMobile",
1868
+ "type": "boolean",
1869
+ "default": "false",
1870
+ "note": ""
1871
+ },
1872
+ {
1873
+ "name": "mobileMenuOpen",
1874
+ "type": "boolean",
1875
+ "default": "false",
1876
+ "note": "Two-way `model()` (supports banana binding)."
1877
+ },
1878
+ {
1879
+ "name": "selectedKey",
1880
+ "type": "string | null",
1881
+ "default": "null",
1882
+ "note": "Two-way `model()` (supports banana binding)."
1883
+ },
1884
+ {
1885
+ "name": "siderWidth",
1886
+ "type": "number | string",
1887
+ "default": "280",
1888
+ "note": ""
1889
+ },
1890
+ {
1891
+ "name": "siderCollapsedWidth",
1892
+ "type": "number | string",
1893
+ "default": "80",
1894
+ "note": ""
1895
+ },
1896
+ {
1897
+ "name": "showDefaultActions",
1898
+ "type": "boolean",
1899
+ "default": "true",
1900
+ "note": ""
1901
+ },
1902
+ {
1903
+ "name": "showFooter",
1904
+ "type": "boolean",
1905
+ "default": "true",
1906
+ "note": ""
1907
+ },
1908
+ {
1909
+ "name": "footerText",
1910
+ "type": "string",
1911
+ "default": "'© VNPT | Hệ thống thông tin đất đai iLIS'",
1912
+ "note": ""
1913
+ },
1914
+ {
1915
+ "name": "user",
1916
+ "type": "GeoLayoutUserInfo",
1917
+ "default": "GEO_LAYOUT_DEFAULT_USER",
1918
+ "note": ""
1919
+ },
1920
+ {
1921
+ "name": "notifications",
1922
+ "type": "GeoLayoutNotificationItem[]",
1923
+ "default": "GEO_LAYOUT_DEFAULT_NOTIFICATIONS",
1924
+ "note": ""
1925
+ },
1926
+ {
1927
+ "name": "subsystems",
1928
+ "type": "GeoLayoutSubsystemItem[]",
1929
+ "default": "GEO_LAYOUT_DEFAULT_SUBSYSTEMS",
1930
+ "note": ""
1931
+ },
1932
+ {
1933
+ "name": "userMenuItems",
1934
+ "type": "GeoLayoutUserMenuItem[]",
1935
+ "default": "GEO_LAYOUT_DEFAULT_USER_MENU",
1936
+ "note": ""
1937
+ }
1938
+ ],
1939
+ "outputs": [
1940
+ {
1941
+ "name": "menuSelect",
1942
+ "type": "OutputEmitterRef<GeoLayoutMenuItem>",
1943
+ "note": ""
1944
+ },
1945
+ {
1946
+ "name": "sidebarToggle",
1947
+ "type": "OutputEmitterRef<void>",
1948
+ "note": ""
1949
+ },
1950
+ {
1951
+ "name": "notificationClick",
1952
+ "type": "OutputEmitterRef<GeoLayoutNotificationItem>",
1953
+ "note": ""
1954
+ },
1955
+ {
1956
+ "name": "subsystemClick",
1957
+ "type": "OutputEmitterRef<GeoLayoutSubsystemItem>",
1958
+ "note": ""
1959
+ },
1960
+ {
1961
+ "name": "userMenuClick",
1962
+ "type": "OutputEmitterRef<GeoLayoutUserMenuItem>",
1963
+ "note": ""
1964
+ },
1965
+ {
1966
+ "name": "logout",
1967
+ "type": "OutputEmitterRef<void>",
1968
+ "note": ""
1969
+ }
1970
+ ],
1971
+ "examples": [
1972
+ {
1973
+ "title": "Example",
1974
+ "lang": "html",
1975
+ "code": "<geo-layout\n [menuItems]=\"menu\"\n [(expanded)]=\"expanded\"\n [breadcrumbs]=\"crumbs\"\n [(selectedKey)]=\"active\"\n [user]=\"{ name: 'vnpt', email: 'vnpt@vnpt.vn' }\"\n (menuSelect)=\"onNav($event)\"\n (logout)=\"onLogout()\"\n>\n <router-outlet />\n</geo-layout>"
1976
+ }
1977
+ ],
1978
+ "example": "<geo-layout\n [menuItems]=\"menu\"\n [(expanded)]=\"expanded\"\n [breadcrumbs]=\"crumbs\"\n [(selectedKey)]=\"active\"\n [user]=\"{ name: 'vnpt', email: 'vnpt@vnpt.vn' }\"\n (menuSelect)=\"onNav($event)\"\n (logout)=\"onLogout()\"\n>\n <router-outlet />\n</geo-layout>",
1979
+ "related": []
1980
+ },
1981
+ {
1982
+ "name": "GeoLayoutFooterComponent",
1983
+ "selector": "geo-layout-footer",
1984
+ "category": "layout",
1985
+ "summary": "Minimal layout footer with copyright text + content slot.",
1986
+ "whenToUse": "Bottom chrome inside geo-layout or custom shells.",
1987
+ "doNotUseWhen": "Marketing page footers with heavy links/nav.",
1988
+ "howTo": "",
1989
+ "tips": [],
1990
+ "binding": "none",
1991
+ "cva": false,
1992
+ "path": "projects/geo-ui/src/lib/figma/geo-layout/footer/geo-layout-footer.component.ts",
1993
+ "doc": "ai/components/geo-layout-footer.md",
1994
+ "inputs": [
1995
+ {
1996
+ "name": "text",
1997
+ "type": "string",
1998
+ "default": "'© VNPT | Hệ thống thông tin đất đai iLIS'",
1999
+ "note": "Copyright / status text. Empty = use default."
2000
+ }
2001
+ ],
2002
+ "outputs": [],
2003
+ "examples": [
2004
+ {
2005
+ "title": "Example",
2006
+ "lang": "html",
2007
+ "code": "<geo-layout-footer text=\"© VNPT | iLIS\"></geo-layout-footer>"
2008
+ }
2009
+ ],
2010
+ "example": "<geo-layout-footer text=\"© VNPT | iLIS\"></geo-layout-footer>",
2011
+ "related": []
2012
+ },
2013
+ {
2014
+ "name": "GeoLayoutHeaderComponent",
2015
+ "selector": "geo-layout-header",
2016
+ "category": "layout",
2017
+ "summary": "Soft top bar: toggle + breadcrumb + user/notification actions.",
2018
+ "whenToUse": "Standalone top bar, or inside geo-layout.",
2019
+ "doNotUseWhen": "Full app chrome — use geo-layout.",
2020
+ "howTo": "",
2021
+ "tips": [],
2022
+ "binding": "none",
2023
+ "cva": false,
2024
+ "path": "projects/geo-ui/src/lib/figma/geo-layout/header/geo-layout-header.component.ts",
2025
+ "doc": "ai/components/geo-layout-header.md",
2026
+ "inputs": [
2027
+ {
2028
+ "name": "breadcrumbs",
2029
+ "type": "GeoBreadcrumbItem[]",
2030
+ "default": "[]",
2031
+ "note": ""
2032
+ },
2033
+ {
2034
+ "name": "fallbackBreadcrumb",
2035
+ "type": "string",
2036
+ "default": "'Hệ thống thông tin đất đai - VNPT iLIS'",
2037
+ "note": ""
2038
+ },
2039
+ {
2040
+ "name": "expanded",
2041
+ "type": "boolean",
2042
+ "default": "true",
2043
+ "note": ""
2044
+ },
2045
+ {
2046
+ "name": "isMobile",
2047
+ "type": "boolean",
2048
+ "default": "false",
2049
+ "note": ""
2050
+ },
2051
+ {
2052
+ "name": "mobileMenuOpen",
2053
+ "type": "boolean",
2054
+ "default": "false",
2055
+ "note": ""
2056
+ },
2057
+ {
2058
+ "name": "showDefaultActions",
2059
+ "type": "boolean",
2060
+ "default": "true",
2061
+ "note": ""
2062
+ },
2063
+ {
2064
+ "name": "user",
2065
+ "type": "GeoLayoutUserInfo",
2066
+ "default": "GEO_LAYOUT_DEFAULT_USER",
2067
+ "note": ""
2068
+ },
2069
+ {
2070
+ "name": "notifications",
2071
+ "type": "GeoLayoutNotificationItem[]",
2072
+ "default": "GEO_LAYOUT_DEFAULT_NOTIFICATIONS",
2073
+ "note": ""
2074
+ },
2075
+ {
2076
+ "name": "subsystems",
2077
+ "type": "GeoLayoutSubsystemItem[]",
2078
+ "default": "GEO_LAYOUT_DEFAULT_SUBSYSTEMS",
2079
+ "note": ""
2080
+ },
2081
+ {
2082
+ "name": "userMenuItems",
2083
+ "type": "GeoLayoutUserMenuItem[]",
2084
+ "default": "GEO_LAYOUT_DEFAULT_USER_MENU",
2085
+ "note": ""
2086
+ }
2087
+ ],
2088
+ "outputs": [
2089
+ {
2090
+ "name": "sidebarToggle",
2091
+ "type": "OutputEmitterRef<void>",
2092
+ "note": ""
2093
+ },
2094
+ {
2095
+ "name": "notificationClick",
2096
+ "type": "OutputEmitterRef<GeoLayoutNotificationItem>",
2097
+ "note": ""
2098
+ },
2099
+ {
2100
+ "name": "subsystemClick",
2101
+ "type": "OutputEmitterRef<GeoLayoutSubsystemItem>",
2102
+ "note": ""
2103
+ },
2104
+ {
2105
+ "name": "userMenuClick",
2106
+ "type": "OutputEmitterRef<GeoLayoutUserMenuItem>",
2107
+ "note": ""
2108
+ },
2109
+ {
2110
+ "name": "logout",
2111
+ "type": "OutputEmitterRef<void>",
2112
+ "note": ""
2113
+ }
2114
+ ],
2115
+ "examples": [
2116
+ {
2117
+ "title": "Example",
2118
+ "lang": "html",
2119
+ "code": "<geo-layout-header\n [breadcrumbs]=\"crumbs\"\n [user]=\"{ name: 'vnpt', email: 'vnpt@vnpt.vn' }\"\n (sidebarToggle)=\"toggle()\"\n></geo-layout-header>"
2120
+ }
2121
+ ],
2122
+ "example": "<geo-layout-header\n [breadcrumbs]=\"crumbs\"\n [user]=\"{ name: 'vnpt', email: 'vnpt@vnpt.vn' }\"\n (sidebarToggle)=\"toggle()\"\n></geo-layout-header>",
2123
+ "related": []
2124
+ },
2125
+ {
2126
+ "name": "GeoLayoutHeaderActionsComponent",
2127
+ "selector": "geo-layout-header-actions",
2128
+ "category": "layout",
2129
+ "summary": "Header actions: notification/subsystem icons + user chip with popovers.",
2130
+ "whenToUse": "Standalone header toolbar, or default actions inside geo-layout-header.",
2131
+ "doNotUseWhen": "Full app chrome — prefer wrapping with geo-layout.",
2132
+ "howTo": "",
2133
+ "tips": [],
2134
+ "binding": "none",
2135
+ "cva": false,
2136
+ "path": "projects/geo-ui/src/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.ts",
2137
+ "doc": "ai/components/geo-layout-header-actions.md",
2138
+ "inputs": [
2139
+ {
2140
+ "name": "user",
2141
+ "type": "GeoLayoutUserInfo",
2142
+ "default": "GEO_LAYOUT_DEFAULT_USER",
2143
+ "note": ""
2144
+ },
2145
+ {
2146
+ "name": "notifications",
2147
+ "type": "GeoLayoutNotificationItem[]",
2148
+ "default": "GEO_LAYOUT_DEFAULT_NOTIFICATIONS",
2149
+ "note": ""
2150
+ },
2151
+ {
2152
+ "name": "subsystems",
2153
+ "type": "GeoLayoutSubsystemItem[]",
2154
+ "default": "GEO_LAYOUT_DEFAULT_SUBSYSTEMS",
2155
+ "note": ""
2156
+ },
2157
+ {
2158
+ "name": "userMenuItems",
2159
+ "type": "GeoLayoutUserMenuItem[]",
2160
+ "default": "GEO_LAYOUT_DEFAULT_USER_MENU",
2161
+ "note": ""
2162
+ },
2163
+ {
2164
+ "name": "compact",
2165
+ "type": "boolean",
2166
+ "default": "false",
2167
+ "note": "Ẩn tên/email trên chip (mobile)."
2168
+ }
2169
+ ],
2170
+ "outputs": [
2171
+ {
2172
+ "name": "notificationClick",
2173
+ "type": "OutputEmitterRef<GeoLayoutNotificationItem>",
2174
+ "note": ""
2175
+ },
2176
+ {
2177
+ "name": "subsystemClick",
2178
+ "type": "OutputEmitterRef<GeoLayoutSubsystemItem>",
2179
+ "note": ""
2180
+ },
2181
+ {
2182
+ "name": "userMenuClick",
2183
+ "type": "OutputEmitterRef<GeoLayoutUserMenuItem>",
2184
+ "note": ""
2185
+ },
2186
+ {
2187
+ "name": "logout",
2188
+ "type": "OutputEmitterRef<void>",
2189
+ "note": ""
2190
+ }
2191
+ ],
2192
+ "examples": [
2193
+ {
2194
+ "title": "Example",
2195
+ "lang": "html",
2196
+ "code": "<geo-layout-header-actions\n [user]=\"{ name: 'vnpt', email: 'vnpt@vnpt.vn' }\"\n (logout)=\"onLogout()\"\n></geo-layout-header-actions>"
2197
+ }
2198
+ ],
2199
+ "example": "<geo-layout-header-actions\n [user]=\"{ name: 'vnpt', email: 'vnpt@vnpt.vn' }\"\n (logout)=\"onLogout()\"\n></geo-layout-header-actions>",
2200
+ "related": []
2201
+ },
2202
+ {
2203
+ "name": "GeoLayoutSidebarComponent",
2204
+ "selector": "geo-layout-sidebar",
2205
+ "category": "layout",
2206
+ "summary": "White sidebar: brand + recursive menu (collapse / mobile drawer).",
2207
+ "whenToUse": "Standalone nav rail, or inside geo-layout.",
2208
+ "doNotUseWhen": "Full app chrome — use geo-layout.",
2209
+ "howTo": "",
2210
+ "tips": [],
2211
+ "binding": "none",
2212
+ "cva": false,
2213
+ "path": "projects/geo-ui/src/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.ts",
2214
+ "doc": "ai/components/geo-layout-sidebar.md",
2215
+ "inputs": [
2216
+ {
2217
+ "name": "menuItems",
2218
+ "type": "GeoLayoutMenuItem[]",
2219
+ "default": "[]",
2220
+ "note": ""
2221
+ },
2222
+ {
2223
+ "name": "brandTitle",
2224
+ "type": "string",
2225
+ "default": "'iLIS'",
2226
+ "note": ""
2227
+ },
2228
+ {
2229
+ "name": "logoSrc",
2230
+ "type": "string",
2231
+ "default": "''",
2232
+ "note": ""
2233
+ },
2234
+ {
2235
+ "name": "logoAlt",
2236
+ "type": "string",
2237
+ "default": "'Logo'",
2238
+ "note": ""
2239
+ },
2240
+ {
2241
+ "name": "sidebarBackgroundSrc",
2242
+ "type": "string",
2243
+ "default": "''",
2244
+ "note": ""
2245
+ },
2246
+ {
2247
+ "name": "selectedKey",
2248
+ "type": "string | null",
2249
+ "default": "null",
2250
+ "note": "Two-way `model()` (supports banana binding)."
2251
+ },
2252
+ {
2253
+ "name": "collapsed",
2254
+ "type": "boolean",
2255
+ "default": "false",
2256
+ "note": ""
2257
+ },
2258
+ {
2259
+ "name": "isMobile",
2260
+ "type": "boolean",
2261
+ "default": "false",
2262
+ "note": ""
2263
+ },
2264
+ {
2265
+ "name": "mobileOpen",
2266
+ "type": "boolean",
2267
+ "default": "false",
2268
+ "note": ""
2269
+ },
2270
+ {
2271
+ "name": "width",
2272
+ "type": "GeoLayoutSiderWidth",
2273
+ "default": "280",
2274
+ "note": ""
2275
+ },
2276
+ {
2277
+ "name": "collapsedWidth",
2278
+ "type": "GeoLayoutSiderWidth",
2279
+ "default": "80",
2280
+ "note": ""
2281
+ }
2282
+ ],
2283
+ "outputs": [
2284
+ {
2285
+ "name": "menuSelect",
2286
+ "type": "OutputEmitterRef<GeoLayoutMenuItem>",
2287
+ "note": ""
2288
+ }
2289
+ ],
2290
+ "examples": [
2291
+ {
2292
+ "title": "Example",
2293
+ "lang": "html",
2294
+ "code": "<geo-layout-sidebar\n [menuItems]=\"menu\"\n [(selectedKey)]=\"active\"\n [collapsed]=\"false\"\n></geo-layout-sidebar>"
2295
+ }
2296
+ ],
2297
+ "example": "<geo-layout-sidebar\n [menuItems]=\"menu\"\n [(selectedKey)]=\"active\"\n [collapsed]=\"false\"\n></geo-layout-sidebar>",
2298
+ "related": []
2299
+ },
2300
+ {
2301
+ "name": "GeoListPageComponent",
2302
+ "selector": "geo-list-page",
2303
+ "category": "layout",
2304
+ "summary": "List page chrome: title + breadcrumb shell for admin CRUD screens.",
2305
+ "whenToUse": "Wrap table toolbars on admin list pages.",
2306
+ "doNotUseWhen": "Map portals — use geo-map-shell; dashboards — use geo-dashboard.",
2307
+ "howTo": "",
2308
+ "tips": [],
2309
+ "binding": "none",
2310
+ "cva": false,
2311
+ "path": "projects/geo-ui/src/lib/figma/geo-list-page/geo-list-page.component.ts",
2312
+ "doc": "ai/components/geo-list-page.md",
2313
+ "inputs": [
2314
+ {
2315
+ "name": "title",
2316
+ "type": "string",
2317
+ "default": "''",
2318
+ "note": ""
2319
+ },
2320
+ {
2321
+ "name": "breadcrumb",
2322
+ "type": "GeoBreadcrumbItem[]",
2323
+ "default": "[]",
2324
+ "note": ""
2325
+ },
2326
+ {
2327
+ "name": "uppercase",
2328
+ "type": "boolean",
2329
+ "default": "true",
2330
+ "note": ""
2331
+ }
2332
+ ],
2333
+ "outputs": [],
2334
+ "examples": [
2335
+ {
2336
+ "title": "Example",
2337
+ "lang": "html",
2338
+ "code": "<geo-list-page title=\"Quản lý người dùng\" [breadcrumb]=\"crumbs\">\n <geo-table-toolbar ...></geo-table-toolbar>\n <geo-table ...></geo-table>\n</geo-list-page>"
2339
+ }
2340
+ ],
2341
+ "example": "<geo-list-page title=\"Quản lý người dùng\" [breadcrumb]=\"crumbs\">\n <geo-table-toolbar ...></geo-table-toolbar>\n <geo-table ...></geo-table>\n</geo-list-page>",
2342
+ "related": []
2343
+ },
2344
+ {
2345
+ "name": "GeoLoginComponent",
2346
+ "selector": "geo-login",
2347
+ "category": "forms",
2348
+ "summary": "Login form (username, password, captcha, remember).",
2349
+ "whenToUse": "Specialist / admin login page.",
2350
+ "doNotUseWhen": "SSO-only flows without local credentials.",
2351
+ "howTo": "Form đăng nhập: username/password/captcha/remember. (submitLogin) payload; (forgotPassword) điều hướng quên mật khẩu.",
2352
+ "tips": [
2353
+ "Cần FormsModule + styles tokens.",
2354
+ "Ghép geo-forgot-password trên route riêng."
2355
+ ],
2356
+ "binding": "none",
2357
+ "cva": false,
2358
+ "path": "projects/geo-ui/src/lib/figma/geo-login/geo-login.component.ts",
2359
+ "doc": "ai/components/geo-login.md",
2360
+ "inputs": [
2361
+ {
2362
+ "name": "title",
2363
+ "type": "string",
2364
+ "default": "'Đăng nhập hệ thống'",
2365
+ "note": ""
2366
+ },
2367
+ {
2368
+ "name": "subtitle",
2369
+ "type": "string",
2370
+ "default": "'Cổng tra cứu thông tin đất đai'",
2371
+ "note": ""
2372
+ },
2373
+ {
2374
+ "name": "captchaHint",
2375
+ "type": "string",
2376
+ "default": "'Nhập mã kiểm tra hiển thị bên cạnh'",
2377
+ "note": ""
2378
+ },
2379
+ {
2380
+ "name": "loading",
2381
+ "type": "boolean",
2382
+ "default": "false",
2383
+ "note": ""
2384
+ },
2385
+ {
2386
+ "name": "errorMessage",
2387
+ "type": "string",
2388
+ "default": "''",
2389
+ "note": ""
2390
+ },
2391
+ {
2392
+ "name": "showForgotPassword",
2393
+ "type": "boolean",
2394
+ "default": "true",
2395
+ "note": ""
2396
+ },
2397
+ {
2398
+ "name": "username",
2399
+ "type": "string",
2400
+ "default": "''",
2401
+ "note": "Two-way `model()` (supports banana binding)."
2402
+ },
2403
+ {
2404
+ "name": "password",
2405
+ "type": "string",
2406
+ "default": "''",
2407
+ "note": "Two-way `model()` (supports banana binding)."
2408
+ },
2409
+ {
2410
+ "name": "captcha",
2411
+ "type": "string",
2412
+ "default": "''",
2413
+ "note": "Two-way `model()` (supports banana binding)."
2414
+ },
2415
+ {
2416
+ "name": "remember",
2417
+ "type": "boolean",
2418
+ "default": "false",
2419
+ "note": "Two-way `model()` (supports banana binding)."
2420
+ }
2421
+ ],
2422
+ "outputs": [
2423
+ {
2424
+ "name": "submitLogin",
2425
+ "type": "OutputEmitterRef<GeoLoginPayload>",
2426
+ "note": ""
2427
+ },
2428
+ {
2429
+ "name": "forgotPassword",
2430
+ "type": "OutputEmitterRef<void>",
2431
+ "note": ""
2432
+ }
2433
+ ],
2434
+ "examples": [
2435
+ {
2436
+ "title": "Basic",
2437
+ "lang": "html",
2438
+ "code": "<geo-login (submitLogin)=\"login($event)\" (forgotPassword)=\"goForgot()\"></geo-login>"
2439
+ }
2440
+ ],
2441
+ "example": "<geo-login (submitLogin)=\"login($event)\" (forgotPassword)=\"goForgot()\"></geo-login>",
2442
+ "related": [
2443
+ "geo-forgot-password",
2444
+ "geo-input",
2445
+ "geo-button"
2446
+ ]
2447
+ },
2448
+ {
2449
+ "name": "GeoMapComponent",
2450
+ "selector": "geo-map",
2451
+ "category": "map",
2452
+ "summary": "OpenLayers map host with basemap, typed layers, and GeoMapController.",
2453
+ "whenToUse": "Any map viewport (portal quy hoạch, tra cứu thửa). Peers: ol, proj4.",
2454
+ "doNotUseWhen": "Full portal chrome — prefer geo-map-shell; non-map charts — use geo-chart.",
2455
+ "howTo": "Host OpenLayers thuần. (mapReady) nhận GeoMapController để zoom/fit/addLayer. Layers typed (osm/xyz/wms/wmts/geojson). Projections tùy chỉnh qua [projections] — không invent VN-2000.",
2456
+ "tips": [
2457
+ "Portal đầy đủ → geo-map-shell.",
2458
+ "showZoomControl=false khi dùng geo-map-zoom riêng.",
2459
+ "Peers: ol, proj4."
2460
+ ],
2461
+ "binding": "none",
2462
+ "cva": false,
2463
+ "path": "projects/geo-ui/src/lib/figma/geo-map/geo-map.component.ts",
2464
+ "doc": "ai/components/geo-map.md",
2465
+ "inputs": [
2466
+ {
2467
+ "name": "center",
2468
+ "type": "number[]",
2469
+ "default": "[...GEO_MAP_DEFAULT_CENTER]",
2470
+ "note": "Map center in view projection (default Web Mercator Đà Lạt area)."
2471
+ },
2472
+ {
2473
+ "name": "zoom",
2474
+ "type": "",
2475
+ "default": "GEO_MAP_DEFAULT_ZOOM",
2476
+ "note": ""
2477
+ },
2478
+ {
2479
+ "name": "minZoom",
2480
+ "type": "",
2481
+ "default": "GEO_MAP_DEFAULT_MIN_ZOOM",
2482
+ "note": ""
2483
+ },
2484
+ {
2485
+ "name": "maxZoom",
2486
+ "type": "",
2487
+ "default": "GEO_MAP_DEFAULT_MAX_ZOOM",
2488
+ "note": ""
2489
+ },
2490
+ {
2491
+ "name": "viewProjection",
2492
+ "type": "",
2493
+ "default": "GEO_MAP_DEFAULT_VIEW_PROJECTION",
2494
+ "note": ""
2495
+ },
2496
+ {
2497
+ "name": "basemap",
2498
+ "type": "'osm' | { type: 'xyz'",
2499
+ "default": "'osm'",
2500
+ "note": ""
2501
+ },
2502
+ {
2503
+ "name": "layers",
2504
+ "type": "(| GeoMapOsmLayerConfig | GeoMapXyzLayerConfig | GeoMapWmsLayerConfig | GeoMapWmtsLayerConfig | G…",
2505
+ "default": "[]",
2506
+ "note": ""
2507
+ },
2508
+ {
2509
+ "name": "height",
2510
+ "type": "",
2511
+ "default": "GEO_MAP_DEFAULT_HEIGHT",
2512
+ "note": ""
2513
+ },
2514
+ {
2515
+ "name": "registerProjections",
2516
+ "type": "boolean",
2517
+ "default": "true",
2518
+ "note": "When true, custom projections listed in `projections` are registered before map create. Built-in EPSG:4326 / EPSG:3857 never need registration. VN-2000 definitions must be supplied via `projections` — never invented."
2519
+ },
2520
+ {
2521
+ "name": "projections",
2522
+ "type": "ProjectionConfig[]",
2523
+ "default": "[]",
2524
+ "note": "Custom CRS definitions (e.g. local VN-2000 from environment)."
2525
+ },
2526
+ {
2527
+ "name": "showMousePosition",
2528
+ "type": "boolean",
2529
+ "default": "false",
2530
+ "note": ""
2531
+ },
2532
+ {
2533
+ "name": "mousePositionProjection",
2534
+ "type": "string",
2535
+ "default": "'EPSG:4326'",
2536
+ "note": ""
2537
+ },
2538
+ {
2539
+ "name": "showZoomControl",
2540
+ "type": "boolean",
2541
+ "default": "true",
2542
+ "note": "When false, hide built-in OL zoom control (prefer `geo-map-zoom`)."
2543
+ }
2544
+ ],
2545
+ "outputs": [
2546
+ {
2547
+ "name": "mapReady",
2548
+ "type": "OutputEmitterRef<GeoMapController>",
2549
+ "note": ""
2550
+ },
2551
+ {
2552
+ "name": "mapClick",
2553
+ "type": "OutputEmitterRef<GeoMapClickEvent>",
2554
+ "note": ""
2555
+ },
2556
+ {
2557
+ "name": "viewChange",
2558
+ "type": "OutputEmitterRef<GeoMapViewChangeEvent>",
2559
+ "note": ""
2560
+ },
2561
+ {
2562
+ "name": "initError",
2563
+ "type": "OutputEmitterRef<string>",
2564
+ "note": ""
2565
+ }
2566
+ ],
2567
+ "examples": [
2568
+ {
2569
+ "title": "Basic",
2570
+ "lang": "html",
2571
+ "code": "<geo-map height=\"480px\" basemap=\"osm\" [center]=\"[108.45, 11.94]\" [zoom]=\"12\" (mapReady)=\"ctrl = $event\"></geo-map>"
2572
+ }
2573
+ ],
2574
+ "example": "<geo-map height=\"480px\" basemap=\"osm\" [center]=\"[108.45, 11.94]\" [zoom]=\"12\" (mapReady)=\"ctrl = $event\"></geo-map>",
2575
+ "related": [
2576
+ "geo-map-shell",
2577
+ "geo-map-zoom",
2578
+ "geo-map-toolbar"
2579
+ ]
2580
+ },
2581
+ {
2582
+ "name": "GeoMapAdminFilterComponent",
2583
+ "selector": "geo-map-admin-filter",
2584
+ "category": "map",
2585
+ "summary": "Administrative unit tree filter (ĐVHC) for map extent.",
2586
+ "whenToUse": "Filter map by tỉnh/huyện/xã; included in geo-map-shell.",
2587
+ "doNotUseWhen": "Generic trees outside map — use geo-tree.",
2588
+ "howTo": "",
2589
+ "tips": [],
2590
+ "binding": "none",
2591
+ "cva": false,
2592
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.ts",
2593
+ "doc": "ai/components/geo-map-admin-filter.md",
2594
+ "inputs": [
2595
+ {
2596
+ "name": "open",
2597
+ "type": "boolean",
2598
+ "default": "false",
2599
+ "note": "Two-way `model()` (supports banana binding)."
2600
+ },
2601
+ {
2602
+ "name": "title",
2603
+ "type": "string",
2604
+ "default": "'Đơn vị hành chính'",
2605
+ "note": ""
2606
+ },
2607
+ {
2608
+ "name": "nodes",
2609
+ "type": "GeoTreeNode[]",
2610
+ "default": "[]",
2611
+ "note": ""
2612
+ },
2613
+ {
2614
+ "name": "checkedKeys",
2615
+ "type": "Array<string | number>",
2616
+ "default": "[]",
2617
+ "note": "Two-way `model()` (supports banana binding)."
2618
+ },
2619
+ {
2620
+ "name": "expandedKeys",
2621
+ "type": "Array<string | number>",
2622
+ "default": "[]",
2623
+ "note": "Two-way `model()` (supports banana binding)."
2624
+ }
2625
+ ],
2626
+ "outputs": [
2627
+ {
2628
+ "name": "apply",
2629
+ "type": "OutputEmitterRef<Array<string | number>>",
2630
+ "note": ""
2631
+ },
2632
+ {
2633
+ "name": "reset",
2634
+ "type": "OutputEmitterRef<void>",
2635
+ "note": ""
2636
+ },
2637
+ {
2638
+ "name": "fitProvince",
2639
+ "type": "OutputEmitterRef<void>",
2640
+ "note": ""
2641
+ },
2642
+ {
2643
+ "name": "closed",
2644
+ "type": "OutputEmitterRef<void>",
2645
+ "note": ""
2646
+ },
2647
+ {
2648
+ "name": "selectionChange",
2649
+ "type": "OutputEmitterRef<Array<string | number>>",
2650
+ "note": ""
2651
+ }
2652
+ ],
2653
+ "examples": [
2654
+ {
2655
+ "title": "Example",
2656
+ "lang": "html",
2657
+ "code": "<geo-map-admin-filter\n [(open)]=\"adminOpen\"\n [nodes]=\"adminNodes\"\n [(checkedKeys)]=\"checked\"\n (apply)=\"applyAdmin($event)\"\n></geo-map-admin-filter>"
2658
+ }
2659
+ ],
2660
+ "example": "<geo-map-admin-filter\n [(open)]=\"adminOpen\"\n [nodes]=\"adminNodes\"\n [(checkedKeys)]=\"checked\"\n (apply)=\"applyAdmin($event)\"\n></geo-map-admin-filter>",
2661
+ "related": []
2662
+ },
2663
+ {
2664
+ "name": "GeoMapBasemapSwitcherComponent",
2665
+ "selector": "geo-map-basemap-switcher",
2666
+ "category": "map",
2667
+ "summary": "Basemap preview chip (e.g. street ↔ satellite).",
2668
+ "whenToUse": "Bottom-right basemap toggle; included in geo-map-shell.",
2669
+ "doNotUseWhen": "Programmatic basemap only — set geo-map [basemap] / shell basemapId.",
2670
+ "howTo": "",
2671
+ "tips": [],
2672
+ "binding": "none",
2673
+ "cva": false,
2674
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.ts",
2675
+ "doc": "ai/components/geo-map-basemap-switcher.md",
2676
+ "inputs": [
2677
+ {
2678
+ "name": "options",
2679
+ "type": "GeoMapBasemapOption[]",
2680
+ "default": "GEO_MAP_DEFAULT_BASEMAP_OPTIONS",
2681
+ "note": "Exactly two options (street + satellite). Extra items are ignored."
2682
+ },
2683
+ {
2684
+ "name": "selectedId",
2685
+ "type": "string",
2686
+ "default": "'osm'",
2687
+ "note": "Two-way `model()` (supports banana binding)."
2688
+ },
2689
+ {
2690
+ "name": "label",
2691
+ "type": "string",
2692
+ "default": "'Lớp bản đồ'",
2693
+ "note": "Caption on the thumbnail card (design: «Lớp bản đồ»)."
2694
+ },
2695
+ {
2696
+ "name": "tooltip",
2697
+ "type": "string",
2698
+ "default": "'Đổi lớp bản đồ nền'",
2699
+ "note": ""
2700
+ }
2701
+ ],
2702
+ "outputs": [
2703
+ {
2704
+ "name": "basemapChange",
2705
+ "type": "OutputEmitterRef<GeoMapBasemap>",
2706
+ "note": ""
2707
+ }
2708
+ ],
2709
+ "examples": [
2710
+ {
2711
+ "title": "Example",
2712
+ "lang": "html",
2713
+ "code": "<geo-map-basemap-switcher\n [options]=\"basemapOptions\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemap($event)\"\n></geo-map-basemap-switcher>"
2714
+ }
2715
+ ],
2716
+ "example": "<geo-map-basemap-switcher\n [options]=\"basemapOptions\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemap($event)\"\n></geo-map-basemap-switcher>",
2717
+ "related": []
2718
+ },
2719
+ {
2720
+ "name": "GeoMapHelpComponent",
2721
+ "selector": "geo-map-help",
2722
+ "category": "map",
2723
+ "summary": "Map help / hướng dẫn popover with sections.",
2724
+ "whenToUse": "Help affordance on map chrome.",
2725
+ "doNotUseWhen": "App-wide help pages — use normal content pages.",
2726
+ "howTo": "",
2727
+ "tips": [],
2728
+ "binding": "none",
2729
+ "cva": false,
2730
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.ts",
2731
+ "doc": "ai/components/geo-map-help.md",
2732
+ "inputs": [
2733
+ {
2734
+ "name": "open",
2735
+ "type": "boolean",
2736
+ "default": "false",
2737
+ "note": "Two-way `model()` (supports banana binding)."
2738
+ },
2739
+ {
2740
+ "name": "title",
2741
+ "type": "string",
2742
+ "default": "'Hướng dẫn sử dụng'",
2743
+ "note": ""
2744
+ },
2745
+ {
2746
+ "name": "sections",
2747
+ "type": "GeoMapHelpSection[]",
2748
+ "default": "GEO_MAP_DEFAULT_HELP_SECTIONS",
2749
+ "note": ""
2750
+ }
2751
+ ],
2752
+ "outputs": [],
2753
+ "examples": [
2754
+ {
2755
+ "title": "Example",
2756
+ "lang": "html",
2757
+ "code": "<geo-map-help [(open)]=\"helpOpen\" [sections]=\"helpSections\"></geo-map-help>"
2758
+ }
2759
+ ],
2760
+ "example": "<geo-map-help [(open)]=\"helpOpen\" [sections]=\"helpSections\"></geo-map-help>",
2761
+ "related": []
2762
+ },
2763
+ {
2764
+ "name": "GeoMapLayerCardComponent",
2765
+ "selector": "geo-map-layer-card",
2766
+ "category": "map",
2767
+ "summary": "Basemap / layer preview card (thumbnail + title).",
2768
+ "whenToUse": "Layer pickers and basemap grids.",
2769
+ "doNotUseWhen": "Full layer management — use geo-map-layer-panel.",
2770
+ "howTo": "",
2771
+ "tips": [],
2772
+ "binding": "none",
2773
+ "cva": false,
2774
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.ts",
2775
+ "doc": "ai/components/geo-map-layer-card.md",
2776
+ "inputs": [
2777
+ {
2778
+ "name": "title",
2779
+ "type": "string",
2780
+ "default": "'Lớp bản đồ'",
2781
+ "note": ""
2782
+ },
2783
+ {
2784
+ "name": "previewUrl",
2785
+ "type": "string | undefined",
2786
+ "default": "undefined",
2787
+ "note": ""
2788
+ }
2789
+ ],
2790
+ "outputs": [
2791
+ {
2792
+ "name": "clicked",
2793
+ "type": "OutputEmitterRef<void>",
2794
+ "note": ""
2795
+ }
2796
+ ],
2797
+ "examples": [
2798
+ {
2799
+ "title": "Example",
2800
+ "lang": "html",
2801
+ "code": "<geo-map-layer-card title=\"Đường phố\" [previewUrl]=\"url\" (clicked)=\"select()\"></geo-map-layer-card>"
2802
+ }
2803
+ ],
2804
+ "example": "<geo-map-layer-card title=\"Đường phố\" [previewUrl]=\"url\" (clicked)=\"select()\"></geo-map-layer-card>",
2805
+ "related": []
2806
+ },
2807
+ {
2808
+ "name": "GeoMapLayerPanelComponent",
2809
+ "selector": "geo-map-layer-panel",
2810
+ "category": "map",
2811
+ "summary": "Layer list with visibility / opacity / group selection.",
2812
+ "whenToUse": "Standalone layer manager or inside geo-map-layers-drawer.",
2813
+ "doNotUseWhen": "Single opacity control — use geo-map-opacity.",
2814
+ "howTo": "",
2815
+ "tips": [],
2816
+ "binding": "none",
2817
+ "cva": false,
2818
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.ts",
2819
+ "doc": "ai/components/geo-map-layer-panel.md",
2820
+ "inputs": [
2821
+ {
2822
+ "name": "controller",
2823
+ "type": "GeoMapController | null",
2824
+ "default": "null",
2825
+ "note": ""
2826
+ },
2827
+ {
2828
+ "name": "title",
2829
+ "type": "string",
2830
+ "default": "'Lớp bản đồ'",
2831
+ "note": ""
2832
+ },
2833
+ {
2834
+ "name": "embedded",
2835
+ "type": "boolean",
2836
+ "default": "false",
2837
+ "note": "When true, hide the panel's own header (host popover provides title)."
2838
+ },
2839
+ {
2840
+ "name": "layers",
2841
+ "type": "GeoMapLayerConfig[]",
2842
+ "default": "[]",
2843
+ "note": "Two-way `model()` (supports banana binding)."
2844
+ }
2845
+ ],
2846
+ "outputs": [
2847
+ {
2848
+ "name": "layersChange",
2849
+ "type": "OutputEmitterRef<GeoMapLayerConfig[]>",
2850
+ "note": ""
2851
+ }
2852
+ ],
2853
+ "examples": [
2854
+ {
2855
+ "title": "Example",
2856
+ "lang": "html",
2857
+ "code": "<geo-map-layer-panel [layers]=\"layers\" [controller]=\"ctrl\" [embedded]=\"true\"></geo-map-layer-panel>"
2858
+ }
2859
+ ],
2860
+ "example": "<geo-map-layer-panel [layers]=\"layers\" [controller]=\"ctrl\" [embedded]=\"true\"></geo-map-layer-panel>",
2861
+ "related": []
2862
+ },
2863
+ {
2864
+ "name": "GeoMapLayersDrawerComponent",
2865
+ "selector": "geo-map-layers-drawer",
2866
+ "category": "map",
2867
+ "summary": "Popover/drawer hosting the layer panel (“Lớp bản đồ”).",
2868
+ "whenToUse": "Portal layer UI; included in geo-map-shell.",
2869
+ "doNotUseWhen": "Always-visible side panel — embed geo-map-layer-panel directly.",
2870
+ "howTo": "",
2871
+ "tips": [],
2872
+ "binding": "none",
2873
+ "cva": false,
2874
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.ts",
2875
+ "doc": "ai/components/geo-map-layers-drawer.md",
2876
+ "inputs": [
2877
+ {
2878
+ "name": "controller",
2879
+ "type": "GeoMapController | null",
2880
+ "default": "null",
2881
+ "note": ""
2882
+ },
2883
+ {
2884
+ "name": "open",
2885
+ "type": "boolean",
2886
+ "default": "false",
2887
+ "note": "Two-way `model()` (supports banana binding)."
2888
+ },
2889
+ {
2890
+ "name": "title",
2891
+ "type": "string",
2892
+ "default": "'Lớp bản đồ'",
2893
+ "note": ""
2894
+ },
2895
+ {
2896
+ "name": "legendItems",
2897
+ "type": "GeoMapLegendItem[]",
2898
+ "default": "[]",
2899
+ "note": ""
2900
+ },
2901
+ {
2902
+ "name": "showOpacity",
2903
+ "type": "boolean",
2904
+ "default": "false",
2905
+ "note": "Kept for API compat — opacity is per-layer in the new panel."
2906
+ },
2907
+ {
2908
+ "name": "showLegend",
2909
+ "type": "boolean",
2910
+ "default": "false",
2911
+ "note": "Kept for API compat — legend lives outside this popover."
2912
+ },
2913
+ {
2914
+ "name": "layers",
2915
+ "type": "GeoMapLayerConfig[]",
2916
+ "default": "[]",
2917
+ "note": "Two-way `model()` (supports banana binding)."
2918
+ }
2919
+ ],
2920
+ "outputs": [
2921
+ {
2922
+ "name": "closed",
2923
+ "type": "OutputEmitterRef<void>",
2924
+ "note": ""
2925
+ }
2926
+ ],
2927
+ "examples": [
2928
+ {
2929
+ "title": "Example",
2930
+ "lang": "html",
2931
+ "code": "<geo-map-layers-drawer [(open)]=\"layersOpen\" [layers]=\"layers\" [controller]=\"ctrl\"></geo-map-layers-drawer>"
2932
+ }
2933
+ ],
2934
+ "example": "<geo-map-layers-drawer [(open)]=\"layersOpen\" [layers]=\"layers\" [controller]=\"ctrl\"></geo-map-layers-drawer>",
2935
+ "related": []
2936
+ },
2937
+ {
2938
+ "name": "GeoMapLegendComponent",
2939
+ "selector": "geo-map-legend",
2940
+ "category": "map",
2941
+ "summary": "Map legend popover / panel with color swatches.",
2942
+ "whenToUse": "Show thematic legend; geo-map-shell includes this.",
2943
+ "doNotUseWhen": "Non-map legends in dashboards — use static markup / geo-status-tag.",
2944
+ "howTo": "",
2945
+ "tips": [],
2946
+ "binding": "none",
2947
+ "cva": false,
2948
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.ts",
2949
+ "doc": "ai/components/geo-map-legend.md",
2950
+ "inputs": [
2951
+ {
2952
+ "name": "title",
2953
+ "type": "string",
2954
+ "default": "'Chú giải'",
2955
+ "note": ""
2956
+ },
2957
+ {
2958
+ "name": "items",
2959
+ "type": "GeoMapLegendItem[]",
2960
+ "default": "[]",
2961
+ "note": ""
2962
+ },
2963
+ {
2964
+ "name": "open",
2965
+ "type": "boolean",
2966
+ "default": "false",
2967
+ "note": "Two-way `model()` (supports banana binding)."
2968
+ }
2969
+ ],
2970
+ "outputs": [
2971
+ {
2972
+ "name": "closed",
2973
+ "type": "OutputEmitterRef<void>",
2974
+ "note": ""
2975
+ }
2976
+ ],
2977
+ "examples": [
2978
+ {
2979
+ "title": "Example",
2980
+ "lang": "html",
2981
+ "code": "<geo-map-legend [(open)]=\"legendOpen\" [items]=\"legendItems\"></geo-map-legend>"
2982
+ }
2983
+ ],
2984
+ "example": "<geo-map-legend [(open)]=\"legendOpen\" [items]=\"legendItems\"></geo-map-legend>",
2985
+ "related": []
2986
+ },
2987
+ {
2988
+ "name": "GeoMapLocateComponent",
2989
+ "selector": "geo-map-locate",
2990
+ "category": "map",
2991
+ "summary": "Geolocation button (browser GPS) for the map view.",
2992
+ "whenToUse": "Locate-me control on custom map chrome.",
2993
+ "doNotUseWhen": "Inside geo-map-shell (already wired) unless building a custom shell.",
2994
+ "howTo": "",
2995
+ "tips": [],
2996
+ "binding": "none",
2997
+ "cva": false,
2998
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.ts",
2999
+ "doc": "ai/components/geo-map-locate.md",
3000
+ "inputs": [
3001
+ {
3002
+ "name": "controller",
3003
+ "type": "GeoMapController | null",
3004
+ "default": "null",
3005
+ "note": ""
3006
+ },
3007
+ {
3008
+ "name": "label",
3009
+ "type": "string",
3010
+ "default": "'Vị trí của tôi'",
3011
+ "note": ""
3012
+ }
3013
+ ],
3014
+ "outputs": [
3015
+ {
3016
+ "name": "located",
3017
+ "type": "OutputEmitterRef<[number, number]>",
3018
+ "note": ""
3019
+ },
3020
+ {
3021
+ "name": "denied",
3022
+ "type": "OutputEmitterRef<void>",
3023
+ "note": ""
3024
+ },
3025
+ {
3026
+ "name": "locateError",
3027
+ "type": "OutputEmitterRef<{ reason: GeoMapLocateErrorReason; message?: string; }>",
3028
+ "note": ""
3029
+ }
3030
+ ],
3031
+ "examples": [
3032
+ {
3033
+ "title": "Example",
3034
+ "lang": "html",
3035
+ "code": "<geo-map-locate [controller]=\"ctrl\" (denied)=\"onDenied()\"></geo-map-locate>"
3036
+ }
3037
+ ],
3038
+ "example": "<geo-map-locate [controller]=\"ctrl\" (denied)=\"onDenied()\"></geo-map-locate>",
3039
+ "related": []
3040
+ },
3041
+ {
3042
+ "name": "GeoMapLocationChipComponent",
3043
+ "selector": "geo-map-location-chip",
3044
+ "category": "map",
3045
+ "summary": "Location breadcrumb chip shown on the map (ward / province).",
3046
+ "whenToUse": "Show current admin context on map chrome.",
3047
+ "doNotUseWhen": "Page breadcrumb — use geo-breadcrumb.",
3048
+ "howTo": "",
3049
+ "tips": [],
3050
+ "binding": "none",
3051
+ "cva": false,
3052
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.ts",
3053
+ "doc": "ai/components/geo-map-location-chip.md",
3054
+ "inputs": [
3055
+ {
3056
+ "name": "label",
3057
+ "type": "string",
3058
+ "default": "''",
3059
+ "note": ""
3060
+ },
3061
+ {
3062
+ "name": "icon",
3063
+ "type": "string",
3064
+ "default": "'environment'",
3065
+ "note": ""
3066
+ }
3067
+ ],
3068
+ "outputs": [],
3069
+ "examples": [
3070
+ {
3071
+ "title": "Example",
3072
+ "lang": "html",
3073
+ "code": "<geo-map-location-chip label=\"Phường 1 — TP Đà Lạt, Lâm Đồng\"></geo-map-location-chip>"
3074
+ }
3075
+ ],
3076
+ "example": "<geo-map-location-chip label=\"Phường 1 — TP Đà Lạt, Lâm Đồng\"></geo-map-location-chip>",
3077
+ "related": []
3078
+ },
3079
+ {
3080
+ "name": "GeoMapMeasureComponent",
3081
+ "selector": "geo-map-measure",
3082
+ "category": "map",
3083
+ "summary": "Distance / area measure interaction on the map.",
3084
+ "whenToUse": "Measure tool mode; usually driven by toolbar via geo-map-shell.",
3085
+ "doNotUseWhen": "Static length labels without interaction.",
3086
+ "howTo": "",
3087
+ "tips": [],
3088
+ "binding": "none",
3089
+ "cva": false,
3090
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.ts",
3091
+ "doc": "ai/components/geo-map-measure.md",
3092
+ "inputs": [
3093
+ {
3094
+ "name": "controller",
3095
+ "type": "GeoMapController | null",
3096
+ "default": "null",
3097
+ "note": ""
3098
+ },
3099
+ {
3100
+ "name": "mode",
3101
+ "type": "GeoMapMeasureMode",
3102
+ "default": "'none'",
3103
+ "note": "Two-way `model()` (supports banana binding)."
3104
+ },
3105
+ {
3106
+ "name": "showResult",
3107
+ "type": "boolean",
3108
+ "default": "true",
3109
+ "note": ""
3110
+ }
3111
+ ],
3112
+ "outputs": [
3113
+ {
3114
+ "name": "measureChange",
3115
+ "type": "OutputEmitterRef<GeoMapMeasureResult | null>",
3116
+ "note": ""
3117
+ }
3118
+ ],
3119
+ "examples": [
3120
+ {
3121
+ "title": "Example",
3122
+ "lang": "html",
3123
+ "code": "<geo-map-measure [controller]=\"ctrl\" [(mode)]=\"measureMode\"></geo-map-measure>"
3124
+ }
3125
+ ],
3126
+ "example": "<geo-map-measure [controller]=\"ctrl\" [(mode)]=\"measureMode\"></geo-map-measure>",
3127
+ "related": []
3128
+ },
3129
+ {
3130
+ "name": "GeoMapOpacityComponent",
3131
+ "selector": "geo-map-opacity",
3132
+ "category": "map",
3133
+ "summary": "Layer opacity slider bound to a map layer id.",
3134
+ "whenToUse": "Adjust overlay transparency in custom layer UI.",
3135
+ "doNotUseWhen": "Full layer list — use geo-map-layer-panel / layers drawer.",
3136
+ "howTo": "",
3137
+ "tips": [],
3138
+ "binding": "none",
3139
+ "cva": false,
3140
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.ts",
3141
+ "doc": "ai/components/geo-map-opacity.md",
3142
+ "inputs": [
3143
+ {
3144
+ "name": "controller",
3145
+ "type": "GeoMapController | null",
3146
+ "default": "null",
3147
+ "note": ""
3148
+ },
3149
+ {
3150
+ "name": "title",
3151
+ "type": "string",
3152
+ "default": "'Độ trong suốt'",
3153
+ "note": ""
3154
+ },
3155
+ {
3156
+ "name": "layerId",
3157
+ "type": "string | null",
3158
+ "default": "null",
3159
+ "note": "Two-way `model()` (supports banana binding)."
3160
+ },
3161
+ {
3162
+ "name": "opacity",
3163
+ "type": "number",
3164
+ "default": "100",
3165
+ "note": "Opacity percent 0–100. — Two-way `model()` (supports banana binding)."
3166
+ },
3167
+ {
3168
+ "name": "variant",
3169
+ "type": "'panel' | 'compact'",
3170
+ "default": "'panel'",
3171
+ "note": ""
3172
+ },
3173
+ {
3174
+ "name": "applyToFirstLayer",
3175
+ "type": "boolean",
3176
+ "default": "true",
3177
+ "note": "When compact and no layerId, apply to first non-basemap overlay."
3178
+ }
3179
+ ],
3180
+ "outputs": [],
3181
+ "examples": [
3182
+ {
3183
+ "title": "Example",
3184
+ "lang": "html",
3185
+ "code": "<geo-map-opacity [controller]=\"ctrl\" layerId=\"demo-qhsdd-2020\" [(opacity)]=\"opacity\"></geo-map-opacity>"
3186
+ }
3187
+ ],
3188
+ "example": "<geo-map-opacity [controller]=\"ctrl\" layerId=\"demo-qhsdd-2020\" [(opacity)]=\"opacity\"></geo-map-opacity>",
3189
+ "related": []
3190
+ },
3191
+ {
3192
+ "name": "GeoMapParcelPopupComponent",
3193
+ "selector": "geo-map-parcel-popup",
3194
+ "category": "map",
3195
+ "summary": "Parcel detail popup (citizen / specialist audience).",
3196
+ "whenToUse": "Show thửa detail after search or map click.",
3197
+ "doNotUseWhen": "Full detail page — navigate to a route instead.",
3198
+ "howTo": "",
3199
+ "tips": [],
3200
+ "binding": "none",
3201
+ "cva": false,
3202
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.ts",
3203
+ "doc": "ai/components/geo-map-parcel-popup.md",
3204
+ "inputs": [
3205
+ {
3206
+ "name": "open",
3207
+ "type": "boolean",
3208
+ "default": "false",
3209
+ "note": "Two-way `model()` (supports banana binding)."
3210
+ },
3211
+ {
3212
+ "name": "title",
3213
+ "type": "string",
3214
+ "default": "'Thông tin thửa đất'",
3215
+ "note": ""
3216
+ },
3217
+ {
3218
+ "name": "parcel",
3219
+ "type": "GeoMapParcelDetail | null",
3220
+ "default": "null",
3221
+ "note": ""
3222
+ },
3223
+ {
3224
+ "name": "audience",
3225
+ "type": "GeoMapParcelAudience",
3226
+ "default": "'citizen'",
3227
+ "note": ""
3228
+ },
3229
+ {
3230
+ "name": "showExport",
3231
+ "type": "boolean",
3232
+ "default": "false",
3233
+ "note": "Giữ tương thích API cũ; footer xuất file không còn trong layout thiết kế."
3234
+ }
3235
+ ],
3236
+ "outputs": [
3237
+ {
3238
+ "name": "closed",
3239
+ "type": "OutputEmitterRef<void>",
3240
+ "note": ""
3241
+ },
3242
+ {
3243
+ "name": "back",
3244
+ "type": "OutputEmitterRef<void>",
3245
+ "note": ""
3246
+ },
3247
+ {
3248
+ "name": "exportClick",
3249
+ "type": "OutputEmitterRef<GeoMapParcelDetail>",
3250
+ "note": ""
3251
+ },
3252
+ {
3253
+ "name": "diagramClick",
3254
+ "type": "OutputEmitterRef<GeoMapParcelDetail>",
3255
+ "note": ""
3256
+ }
3257
+ ],
3258
+ "examples": [
3259
+ {
3260
+ "title": "Example",
3261
+ "lang": "html",
3262
+ "code": "<geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selected\"\n audience=\"citizen\"\n (exportClick)=\"exportPdf($event)\"\n></geo-map-parcel-popup>"
3263
+ }
3264
+ ],
3265
+ "example": "<geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selected\"\n audience=\"citizen\"\n (exportClick)=\"exportPdf($event)\"\n></geo-map-parcel-popup>",
3266
+ "related": []
3267
+ },
3268
+ {
3269
+ "name": "GeoMapSearchComponent",
3270
+ "selector": "geo-map-search",
3271
+ "category": "map",
3272
+ "summary": "Map search panel (owner / certificate / parcel / address / coordinates).",
3273
+ "whenToUse": "Tra cứu thửa on portal; prefer via geo-map-shell.",
3274
+ "doNotUseWhen": "Global app search unrelated to map.",
3275
+ "howTo": "",
3276
+ "tips": [],
3277
+ "binding": "none",
3278
+ "cva": false,
3279
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.ts",
3280
+ "doc": "ai/components/geo-map-search.md",
3281
+ "inputs": [
3282
+ {
3283
+ "name": "open",
3284
+ "type": "boolean",
3285
+ "default": "false",
3286
+ "note": "Two-way `model()` (supports banana binding)."
3287
+ },
3288
+ {
3289
+ "name": "title",
3290
+ "type": "string",
3291
+ "default": "'Tra cứu thông tin quy hoạch theo'",
3292
+ "note": ""
3293
+ },
3294
+ {
3295
+ "name": "mode",
3296
+ "type": "GeoMapSearchMode",
3297
+ "default": "'parcel'",
3298
+ "note": "Two-way `model()` (supports banana binding)."
3299
+ },
3300
+ {
3301
+ "name": "results",
3302
+ "type": "GeoMapSearchResultItem[]",
3303
+ "default": "[]",
3304
+ "note": ""
3305
+ },
3306
+ {
3307
+ "name": "loading",
3308
+ "type": "boolean",
3309
+ "default": "false",
3310
+ "note": ""
3311
+ },
3312
+ {
3313
+ "name": "pageIndex",
3314
+ "type": "number",
3315
+ "default": "1",
3316
+ "note": "Two-way `model()` (supports banana binding)."
3317
+ },
3318
+ {
3319
+ "name": "pageSize",
3320
+ "type": "number",
3321
+ "default": "5",
3322
+ "note": "Two-way `model()` (supports banana binding)."
3323
+ },
3324
+ {
3325
+ "name": "total",
3326
+ "type": "number",
3327
+ "default": "0",
3328
+ "note": ""
3329
+ },
3330
+ {
3331
+ "name": "emptyText",
3332
+ "type": "string",
3333
+ "default": "'Chưa có kết quả tra cứu.'",
3334
+ "note": ""
3335
+ }
3336
+ ],
3337
+ "outputs": [
3338
+ {
3339
+ "name": "search",
3340
+ "type": "OutputEmitterRef<GeoMapSearchQuery>",
3341
+ "note": ""
3342
+ },
3343
+ {
3344
+ "name": "reset",
3345
+ "type": "OutputEmitterRef<void>",
3346
+ "note": ""
3347
+ },
3348
+ {
3349
+ "name": "resultSelect",
3350
+ "type": "OutputEmitterRef<GeoMapSearchResultItem>",
3351
+ "note": ""
3352
+ },
3353
+ {
3354
+ "name": "closed",
3355
+ "type": "OutputEmitterRef<void>",
3356
+ "note": ""
3357
+ }
3358
+ ],
3359
+ "examples": [
3360
+ {
3361
+ "title": "Example",
3362
+ "lang": "html",
3363
+ "code": "<geo-map-search\n [(open)]=\"searchOpen\"\n mode=\"parcel\"\n [results]=\"results\"\n (search)=\"runSearch($event)\"\n (resultSelect)=\"onSelect($event)\"\n></geo-map-search>"
3364
+ }
3365
+ ],
3366
+ "example": "<geo-map-search\n [(open)]=\"searchOpen\"\n mode=\"parcel\"\n [results]=\"results\"\n (search)=\"runSearch($event)\"\n (resultSelect)=\"onSelect($event)\"\n></geo-map-search>",
3367
+ "related": []
3368
+ },
3369
+ {
3370
+ "name": "GeoMapShellComponent",
3371
+ "selector": "geo-map-shell",
3372
+ "category": "map",
3373
+ "summary": "Full map portal chrome: search, ĐVHC, layers, legend, measure, basemap, parcel popup.",
3374
+ "whenToUse": "Public / specialist map portal pages (tra cứu quy hoạch). Prefer this over composing chrome by hand.",
3375
+ "doNotUseWhen": "Bare map embed without UI chrome — use geo-map only.",
3376
+ "howTo": "Shell portal tra cứu: gắn height + layers API; tắt demoSearch trên production. Lắng nghe (search)/(resultSelect)/(parcelExport). Models [(searchOpen)], [(layersOpen)], … để điều khiển panel từ ngoài.",
3377
+ "tips": [
3378
+ "Ưu tiên geo-map-shell thay vì tự ghép chrome.",
3379
+ "Peers bắt buộc: ol, proj4.",
3380
+ "demoSearch=true chỉ cho Storybook/demo — production phải false + API thật.",
3381
+ "parcelAudience: citizen | specialist.",
3382
+ "Đọc geo-map.md cho layer types / projections."
3383
+ ],
3384
+ "binding": "none",
3385
+ "cva": false,
3386
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.ts",
3387
+ "doc": "ai/components/geo-map-shell.md",
3388
+ "inputs": [
3389
+ {
3390
+ "name": "center",
3391
+ "type": "number[]",
3392
+ "default": "[...GEO_MAP_DEFAULT_CENTER]",
3393
+ "note": ""
3394
+ },
3395
+ {
3396
+ "name": "zoom",
3397
+ "type": "",
3398
+ "default": "GEO_MAP_DEFAULT_ZOOM",
3399
+ "note": ""
3400
+ },
3401
+ {
3402
+ "name": "height",
3403
+ "type": "string",
3404
+ "default": "'560px'",
3405
+ "note": ""
3406
+ },
3407
+ {
3408
+ "name": "showMousePosition",
3409
+ "type": "boolean",
3410
+ "default": "false",
3411
+ "note": ""
3412
+ },
3413
+ {
3414
+ "name": "basemapOptions",
3415
+ "type": "GeoMapBasemapOption[]",
3416
+ "default": "GEO_MAP_DEFAULT_BASEMAP_OPTIONS",
3417
+ "note": ""
3418
+ },
3419
+ {
3420
+ "name": "toolbarActions",
3421
+ "type": "GeoMapToolbarAction[]",
3422
+ "default": "GEO_MAP_DEFAULT_TOOLBAR_ACTIONS",
3423
+ "note": ""
3424
+ },
3425
+ {
3426
+ "name": "layers",
3427
+ "type": "GeoMapLayerConfig[]",
3428
+ "default": "[]",
3429
+ "note": "Extra overlays merged after demo thematic + traffic."
3430
+ },
3431
+ {
3432
+ "name": "legendItems",
3433
+ "type": "GeoMapLegendItem[]",
3434
+ "default": "GEO_MAP_DEMO_LEGEND_ITEMS",
3435
+ "note": ""
3436
+ },
3437
+ {
3438
+ "name": "showNav",
3439
+ "type": "boolean",
3440
+ "default": "true",
3441
+ "note": ""
3442
+ },
3443
+ {
3444
+ "name": "includeDemoLayers",
3445
+ "type": "boolean",
3446
+ "default": "true",
3447
+ "note": ""
3448
+ },
3449
+ {
3450
+ "name": "adminNodes",
3451
+ "type": "GeoTreeNode[]",
3452
+ "default": "GEO_MAP_DEMO_ADMIN_NODES",
3453
+ "note": ""
3454
+ },
3455
+ {
3456
+ "name": "locationLabel",
3457
+ "type": "string",
3458
+ "default": "'Phường 1 — TP Đà Lạt, Lâm Đồng'",
3459
+ "note": ""
3460
+ },
3461
+ {
3462
+ "name": "parcelAudience",
3463
+ "type": "GeoMapParcelAudience",
3464
+ "default": "'citizen'",
3465
+ "note": ""
3466
+ },
3467
+ {
3468
+ "name": "provinceExtent",
3469
+ "type": "readonly [number, number, number, number]",
3470
+ "default": "GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326",
3471
+ "note": ""
3472
+ },
3473
+ {
3474
+ "name": "demoSearch",
3475
+ "type": "boolean",
3476
+ "default": "true",
3477
+ "note": "When true, shell seeds mock search results (Storybook / demos)."
3478
+ },
3479
+ {
3480
+ "name": "homeMode",
3481
+ "type": "'location' | 'emit'",
3482
+ "default": "'location'",
3483
+ "note": "`location` — Home opens ĐVHC filter (default). `emit` — Home only emits `actionClick` (e.g. portal navigates to login/dashboard)."
3484
+ },
3485
+ {
3486
+ "name": "basemapId",
3487
+ "type": "string",
3488
+ "default": "'osm'",
3489
+ "note": "Two-way `model()` (supports banana binding)."
3490
+ },
3491
+ {
3492
+ "name": "measureMode",
3493
+ "type": "GeoMapMeasureMode",
3494
+ "default": "'none'",
3495
+ "note": "Two-way `model()` (supports banana binding)."
3496
+ },
3497
+ {
3498
+ "name": "checkedMap",
3499
+ "type": "Record<string, boolean>",
3500
+ "default": "",
3501
+ "note": "Two-way `model()` (supports banana binding)."
3502
+ },
3503
+ {
3504
+ "name": "layersOpen",
3505
+ "type": "boolean",
3506
+ "default": "false",
3507
+ "note": "Two-way `model()` (supports banana binding)."
3508
+ },
3509
+ {
3510
+ "name": "legendOpen",
3511
+ "type": "boolean",
3512
+ "default": "false",
3513
+ "note": "Two-way `model()` (supports banana binding)."
3514
+ },
3515
+ {
3516
+ "name": "helpOpen",
3517
+ "type": "boolean",
3518
+ "default": "false",
3519
+ "note": "Two-way `model()` (supports banana binding)."
3520
+ },
3521
+ {
3522
+ "name": "swipeActive",
3523
+ "type": "boolean",
3524
+ "default": "false",
3525
+ "note": "Two-way `model()` (supports banana binding)."
3526
+ },
3527
+ {
3528
+ "name": "searchOpen",
3529
+ "type": "boolean",
3530
+ "default": "false",
3531
+ "note": "Two-way `model()` (supports banana binding)."
3532
+ },
3533
+ {
3534
+ "name": "adminFilterOpen",
3535
+ "type": "boolean",
3536
+ "default": "false",
3537
+ "note": "Two-way `model()` (supports banana binding)."
3538
+ },
3539
+ {
3540
+ "name": "parcelOpen",
3541
+ "type": "boolean",
3542
+ "default": "false",
3543
+ "note": "Two-way `model()` (supports banana binding)."
3544
+ },
3545
+ {
3546
+ "name": "managedLayers",
3547
+ "type": "GeoMapLayerConfig[]",
3548
+ "default": "[]",
3549
+ "note": "Two-way `model()` (supports banana binding)."
3550
+ },
3551
+ {
3552
+ "name": "searchResults",
3553
+ "type": "GeoMapSearchResultItem[]",
3554
+ "default": "[]",
3555
+ "note": "Two-way `model()` (supports banana binding)."
3556
+ },
3557
+ {
3558
+ "name": "selectedParcel",
3559
+ "type": "GeoMapParcelDetail | null",
3560
+ "default": "null",
3561
+ "note": "Two-way `model()` (supports banana binding)."
3562
+ },
3563
+ {
3564
+ "name": "adminCheckedKeys",
3565
+ "type": "Array<string | number>",
3566
+ "default": "[]",
3567
+ "note": "Two-way `model()` (supports banana binding)."
3568
+ },
3569
+ {
3570
+ "name": "adminExpandedKeys",
3571
+ "type": "Array<string | number>",
3572
+ "default": "['lam-dong']",
3573
+ "note": "Two-way `model()` (supports banana binding)."
3574
+ }
3575
+ ],
3576
+ "outputs": [
3577
+ {
3578
+ "name": "mapReady",
3579
+ "type": "OutputEmitterRef<GeoMapController>",
3580
+ "note": ""
3581
+ },
3582
+ {
3583
+ "name": "mapClick",
3584
+ "type": "OutputEmitterRef<GeoMapClickEvent>",
3585
+ "note": ""
3586
+ },
3587
+ {
3588
+ "name": "locateDenied",
3589
+ "type": "OutputEmitterRef<void>",
3590
+ "note": ""
3591
+ },
3592
+ {
3593
+ "name": "actionClick",
3594
+ "type": "OutputEmitterRef<GeoMapToolbarAction>",
3595
+ "note": ""
3596
+ },
3597
+ {
3598
+ "name": "search",
3599
+ "type": "OutputEmitterRef<GeoMapSearchQuery>",
3600
+ "note": ""
3601
+ },
3602
+ {
3603
+ "name": "searchReset",
3604
+ "type": "OutputEmitterRef<void>",
3605
+ "note": ""
3606
+ },
3607
+ {
3608
+ "name": "resultSelect",
3609
+ "type": "OutputEmitterRef<GeoMapSearchResultItem>",
3610
+ "note": ""
3611
+ },
3612
+ {
3613
+ "name": "parcelExport",
3614
+ "type": "OutputEmitterRef<GeoMapParcelDetail>",
3615
+ "note": ""
3616
+ },
3617
+ {
3618
+ "name": "adminApply",
3619
+ "type": "OutputEmitterRef<Array<string | number>>",
3620
+ "note": ""
3621
+ }
3622
+ ],
3623
+ "examples": [
3624
+ {
3625
+ "title": "Basic portal",
3626
+ "lang": "html",
3627
+ "code": "<geo-map-shell\n height=\"640px\"\n [demoSearch]=\"false\"\n parcelAudience=\"citizen\"\n [layers]=\"layers\"\n (mapReady)=\"ctrl = $event\"\n (search)=\"onSearch($event)\"\n></geo-map-shell>"
3628
+ },
3629
+ {
3630
+ "title": "Open search panel",
3631
+ "lang": "html",
3632
+ "code": "<geo-map-shell\n height=\"640px\"\n [demoSearch]=\"false\"\n [(searchOpen)]=\"searchOpen\"\n [(searchResults)]=\"results\"\n (search)=\"runQuery($event)\"\n (resultSelect)=\"onResult($event)\"\n></geo-map-shell>"
3633
+ }
3634
+ ],
3635
+ "example": "<geo-map-shell\n height=\"640px\"\n [demoSearch]=\"false\"\n parcelAudience=\"citizen\"\n [layers]=\"layers\"\n (mapReady)=\"ctrl = $event\"\n (search)=\"onSearch($event)\"\n></geo-map-shell>",
3636
+ "related": [
3637
+ "geo-map",
3638
+ "geo-map-search",
3639
+ "geo-map-toolbar",
3640
+ "geo-map-layers-drawer"
3641
+ ]
3642
+ },
3643
+ {
3644
+ "name": "GeoMapSnapshotComponent",
3645
+ "selector": "geo-map-snapshot",
3646
+ "category": "map",
3647
+ "summary": "Capture current map canvas to image / download.",
3648
+ "whenToUse": "Export screenshot control on map chrome.",
3649
+ "doNotUseWhen": "Server-side tile export pipelines.",
3650
+ "howTo": "",
3651
+ "tips": [],
3652
+ "binding": "none",
3653
+ "cva": false,
3654
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.ts",
3655
+ "doc": "ai/components/geo-map-snapshot.md",
3656
+ "inputs": [
3657
+ {
3658
+ "name": "controller",
3659
+ "type": "GeoMapController | null",
3660
+ "default": "null",
3661
+ "note": ""
3662
+ },
3663
+ {
3664
+ "name": "label",
3665
+ "type": "string",
3666
+ "default": "'Chụp ảnh bản đồ'",
3667
+ "note": ""
3668
+ },
3669
+ {
3670
+ "name": "filename",
3671
+ "type": "string",
3672
+ "default": "'ban-do.png'",
3673
+ "note": ""
3674
+ }
3675
+ ],
3676
+ "outputs": [
3677
+ {
3678
+ "name": "captured",
3679
+ "type": "OutputEmitterRef<void>",
3680
+ "note": ""
3681
+ },
3682
+ {
3683
+ "name": "captureError",
3684
+ "type": "OutputEmitterRef<unknown>",
3685
+ "note": ""
3686
+ }
3687
+ ],
3688
+ "examples": [
3689
+ {
3690
+ "title": "Example",
3691
+ "lang": "html",
3692
+ "code": "<geo-map-snapshot [controller]=\"ctrl\" (captured)=\"onShot($event)\"></geo-map-snapshot>"
3693
+ }
3694
+ ],
3695
+ "example": "<geo-map-snapshot [controller]=\"ctrl\" (captured)=\"onShot($event)\"></geo-map-snapshot>",
3696
+ "related": []
3697
+ },
3698
+ {
3699
+ "name": "GeoMapSwipeComponent",
3700
+ "selector": "geo-map-swipe",
3701
+ "category": "map",
3702
+ "summary": "Swipe compare control between two map layers.",
3703
+ "whenToUse": "Before/after planning vs current-use comparison.",
3704
+ "doNotUseWhen": "Simple opacity blend — use geo-map-opacity.",
3705
+ "howTo": "",
3706
+ "tips": [],
3707
+ "binding": "none",
3708
+ "cva": false,
3709
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.ts",
3710
+ "doc": "ai/components/geo-map-swipe.md",
3711
+ "inputs": [
3712
+ {
3713
+ "name": "controller",
3714
+ "type": "GeoMapController | null",
3715
+ "default": "null",
3716
+ "note": ""
3717
+ },
3718
+ {
3719
+ "name": "active",
3720
+ "type": "boolean",
3721
+ "default": "false",
3722
+ "note": "When true, swipe mode is on. — Two-way `model()` (supports banana binding)."
3723
+ },
3724
+ {
3725
+ "name": "position",
3726
+ "type": "number",
3727
+ "default": "50",
3728
+ "note": "0–100, left portion shows clipped overlay. — Two-way `model()` (supports banana binding)."
3729
+ },
3730
+ {
3731
+ "name": "layerId",
3732
+ "type": "string | null",
3733
+ "default": "null",
3734
+ "note": "Optional explicit overlay layer id; defaults to top visible non-basemap."
3735
+ }
3736
+ ],
3737
+ "outputs": [],
3738
+ "examples": [
3739
+ {
3740
+ "title": "Example",
3741
+ "lang": "html",
3742
+ "code": "<geo-map-swipe [controller]=\"ctrl\" [(active)]=\"swipeOn\" layerId=\"demo-qhsdd-2020\"></geo-map-swipe>"
3743
+ }
3744
+ ],
3745
+ "example": "<geo-map-swipe [controller]=\"ctrl\" [(active)]=\"swipeOn\" layerId=\"demo-qhsdd-2020\"></geo-map-swipe>",
3746
+ "related": []
3747
+ },
3748
+ {
3749
+ "name": "GeoMapToolbarComponent",
3750
+ "selector": "geo-map-toolbar",
3751
+ "category": "map",
3752
+ "summary": "Vertical map tool strip (search, pan, measure, layers, …).",
3753
+ "whenToUse": "Custom map layouts; usually included inside geo-map-shell.",
3754
+ "doNotUseWhen": "Full portal — use geo-map-shell.",
3755
+ "howTo": "",
3756
+ "tips": [],
3757
+ "binding": "none",
3758
+ "cva": false,
3759
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.ts",
3760
+ "doc": "ai/components/geo-map-toolbar.md",
3761
+ "inputs": [
3762
+ {
3763
+ "name": "controller",
3764
+ "type": "GeoMapController | null",
3765
+ "default": "null",
3766
+ "note": ""
3767
+ },
3768
+ {
3769
+ "name": "actions",
3770
+ "type": "GeoMapToolbarAction[]",
3771
+ "default": "[]",
3772
+ "note": "When empty, uses built-in portal action set."
3773
+ },
3774
+ {
3775
+ "name": "compact",
3776
+ "type": "boolean",
3777
+ "default": "false",
3778
+ "note": ""
3779
+ },
3780
+ {
3781
+ "name": "checkedMap",
3782
+ "type": "Record<string, boolean>",
3783
+ "default": "",
3784
+ "note": "Two-way checked map keyed by action id (for checkbox-style actions). — Two-way `model()` (supports banana binding)."
3785
+ }
3786
+ ],
3787
+ "outputs": [
3788
+ {
3789
+ "name": "actionClick",
3790
+ "type": "OutputEmitterRef<GeoMapToolbarAction>",
3791
+ "note": ""
3792
+ },
3793
+ {
3794
+ "name": "actionToggle",
3795
+ "type": "OutputEmitterRef<{ action: GeoMapToolbarAction; checked: boolean; }>",
3796
+ "note": ""
3797
+ }
3798
+ ],
3799
+ "examples": [
3800
+ {
3801
+ "title": "Example",
3802
+ "lang": "html",
3803
+ "code": "<geo-map-toolbar\n [controller]=\"ctrl\"\n [actions]=\"actions\"\n [(checkedMap)]=\"checked\"\n (actionClick)=\"onTool($event)\"\n></geo-map-toolbar>"
3804
+ }
3805
+ ],
3806
+ "example": "<geo-map-toolbar\n [controller]=\"ctrl\"\n [actions]=\"actions\"\n [(checkedMap)]=\"checked\"\n (actionClick)=\"onTool($event)\"\n></geo-map-toolbar>",
3807
+ "related": []
3808
+ },
3809
+ {
3810
+ "name": "GeoMapZoomComponent",
3811
+ "selector": "geo-map-zoom",
3812
+ "category": "map",
3813
+ "summary": "Zoom +/- and optional province / home navigation control.",
3814
+ "whenToUse": "Custom map chrome; geo-map-shell embeds this.",
3815
+ "doNotUseWhen": "Relying on OpenLayers built-in zoom alone is fine for bare geo-map.",
3816
+ "howTo": "",
3817
+ "tips": [],
3818
+ "binding": "none",
3819
+ "cva": false,
3820
+ "path": "projects/geo-ui/src/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.ts",
3821
+ "doc": "ai/components/geo-map-zoom.md",
3822
+ "inputs": [
3823
+ {
3824
+ "name": "controller",
3825
+ "type": "GeoMapController | null",
3826
+ "default": "null",
3827
+ "note": ""
3828
+ },
3829
+ {
3830
+ "name": "showNav",
3831
+ "type": "boolean",
3832
+ "default": "true",
3833
+ "note": "Show prev / next zoom + fullscreen + box zoom (UC-15)."
3834
+ },
3835
+ {
3836
+ "name": "showFitProvince",
3837
+ "type": "boolean",
3838
+ "default": "true",
3839
+ "note": "Show “xem toàn tỉnh” (TCQH.14 GD5) — fit province extent, not fullscreen."
3840
+ },
3841
+ {
3842
+ "name": "provinceExtent",
3843
+ "type": "readonly [number, number, number, number] | null",
3844
+ "default": "null",
3845
+ "note": "Province extent in EPSG:4326. Defaults to Lâm Đồng placeholder when omitted."
3846
+ },
3847
+ {
3848
+ "name": "fullscreenTarget",
3849
+ "type": "HTMLElement | null",
3850
+ "default": "null",
3851
+ "note": "Element to put in Fullscreen API. Defaults to closest `.geo-map-shell`, then the OL map target."
3852
+ }
3853
+ ],
3854
+ "outputs": [],
3855
+ "examples": [
1320
3856
  {
1321
- "name": "errorMessage",
3857
+ "title": "Example",
3858
+ "lang": "html",
3859
+ "code": "<geo-map-zoom [controller]=\"ctrl\" [showNav]=\"true\"></geo-map-zoom>"
3860
+ }
3861
+ ],
3862
+ "example": "<geo-map-zoom [controller]=\"ctrl\" [showNav]=\"true\"></geo-map-zoom>",
3863
+ "related": []
3864
+ },
3865
+ {
3866
+ "name": "GeoOverlapResultComponent",
3867
+ "selector": "geo-overlap-result",
3868
+ "category": "data",
3869
+ "summary": "Overlap analysis result list (planning type, area, percent).",
3870
+ "whenToUse": "Show giao cắt quy hoạch vs hiện trạng results.",
3871
+ "doNotUseWhen": "Generic tables — use geo-table.",
3872
+ "howTo": "",
3873
+ "tips": [],
3874
+ "binding": "none",
3875
+ "cva": false,
3876
+ "path": "projects/geo-ui/src/lib/figma/geo-overlap-result/geo-overlap-result.component.ts",
3877
+ "doc": "ai/components/geo-overlap-result.md",
3878
+ "inputs": [
3879
+ {
3880
+ "name": "title",
1322
3881
  "type": "string",
1323
- "default": "''",
3882
+ "default": "'Kết quả phân tích chồng lấn'",
1324
3883
  "note": ""
1325
3884
  },
1326
3885
  {
1327
- "name": "maxlength",
1328
- "type": "number",
1329
- "default": "",
3886
+ "name": "rows",
3887
+ "type": "GeoOverlapResultRow[]",
3888
+ "default": "[]",
1330
3889
  "note": ""
1331
3890
  },
1332
3891
  {
1333
- "name": "prefixIcon",
3892
+ "name": "areaUnit",
1334
3893
  "type": "string",
1335
- "default": "",
3894
+ "default": "'m²'",
1336
3895
  "note": ""
1337
3896
  },
1338
3897
  {
1339
- "name": "suffixIcon",
3898
+ "name": "emptyText",
1340
3899
  "type": "string",
1341
- "default": "",
1342
- "note": ""
1343
- },
1344
- {
1345
- "name": "allowClear",
1346
- "type": "boolean",
1347
- "default": "false",
3900
+ "default": "'Chưa có kết quả phân tích.'",
1348
3901
  "note": ""
1349
- },
3902
+ }
3903
+ ],
3904
+ "outputs": [
1350
3905
  {
1351
- "name": "block",
1352
- "type": "boolean",
1353
- "default": "false",
3906
+ "name": "rowClick",
3907
+ "type": "OutputEmitterRef<GeoOverlapResultRow>",
1354
3908
  "note": ""
1355
- },
3909
+ }
3910
+ ],
3911
+ "examples": [
1356
3912
  {
1357
- "name": "width",
1358
- "type": "number | string",
1359
- "default": "",
1360
- "note": ""
3913
+ "title": "Example",
3914
+ "lang": "html",
3915
+ "code": "<geo-overlap-result [rows]=\"rows\" (rowClick)=\"focus($event)\"></geo-overlap-result>"
1361
3916
  }
1362
3917
  ],
1363
- "outputs": [
3918
+ "example": "<geo-overlap-result [rows]=\"rows\" (rowClick)=\"focus($event)\"></geo-overlap-result>",
3919
+ "related": []
3920
+ },
3921
+ {
3922
+ "name": "GeoPageHeaderComponent",
3923
+ "selector": "geo-page-header",
3924
+ "category": "display",
3925
+ "summary": "Compact page header block (title + optional actions slot).",
3926
+ "whenToUse": "Section headers on dashboard / list pages.",
3927
+ "doNotUseWhen": "Full page title under breadcrumb — prefer geo-page-title.",
3928
+ "howTo": "",
3929
+ "tips": [],
3930
+ "binding": "none",
3931
+ "cva": false,
3932
+ "path": "projects/geo-ui/src/lib/figma/geo-page-header/geo-page-header.component.ts",
3933
+ "doc": "ai/components/geo-page-header.md",
3934
+ "inputs": [
1364
3935
  {
1365
- "name": "valueChange",
1366
- "type": "EventEmitter<string>",
3936
+ "name": "title",
3937
+ "type": "string",
3938
+ "default": "''",
1367
3939
  "note": ""
1368
3940
  },
1369
3941
  {
1370
- "name": "enterPressed",
1371
- "type": "EventEmitter<void>",
3942
+ "name": "breadcrumb",
3943
+ "type": "GeoBreadcrumbItem[]",
3944
+ "default": "[]",
3945
+ "note": ""
3946
+ },
3947
+ {
3948
+ "name": "uppercase",
3949
+ "type": "boolean",
3950
+ "default": "true",
1372
3951
  "note": ""
1373
3952
  }
1374
3953
  ],
3954
+ "outputs": [],
1375
3955
  "examples": [
1376
3956
  {
1377
- "title": "Basic",
1378
- "lang": "html",
1379
- "code": "<geo-input label=\"Họ tên\" [required]=\"true\" [block]=\"true\" [(ngModel)]=\"name\"></geo-input>"
1380
- },
1381
- {
1382
- "title": "Full options",
3957
+ "title": "Example",
1383
3958
  "lang": "html",
1384
- "code": "<geo-input\n label=\"Mã hồ sơ\"\n placeholder=\"Nhập hồ sơ\"\n type=\"text\"\n prefixIcon=\"search\"\n [allowClear]=\"true\"\n [required]=\"true\"\n [block]=\"true\"\n [maxlength]=\"50\"\n [error]=\"codeError\"\n errorMessage=\"Mã không được để trống\"\n [(ngModel)]=\"code\"\n (enterPressed)=\"onSearch()\"\n (valueChange)=\"onCode($event)\"\n></geo-input>"
3959
+ "code": "<geo-page-header title=\"Thống nhanh\"></geo-page-header>"
1385
3960
  }
1386
3961
  ],
1387
- "example": "<geo-input label=\"Họ tên\" [required]=\"true\" [block]=\"true\" [(ngModel)]=\"name\"></geo-input>",
1388
- "related": [
1389
- "geo-textarea",
1390
- "geo-select",
1391
- "geo-form-modal"
1392
- ]
3962
+ "example": "<geo-page-header title=\"Thống nhanh\"></geo-page-header>",
3963
+ "related": []
1393
3964
  },
1394
3965
  {
1395
3966
  "name": "GeoPageTitleComponent",
@@ -1482,13 +4053,13 @@
1482
4053
  "name": "pageIndex",
1483
4054
  "type": "number",
1484
4055
  "default": "1",
1485
- "note": ""
4056
+ "note": "Two-way `model()` (supports banana binding)."
1486
4057
  },
1487
4058
  {
1488
4059
  "name": "pageSize",
1489
4060
  "type": "number",
1490
4061
  "default": "10",
1491
- "note": ""
4062
+ "note": "Two-way `model()` (supports banana binding)."
1492
4063
  },
1493
4064
  {
1494
4065
  "name": "total",
@@ -1527,18 +4098,7 @@
1527
4098
  "note": ""
1528
4099
  }
1529
4100
  ],
1530
- "outputs": [
1531
- {
1532
- "name": "pageIndexChange",
1533
- "type": "EventEmitter<number>",
1534
- "note": ""
1535
- },
1536
- {
1537
- "name": "pageSizeChange",
1538
- "type": "EventEmitter<number>",
1539
- "note": ""
1540
- }
1541
- ],
4101
+ "outputs": [],
1542
4102
  "examples": [
1543
4103
  {
1544
4104
  "title": "Basic",
@@ -1645,7 +4205,7 @@
1645
4205
  "outputs": [
1646
4206
  {
1647
4207
  "name": "valueChange",
1648
- "type": "EventEmitter<string | number | null>",
4208
+ "type": "OutputEmitterRef<string | number | null>",
1649
4209
  "note": ""
1650
4210
  }
1651
4211
  ],
@@ -1701,12 +4261,12 @@
1701
4261
  "outputs": [
1702
4262
  {
1703
4263
  "name": "edit",
1704
- "type": "EventEmitter<void>",
1705
- "note": "Action ưu tiên hiển thị khi có > 2 thao tác (mặc định: edit) */ @Input() primaryActionKey = 'edit'; @Output() actionClick = new EventEmitter<string>(); /** @deprecated Dùng `actionClick` với key `edit`"
4264
+ "type": "OutputEmitterRef<void>",
4265
+ "note": "Action ưu tiên hiển thị khi có > 2 thao tác (mặc định: edit) */ readonly primaryActionKey = input('edit'); readonly actionClick = output<string>(); /** @deprecated Dùng `actionClick` với key `edit`"
1706
4266
  },
1707
4267
  {
1708
4268
  "name": "more",
1709
- "type": "EventEmitter<void>",
4269
+ "type": "OutputEmitterRef<void>",
1710
4270
  "note": "@deprecated Dùng `actionClick` với key `more`"
1711
4271
  }
1712
4272
  ],
@@ -1821,15 +4381,15 @@
1821
4381
  },
1822
4382
  {
1823
4383
  "name": "width",
1824
- "type": "number | string",
1825
- "default": "",
4384
+ "type": "number | string | undefined",
4385
+ "default": "undefined",
1826
4386
  "note": ""
1827
4387
  }
1828
4388
  ],
1829
4389
  "outputs": [
1830
4390
  {
1831
4391
  "name": "valueChange",
1832
- "type": "EventEmitter<string | number | Array<string | number> | null>",
4392
+ "type": "OutputEmitterRef<string | number | Array<string | number> | null>",
1833
4393
  "note": ""
1834
4394
  }
1835
4395
  ],
@@ -1857,7 +4417,7 @@
1857
4417
  "selector": "geo-slider",
1858
4418
  "category": "forms",
1859
4419
  "summary": "Numeric range slider.",
1860
- "whenToUse": "Continuous numeric value in a range.",
4420
+ "whenToUse": "Continuous numeric value in a range (opacity, percent).",
1861
4421
  "doNotUseWhen": "Discrete small sets — use select/radio.",
1862
4422
  "howTo": "Thanh trượt số liên tục. Two-way [(value)] / (valueChange); min/max/step; tipFormatter tùy chỉnh tooltip.",
1863
4423
  "tips": [
@@ -1874,7 +4434,7 @@
1874
4434
  "name": "value",
1875
4435
  "type": "number",
1876
4436
  "default": "0",
1877
- "note": ""
4437
+ "note": "Two-way `model()` (supports banana binding)."
1878
4438
  },
1879
4439
  {
1880
4440
  "name": "min",
@@ -1902,18 +4462,12 @@
1902
4462
  },
1903
4463
  {
1904
4464
  "name": "tipFormatter",
1905
- "type": "(value: number)",
1906
- "default": "> string",
1907
- "note": ""
1908
- }
1909
- ],
1910
- "outputs": [
1911
- {
1912
- "name": "valueChange",
1913
- "type": "EventEmitter<number>",
4465
+ "type": "((value: number) => string) | undefined",
4466
+ "default": "undefined",
1914
4467
  "note": ""
1915
4468
  }
1916
4469
  ],
4470
+ "outputs": [],
1917
4471
  "examples": [
1918
4472
  {
1919
4473
  "title": "Basic",
@@ -1932,6 +4486,98 @@
1932
4486
  "geo-select"
1933
4487
  ]
1934
4488
  },
4489
+ {
4490
+ "name": "GeoStatCardComponent",
4491
+ "selector": "geo-stat-card",
4492
+ "category": "data",
4493
+ "summary": "KPI stat card (label, value, optional delta / icon).",
4494
+ "whenToUse": "Dashboard summary tiles.",
4495
+ "doNotUseWhen": "Detailed tables — use geo-table.",
4496
+ "howTo": "",
4497
+ "tips": [],
4498
+ "binding": "none",
4499
+ "cva": false,
4500
+ "path": "projects/geo-ui/src/lib/figma/geo-stat-card/geo-stat-card.component.ts",
4501
+ "doc": "ai/components/geo-stat-card.md",
4502
+ "inputs": [
4503
+ {
4504
+ "name": "label",
4505
+ "type": "string",
4506
+ "default": "''",
4507
+ "note": ""
4508
+ },
4509
+ {
4510
+ "name": "value",
4511
+ "type": "string | number",
4512
+ "default": "''",
4513
+ "note": ""
4514
+ },
4515
+ {
4516
+ "name": "unit",
4517
+ "type": "string",
4518
+ "default": "''",
4519
+ "note": ""
4520
+ },
4521
+ {
4522
+ "name": "icon",
4523
+ "type": "string",
4524
+ "default": "'bar-chart'",
4525
+ "note": ""
4526
+ },
4527
+ {
4528
+ "name": "hint",
4529
+ "type": "string",
4530
+ "default": "''",
4531
+ "note": ""
4532
+ },
4533
+ {
4534
+ "name": "clickable",
4535
+ "type": "boolean",
4536
+ "default": "false",
4537
+ "note": ""
4538
+ },
4539
+ {
4540
+ "name": "animate",
4541
+ "type": "boolean",
4542
+ "default": "true",
4543
+ "note": "Count-up number animation. Honors `prefers-reduced-motion`."
4544
+ },
4545
+ {
4546
+ "name": "animationDuration",
4547
+ "type": "number",
4548
+ "default": "1000",
4549
+ "note": "Count-up duration in ms."
4550
+ },
4551
+ {
4552
+ "name": "animationDelay",
4553
+ "type": "number",
4554
+ "default": "0",
4555
+ "note": "Stagger delay before count-up starts (ms)."
4556
+ },
4557
+ {
4558
+ "name": "item",
4559
+ "type": "GeoStatCardItem | null",
4560
+ "default": "null",
4561
+ "note": "Convenience: bind a whole item object."
4562
+ }
4563
+ ],
4564
+ "outputs": [
4565
+ {
4566
+ "name": "clicked",
4567
+ "type": "OutputEmitterRef<void>",
4568
+ "note": ""
4569
+ }
4570
+ ],
4571
+ "examples": [
4572
+ {
4573
+ "title": "Example",
4574
+ "lang": "html",
4575
+ "code": "<geo-stat-card label=\"Tổng thửa\" [value]=\"12450\" unit=\"thửa\"></geo-stat-card>"
4576
+ }
4577
+ ],
4578
+ "example": "<geo-stat-card label=\"Tổng thửa\" [value]=\"12450\" unit=\"thửa\"></geo-stat-card>",
4579
+ "related": []
4580
+ },
1935
4581
  {
1936
4582
  "name": "GeoStatusTagComponent",
1937
4583
  "selector": "geo-status-tag",
@@ -1958,8 +4604,8 @@
1958
4604
  },
1959
4605
  {
1960
4606
  "name": "label",
1961
- "type": "string",
1962
- "default": "",
4607
+ "type": "string | undefined",
4608
+ "default": "undefined",
1963
4609
  "note": "Override label text."
1964
4610
  },
1965
4611
  {
@@ -2016,7 +4662,7 @@
2016
4662
  "name": "activeIndex",
2017
4663
  "type": "number",
2018
4664
  "default": "0",
2019
- "note": ""
4665
+ "note": "Two-way `model()` (supports banana binding)."
2020
4666
  },
2021
4667
  {
2022
4668
  "name": "title",
@@ -2110,34 +4756,29 @@
2110
4756
  }
2111
4757
  ],
2112
4758
  "outputs": [
2113
- {
2114
- "name": "activeIndexChange",
2115
- "type": "EventEmitter<number>",
2116
- "note": ""
2117
- },
2118
4759
  {
2119
4760
  "name": "stepSelect",
2120
- "type": "EventEmitter<{ index: number; step: GeoStepperStep }>",
4761
+ "type": "OutputEmitterRef<{ index: number; step: GeoStepperStep }>",
2121
4762
  "note": ""
2122
4763
  },
2123
4764
  {
2124
4765
  "name": "cancel",
2125
- "type": "EventEmitter<void>",
4766
+ "type": "OutputEmitterRef<void>",
2126
4767
  "note": ""
2127
4768
  },
2128
4769
  {
2129
4770
  "name": "previous",
2130
- "type": "EventEmitter<void>",
4771
+ "type": "OutputEmitterRef<void>",
2131
4772
  "note": ""
2132
4773
  },
2133
4774
  {
2134
4775
  "name": "save",
2135
- "type": "EventEmitter<void>",
4776
+ "type": "OutputEmitterRef<void>",
2136
4777
  "note": ""
2137
4778
  },
2138
4779
  {
2139
4780
  "name": "next",
2140
- "type": "EventEmitter<void>",
4781
+ "type": "OutputEmitterRef<void>",
2141
4782
  "note": ""
2142
4783
  }
2143
4784
  ],
@@ -2188,7 +4829,7 @@
2188
4829
  "name": "activeIndex",
2189
4830
  "type": "number",
2190
4831
  "default": "0",
2191
- "note": ""
4832
+ "note": "Two-way `model()` (supports banana binding)."
2192
4833
  },
2193
4834
  {
2194
4835
  "name": "orientation",
@@ -2204,14 +4845,9 @@
2204
4845
  }
2205
4846
  ],
2206
4847
  "outputs": [
2207
- {
2208
- "name": "activeIndexChange",
2209
- "type": "EventEmitter<number>",
2210
- "note": ""
2211
- },
2212
4848
  {
2213
4849
  "name": "stepSelect",
2214
- "type": "EventEmitter<{ index: number; step: GeoStepperStep }>",
4850
+ "type": "OutputEmitterRef<{ index: number; step: GeoStepperStep }>",
2215
4851
  "note": ""
2216
4852
  }
2217
4853
  ],
@@ -2322,18 +4958,18 @@
2322
4958
  "name": "pageIndex",
2323
4959
  "type": "number",
2324
4960
  "default": "1",
2325
- "note": ""
4961
+ "note": "Two-way `model()` (supports banana binding)."
2326
4962
  },
2327
4963
  {
2328
4964
  "name": "pageSize",
2329
4965
  "type": "number",
2330
4966
  "default": "10",
2331
- "note": ""
4967
+ "note": "Two-way `model()` (supports banana binding)."
2332
4968
  },
2333
4969
  {
2334
4970
  "name": "total",
2335
- "type": "number",
2336
- "default": "",
4971
+ "type": "number | undefined",
4972
+ "default": "undefined",
2337
4973
  "note": ""
2338
4974
  },
2339
4975
  {
@@ -2375,13 +5011,13 @@
2375
5011
  {
2376
5012
  "name": "scroll",
2377
5013
  "type": "{ x?: string; y?: string }",
2378
- "default": "{}",
5014
+ "default": "",
2379
5015
  "note": ""
2380
5016
  },
2381
5017
  {
2382
5018
  "name": "scrollY",
2383
- "type": "string",
2384
- "default": "",
5019
+ "type": "string | undefined",
5020
+ "default": "undefined",
2385
5021
  "note": ""
2386
5022
  },
2387
5023
  {
@@ -2392,14 +5028,14 @@
2392
5028
  },
2393
5029
  {
2394
5030
  "name": "tableTitle",
2395
- "type": "string",
2396
- "default": "",
5031
+ "type": "string | undefined",
5032
+ "default": "undefined",
2397
5033
  "note": ""
2398
5034
  },
2399
5035
  {
2400
5036
  "name": "footer",
2401
- "type": "string",
2402
- "default": "",
5037
+ "type": "string | undefined",
5038
+ "default": "undefined",
2403
5039
  "note": ""
2404
5040
  },
2405
5041
  {
@@ -2430,12 +5066,12 @@
2430
5066
  "name": "selectedKeys",
2431
5067
  "type": "string[]",
2432
5068
  "default": "[]",
2433
- "note": ""
5069
+ "note": "Two-way `model()` (supports banana binding)."
2434
5070
  },
2435
5071
  {
2436
5072
  "name": "mobileTitleKey",
2437
- "type": "string",
2438
- "default": "",
5073
+ "type": "string | undefined",
5074
+ "default": "undefined",
2439
5075
  "note": "Mobile card: key cột làm tiêu đề. Ưu tiên hơn `column.mobileTitle`; nếu không set thì lấy cột dữ liệu đầu tiên."
2440
5076
  },
2441
5077
  {
@@ -2448,52 +5084,37 @@
2448
5084
  "outputs": [
2449
5085
  {
2450
5086
  "name": "rowClick",
2451
- "type": "EventEmitter<Record<string, unknown>>",
5087
+ "type": "OutputEmitterRef<Record<string, unknown>>",
2452
5088
  "note": ""
2453
5089
  },
2454
5090
  {
2455
5091
  "name": "rowEdit",
2456
- "type": "EventEmitter<Record<string, unknown>>",
5092
+ "type": "OutputEmitterRef<Record<string, unknown>>",
2457
5093
  "note": ""
2458
5094
  },
2459
5095
  {
2460
5096
  "name": "rowMore",
2461
- "type": "EventEmitter<Record<string, unknown>>",
5097
+ "type": "OutputEmitterRef<Record<string, unknown>>",
2462
5098
  "note": ""
2463
5099
  },
2464
5100
  {
2465
5101
  "name": "rowAction",
2466
- "type": "EventEmitter<{ row: Record<string, unknown>; action: string }>",
2467
- "note": ""
2468
- },
2469
- {
2470
- "name": "pageIndexChange",
2471
- "type": "EventEmitter<number>",
2472
- "note": ""
2473
- },
2474
- {
2475
- "name": "pageSizeChange",
2476
- "type": "EventEmitter<number>",
5102
+ "type": "OutputEmitterRef<{ row: Record<string, unknown>; action: string }>",
2477
5103
  "note": ""
2478
5104
  },
2479
5105
  {
2480
5106
  "name": "queryParams",
2481
- "type": "EventEmitter<NzTableQueryParams>",
5107
+ "type": "OutputEmitterRef<NzTableQueryParams>",
2482
5108
  "note": ""
2483
5109
  },
2484
5110
  {
2485
5111
  "name": "currentPageDataChange",
2486
- "type": "EventEmitter<readonly Record<string, unknown>[]>",
2487
- "note": ""
2488
- },
2489
- {
2490
- "name": "selectedKeysChange",
2491
- "type": "EventEmitter<string[]>",
5112
+ "type": "OutputEmitterRef<readonly Record<string, unknown>[]>",
2492
5113
  "note": ""
2493
5114
  },
2494
5115
  {
2495
5116
  "name": "selectionChange",
2496
- "type": "EventEmitter<Record<string, unknown>[]>",
5117
+ "type": "OutputEmitterRef<Record<string, unknown>[]>",
2497
5118
  "note": ""
2498
5119
  }
2499
5120
  ],
@@ -2595,7 +5216,7 @@
2595
5216
  "name": "advancedExpanded",
2596
5217
  "type": "boolean",
2597
5218
  "default": "false",
2598
- "note": "Mở panel field nâng cao (`[advanced]`)."
5219
+ "note": "Mở panel field nâng cao (`[advanced]`). — Two-way `model()` (supports banana binding)."
2599
5220
  },
2600
5221
  {
2601
5222
  "name": "advancedFilterCount",
@@ -2619,17 +5240,12 @@
2619
5240
  "outputs": [
2620
5241
  {
2621
5242
  "name": "search",
2622
- "type": "EventEmitter<void>",
5243
+ "type": "OutputEmitterRef<void>",
2623
5244
  "note": ""
2624
5245
  },
2625
5246
  {
2626
5247
  "name": "reset",
2627
- "type": "EventEmitter<void>",
2628
- "note": ""
2629
- },
2630
- {
2631
- "name": "advancedExpandedChange",
2632
- "type": "EventEmitter<boolean>",
5248
+ "type": "OutputEmitterRef<void>",
2633
5249
  "note": ""
2634
5250
  }
2635
5251
  ],
@@ -2676,13 +5292,13 @@
2676
5292
  "name": "pageIndex",
2677
5293
  "type": "number",
2678
5294
  "default": "1",
2679
- "note": ""
5295
+ "note": "Two-way `model()` (supports banana binding)."
2680
5296
  },
2681
5297
  {
2682
5298
  "name": "pageSize",
2683
5299
  "type": "number",
2684
5300
  "default": "10",
2685
- "note": ""
5301
+ "note": "Two-way `model()` (supports banana binding)."
2686
5302
  },
2687
5303
  {
2688
5304
  "name": "total",
@@ -2721,18 +5337,7 @@
2721
5337
  "note": ""
2722
5338
  }
2723
5339
  ],
2724
- "outputs": [
2725
- {
2726
- "name": "pageIndexChange",
2727
- "type": "EventEmitter<number>",
2728
- "note": ""
2729
- },
2730
- {
2731
- "name": "pageSizeChange",
2732
- "type": "EventEmitter<number>",
2733
- "note": ""
2734
- }
2735
- ],
5340
+ "outputs": [],
2736
5341
  "examples": [
2737
5342
  {
2738
5343
  "title": "Basic",
@@ -2825,35 +5430,35 @@
2825
5430
  },
2826
5431
  {
2827
5432
  "name": "columnStorageKey",
2828
- "type": "string",
2829
- "default": "",
5433
+ "type": "string | undefined",
5434
+ "default": "undefined",
2830
5435
  "note": "Key lưu trạng thái ẩn/hiện cột trong sessionStorage"
2831
5436
  }
2832
5437
  ],
2833
5438
  "outputs": [
2834
5439
  {
2835
5440
  "name": "deleteClick",
2836
- "type": "EventEmitter<void>",
5441
+ "type": "OutputEmitterRef<void>",
2837
5442
  "note": ""
2838
5443
  },
2839
5444
  {
2840
5445
  "name": "exportClick",
2841
- "type": "EventEmitter<void>",
5446
+ "type": "OutputEmitterRef<void>",
2842
5447
  "note": ""
2843
5448
  },
2844
5449
  {
2845
5450
  "name": "toggleColumns",
2846
- "type": "EventEmitter<void>",
5451
+ "type": "OutputEmitterRef<void>",
2847
5452
  "note": ""
2848
5453
  },
2849
5454
  {
2850
5455
  "name": "columnApply",
2851
- "type": "EventEmitter<GeoColumnPickerApplyPayload>",
5456
+ "type": "OutputEmitterRef<GeoColumnPickerApplyPayload>",
2852
5457
  "note": ""
2853
5458
  },
2854
5459
  {
2855
5460
  "name": "addClick",
2856
- "type": "EventEmitter<void>",
5461
+ "type": "OutputEmitterRef<void>",
2857
5462
  "note": ""
2858
5463
  }
2859
5464
  ],
@@ -2916,13 +5521,13 @@
2916
5521
  "name": "selectedIndex",
2917
5522
  "type": "number",
2918
5523
  "default": "0",
2919
- "note": ""
5524
+ "note": "Two-way `model()` (supports banana binding)."
2920
5525
  },
2921
5526
  {
2922
5527
  "name": "selectedKey",
2923
- "type": "string",
2924
- "default": "",
2925
- "note": ""
5528
+ "type": "string | undefined",
5529
+ "default": "undefined",
5530
+ "note": "Two-way `model()` (supports banana binding)."
2926
5531
  },
2927
5532
  {
2928
5533
  "name": "centered",
@@ -2938,19 +5543,9 @@
2938
5543
  }
2939
5544
  ],
2940
5545
  "outputs": [
2941
- {
2942
- "name": "selectedIndexChange",
2943
- "type": "EventEmitter<number>",
2944
- "note": ""
2945
- },
2946
- {
2947
- "name": "selectedKeyChange",
2948
- "type": "EventEmitter<string>",
2949
- "note": ""
2950
- },
2951
5546
  {
2952
5547
  "name": "tabChange",
2953
- "type": "EventEmitter<{ index: number; key: string }>",
5548
+ "type": "OutputEmitterRef<{ index: number; key: string }>",
2954
5549
  "note": ""
2955
5550
  }
2956
5551
  ],
@@ -3034,8 +5629,8 @@
3034
5629
  },
3035
5630
  {
3036
5631
  "name": "maxlength",
3037
- "type": "number",
3038
- "default": "",
5632
+ "type": "number | undefined",
5633
+ "default": "undefined",
3039
5634
  "note": ""
3040
5635
  },
3041
5636
  {
@@ -3048,7 +5643,7 @@
3048
5643
  "outputs": [
3049
5644
  {
3050
5645
  "name": "valueChange",
3051
- "type": "EventEmitter<string>",
5646
+ "type": "OutputEmitterRef<string>",
3052
5647
  "note": ""
3053
5648
  }
3054
5649
  ],
@@ -3122,19 +5717,19 @@
3122
5717
  "name": "visible",
3123
5718
  "type": "boolean",
3124
5719
  "default": "true",
3125
- "note": ""
5720
+ "note": "Two-way `model()` (supports banana binding)."
3126
5721
  },
3127
5722
  {
3128
5723
  "name": "icon",
3129
- "type": "string",
3130
- "default": "",
5724
+ "type": "string | undefined",
5725
+ "default": "undefined",
3131
5726
  "note": "Override Ant Design icon type."
3132
5727
  }
3133
5728
  ],
3134
5729
  "outputs": [
3135
5730
  {
3136
5731
  "name": "closed",
3137
- "type": "EventEmitter<void>",
5732
+ "type": "OutputEmitterRef<void>",
3138
5733
  "note": ""
3139
5734
  }
3140
5735
  ],
@@ -3190,13 +5785,13 @@
3190
5785
  "name": "checkedKeys",
3191
5786
  "type": "Array<string | number>",
3192
5787
  "default": "[]",
3193
- "note": ""
5788
+ "note": "Two-way `model()` (supports banana binding)."
3194
5789
  },
3195
5790
  {
3196
5791
  "name": "expandedKeys",
3197
5792
  "type": "Array<string | number>",
3198
5793
  "default": "[]",
3199
- "note": ""
5794
+ "note": "Two-way `model()` (supports banana binding)."
3200
5795
  },
3201
5796
  {
3202
5797
  "name": "showLine",
@@ -3212,19 +5807,9 @@
3212
5807
  }
3213
5808
  ],
3214
5809
  "outputs": [
3215
- {
3216
- "name": "checkedKeysChange",
3217
- "type": "EventEmitter<Array<string | number>>",
3218
- "note": ""
3219
- },
3220
- {
3221
- "name": "expandedKeysChange",
3222
- "type": "EventEmitter<Array<string | number>>",
3223
- "note": ""
3224
- },
3225
5810
  {
3226
5811
  "name": "nodeClick",
3227
- "type": "EventEmitter<NzFormatEmitEvent>",
5812
+ "type": "OutputEmitterRef<NzFormatEmitEvent>",
3228
5813
  "note": ""
3229
5814
  }
3230
5815
  ],
@@ -3432,18 +6017,18 @@
3432
6017
  "name": "fileList",
3433
6018
  "type": "GeoUploadFile[]",
3434
6019
  "default": "[]",
3435
- "note": "Controlled file list."
6020
+ "note": "Controlled file list. — Two-way `model()` (supports banana binding)."
3436
6021
  },
3437
6022
  {
3438
6023
  "name": "headers",
3439
- "type": "{} | ((file: NzUploadFile) => {} | Observable<{}>)",
3440
- "default": "",
6024
+ "type": "{} | ((file: NzUploadFile) => {} | Observable<{}>) | undefined",
6025
+ "default": "undefined",
3441
6026
  "note": ""
3442
6027
  },
3443
6028
  {
3444
6029
  "name": "data",
3445
- "type": "{} | ((file: NzUploadFile) => {} | Observable<{}>)",
3446
- "default": "",
6030
+ "type": "{} | ((file: NzUploadFile) => {} | Observable<{}>) | undefined",
6031
+ "default": "undefined",
3447
6032
  "note": ""
3448
6033
  },
3449
6034
  {
@@ -3466,36 +6051,31 @@
3466
6051
  },
3467
6052
  {
3468
6053
  "name": "customRequest",
3469
- "type": "(item: NzUploadXHRArgs) => Subscription",
3470
- "default": "",
6054
+ "type": "GeoUploadCustomRequest | undefined",
6055
+ "default": "undefined",
3471
6056
  "note": "Custom XHR — mặc định simulate progress khi không có `action`."
3472
6057
  },
3473
6058
  {
3474
6059
  "name": "beforeUpload",
3475
- "type": "( file: NzUploadFile, fileList: NzUploadFile[] )",
3476
- "default": "> boolean | Observable<boolean>",
6060
+ "type": "((file: NzUploadFile, fileList: NzUploadFile[]) => boolean | Observable<boolean>) | undefined",
6061
+ "default": "undefined",
3477
6062
  "note": ""
3478
6063
  }
3479
6064
  ],
3480
6065
  "outputs": [
3481
- {
3482
- "name": "fileListChange",
3483
- "type": "EventEmitter<GeoUploadFile[]>",
3484
- "note": ""
3485
- },
3486
6066
  {
3487
6067
  "name": "change",
3488
- "type": "EventEmitter<NzUploadChangeParam>",
6068
+ "type": "OutputEmitterRef<NzUploadChangeParam>",
3489
6069
  "note": ""
3490
6070
  },
3491
6071
  {
3492
6072
  "name": "remove",
3493
- "type": "EventEmitter<GeoUploadFile>",
6073
+ "type": "OutputEmitterRef<GeoUploadFile>",
3494
6074
  "note": ""
3495
6075
  },
3496
6076
  {
3497
6077
  "name": "reject",
3498
- "type": "EventEmitter<{ file: File; reason: 'type' | 'size' }>",
6078
+ "type": "OutputEmitterRef<{ file: File; reason: 'type' | 'size' }>",
3499
6079
  "note": ""
3500
6080
  }
3501
6081
  ],