@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/AGENTS.md CHANGED
@@ -2,7 +2,18 @@
2
2
 
3
3
  Package name: **`@geoit/ui`**
4
4
 
5
- Canonical AI docs live under **`ai/`**:
5
+ Canonical AI docs live under **`ai/`**.
6
+
7
+ ## Library code (`src/lib/figma`)
8
+
9
+ Use **Angular 18** conventions:
10
+
11
+ - `input()` / `output()` / `model()` — not `@Input` / `@Output`
12
+ - `ChangeDetectionStrategy.OnPush`
13
+ - `@if` / `@for`; `inject()` for DI
14
+ - See `.cursor/rules/angular-18-figma.mdc`
15
+
16
+ ## AI docs
6
17
 
7
18
  | File | Purpose |
8
19
  |------|---------|
@@ -12,14 +23,7 @@ Canonical AI docs live under **`ai/`**:
12
23
  | [`ai/recipes.md`](./ai/recipes.md) | Copy-paste UI recipes |
13
24
  | [`ai/README.md`](./ai/README.md) | Index |
14
25
 
15
- Regenerate component docs + catalog:
16
-
17
26
  ```bash
18
27
  npm run ai:docs
19
- ```
20
-
21
- Install in other projects:
22
-
23
- ```bash
24
28
  npm install @geoit/ui
25
29
  ```
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @geoit/ui
2
2
 
3
- GEO design system for **Angular 18** + **ng-zorro 18**. Standalone components, design tokens, and AI-ready usage docs.
3
+ GEO design system for **Angular 18** + **ng-zorro 18**. Standalone components, design tokens, and AI-ready usage docs (shipped in the package under `ai/`).
4
4
 
5
5
  ## Install
6
6
 
@@ -12,63 +12,68 @@ npm install @geoit/ui
12
12
 
13
13
  ```bash
14
14
  npm install @angular/animations@^18 @angular/common@^18 @angular/core@^18 \
15
- @angular/forms@^18 @angular/cdk@^18 @ant-design/icons-angular@^18 ng-zorro-antd@^18
15
+ @angular/forms@^18 @angular/cdk@^18 @ant-design/icons-angular@^18 ng-zorro-antd@^18 \
16
+ ol@^10 proj4@^2
16
17
  ```
17
18
 
19
+ > `ol` + `proj4` are required when you use map components (`geo-map`, `geo-map-shell`, …).
20
+
18
21
  ## Setup styles (once per app)
19
22
 
20
23
  In your global styles (e.g. `styles.scss`):
21
24
 
22
25
  ```scss
23
- @import 'node_modules/@geoit/ui/src/lib/styles/design-tokens.scss';
24
- @import 'node_modules/@geoit/ui/src/lib/styles/theme.scss';
26
+ @import "node_modules/ng-zorro-antd/ng-zorro-antd.min.css";
27
+ @import "node_modules/@geoit/ui/src/lib/styles/design-tokens.scss";
28
+ @import "node_modules/@geoit/ui/src/lib/styles/theme.scss";
29
+ ```
30
+
31
+ Providers (animations + Vietnamese i18n for date pickers):
32
+
33
+ ```ts
34
+ import { provideAnimations } from "@angular/platform-browser/animations";
35
+ import { provideNzI18n, vi_VN } from "ng-zorro-antd/i18n";
36
+ import { registerLocaleData } from "@angular/common";
37
+ import vi from "@angular/common/locales/vi";
38
+
39
+ registerLocaleData(vi);
40
+
41
+ // in appConfig.providers:
42
+ provideAnimations(),
43
+ provideNzI18n(vi_VN),
25
44
  ```
26
45
 
27
46
  Use tokens in your CSS — do not hardcode brand colors or radius:
28
47
 
29
48
  - `var(--geo-color-primary-default)`
30
- - `var(--geo-radius)` (default **6px**)
49
+ - `var(--geo-radius)` (default **8px**; md/lg/xl for chips & popovers)
31
50
 
32
51
  ## Quick start
33
52
 
34
53
  ```ts
35
- import { Component } from '@angular/core';
36
- import { FormsModule } from '@angular/forms';
37
- import {
38
- GeoButtonComponent,
39
- GeoInputComponent,
40
- GeoFormModalComponent,
41
- GeoToastService,
42
- } from '@geoit/ui';
54
+ import { Component } from "@angular/core";
55
+ import { FormsModule } from "@angular/forms";
56
+ import { GeoButtonComponent, GeoInputComponent, GeoFormModalComponent, GeoToastService } from "@geoit/ui";
43
57
 
44
58
  @Component({
45
59
  standalone: true,
46
60
  imports: [FormsModule, GeoButtonComponent, GeoInputComponent, GeoFormModalComponent],
47
61
  template: `
48
- <geo-button appearance="primary" color="brand" icon="plus" (clicked)="open = true">
49
- Thêm mới
50
- </geo-button>
51
-
52
- <geo-form-modal
53
- [open]="open"
54
- title="Thêm mới"
55
- cancelText="Hủy bỏ"
56
- okText="Lưu"
57
- (openChange)="open = $event"
58
- (ok)="save()"
59
- >
62
+ <geo-button appearance="primary" color="brand" icon="plus" (clicked)="open = true"> Thêm mới </geo-button>
63
+
64
+ <geo-form-modal [open]="open" title="Thêm mới" cancelText="Hủy bỏ" okText="Lưu" (openChange)="open = $event" (ok)="save()">
60
65
  <geo-input label="Tên" [required]="true" [block]="true" [(ngModel)]="name"></geo-input>
61
66
  </geo-form-modal>
62
67
  `,
63
68
  })
64
69
  export class DemoComponent {
65
70
  open = false;
66
- name = '';
71
+ name = "";
67
72
 
68
73
  constructor(private toast: GeoToastService) {}
69
74
 
70
75
  save(): void {
71
- this.toast.success('Thành công!', 'Đã lưu.');
76
+ this.toast.success("Thành công!", "Đã lưu.");
72
77
  this.open = false;
73
78
  }
74
79
  }
@@ -76,33 +81,37 @@ export class DemoComponent {
76
81
 
77
82
  ## Common components
78
83
 
79
- | Need | Component | Example |
80
- |------|-----------|---------|
81
- | Button / CTA | `geo-button` | `<geo-button appearance="primary" color="brand">Lưu</geo-button>` |
82
- | Text field | `geo-input` | `<geo-input label="Họ tên" [(ngModel)]="name" [block]="true">` |
83
- | Select | `geo-select` | `<geo-select [options]="opts" [(ngModel)]="v" [block]="true">` |
84
- | Checkbox | `geo-checkbox` | `<geo-checkbox label="Đồng ý" [(checked)]="ok">` |
85
- | Radio | `geo-radio` | `<geo-radio [options]="opts" [(ngModel)]="v">` |
86
- | Form dialog | `geo-form-modal` | See Quick start |
87
- | Confirm delete | `geo-confirm-modal` | `[visible]` + `(confirm)` |
88
- | Steps in dialog | `geo-form-modal` + `geo-stepper` | See recipes |
89
- | Page title | `geo-page-title` | `<geo-page-title title="Chi tiết hồ sơ">` |
90
- | Breadcrumb | `geo-breadcrumb` | `[items]="[{ label, link? }]"` |
91
- | Toast | `GeoToastService` | `this.toast.success(title, message)` |
92
- | Alert | `geo-alert` | `type="success" \| "error" \| …` |
93
- | Status pill | `geo-status-tag` | `status="success" label="Đã duyệt"` |
94
- | Table | `geo-table` | `[columns]` + `[data]` + paging |
95
- | Upload | `geo-upload` | Drag-drop multi-file |
96
- | Typography | `geo-typography` | `variant="h3" \| "body" \| …` |
84
+ | Need | Component | Example |
85
+ | --------------- | -------------------------------- | ----------------------------------------------------------------- |
86
+ | Button / CTA | `geo-button` | `<geo-button appearance="primary" color="brand">Lưu</geo-button>` |
87
+ | Text field | `geo-input` | `<geo-input label="Họ tên" [(ngModel)]="name" [block]="true">` |
88
+ | Select | `geo-select` | `<geo-select [options]="opts" [(ngModel)]="v" [block]="true">` |
89
+ | Checkbox | `geo-checkbox` | `<geo-checkbox label="Đồng ý" [(checked)]="ok">` |
90
+ | Radio | `geo-radio` | `<geo-radio [options]="opts" [(ngModel)]="v">` |
91
+ | Date / range | `geo-date-picker` / `geo-date-range-picker` | `[(ngModel)]` + `format="dd/MM/yyyy"` |
92
+ | Form dialog | `geo-form-modal` | See Quick start |
93
+ | Confirm delete | `geo-confirm-modal` | `[visible]` + `(confirm)` |
94
+ | Steps in dialog | `geo-form-modal` + `geo-stepper` | See recipes |
95
+ | App shell | `geo-layout` | menu + header + content |
96
+ | Page title | `geo-page-title` | `<geo-page-title title="Chi tiết hồ sơ">` |
97
+ | Breadcrumb | `geo-breadcrumb` | `[items]="[{ label, link? }]"` |
98
+ | Toast | `GeoToastService` | `this.toast.success(title, message)` |
99
+ | Alert | `geo-alert` | `type="success" \| "error" \| …` |
100
+ | Status pill | `geo-status-tag` | `status="success" label="Đã duyệt"` |
101
+ | Table | `geo-table` | `[columns]` + `[data]` + paging |
102
+ | Upload | `geo-upload` | Drag-drop multi-file |
103
+ | **Map portal** | **`geo-map-shell`** | Search + layers + legend + parcel (recommended) |
104
+ | Bare map | `geo-map` | OpenLayers host + `GeoMapController` |
105
+ | Typography | `geo-typography` | `variant="h3" \| "body" \| …` |
97
106
 
98
107
  ### Button API (quick)
99
108
 
100
- | Input | Values | Default |
101
- |-------|--------|---------|
102
- | `appearance` | `primary` \| `secondary` \| `tertiary` | `primary` |
103
- | `color` | `brand` \| `danger` \| `warning` \| `success` | `brand` |
104
- | `icon` / `iconPlacement` | Ant icon name; `start` \| `end` | `start` |
105
- | `disabled` / `iconOnly` / `active` | boolean | `false` |
109
+ | Input | Values | Default |
110
+ | ---------------------------------- | --------------------------------------------- | --------- |
111
+ | `appearance` | `primary` \| `secondary` \| `tertiary` | `primary` |
112
+ | `color` | `brand` \| `danger` \| `warning` \| `success` | `brand` |
113
+ | `icon` / `iconPlacement` | Ant icon name; `start` \| `end` | `start` |
114
+ | `disabled` / `iconOnly` / `active` | boolean | `false` |
106
115
 
107
116
  ```html
108
117
  <geo-button appearance="primary" color="brand" icon="plus">Thêm mới</geo-button>
@@ -114,9 +123,25 @@ export class DemoComponent {
114
123
 
115
124
  These implement **ControlValueAccessor** — use `[(ngModel)]` or reactive forms:
116
125
 
117
- `geo-input`, `geo-textarea`, `geo-select`, `geo-radio`, `geo-date-picker`, `geo-date-range-picker`, `geo-slider`
126
+ `geo-input`, `geo-textarea`, `geo-select`, `geo-radio`, `geo-date-picker`, `geo-date-range-picker`, `geo-file-picker`
127
+
128
+ - `geo-checkbox` → **`[(checked)]`** (not CVA)
129
+ - `geo-slider` → **`[(value)]`** (`model()`)
118
130
 
119
- `geo-checkbox` uses **`[(checked)]`** (not CVA).
131
+ ### Map portal (quick)
132
+
133
+ ```html
134
+ <geo-map-shell
135
+ height="640px"
136
+ [demoSearch]="false"
137
+ parcelAudience="citizen"
138
+ [layers]="layers"
139
+ (mapReady)="ctrl = $event"
140
+ (search)="onSearch($event)"
141
+ ></geo-map-shell>
142
+ ```
143
+
144
+ See `ai/recipes.md` §13 and `ai/components/geo-map-shell.md`.
120
145
 
121
146
  ### Toast (preferred)
122
147
 
@@ -133,19 +158,20 @@ this.toast.error('Lỗi!', 'Không thể lưu.');
133
158
 
134
159
  After install:
135
160
 
136
- | Path | Purpose |
137
- |------|---------|
138
- | `node_modules/@geoit/ui/ai/AGENTS.md` | Rules for humans & AI agents |
139
- | `node_modules/@geoit/ui/ai/README.md` | Component index |
140
- | `node_modules/@geoit/ui/ai/catalog.json` | Machine-readable catalog |
161
+ | Path | Purpose |
162
+ | ------------------------------------------- | ----------------------------------------------- |
163
+ | `node_modules/@geoit/ui/ai/AGENTS.md` | Rules for humans & AI agents |
164
+ | `node_modules/@geoit/ui/ai/README.md` | Component index |
165
+ | `node_modules/@geoit/ui/ai/catalog.json` | Machine-readable catalog |
141
166
  | `node_modules/@geoit/ui/ai/components/*.md` | **Per-component API** (inputs/outputs/examples) |
142
- | `node_modules/@geoit/ui/ai/recipes.md` | Copy-paste screen patterns |
167
+ | `node_modules/@geoit/ui/ai/recipes.md` | Copy-paste screen patterns |
143
168
 
144
169
  Open a component doc before using it, e.g.:
145
170
 
146
171
  ```text
147
172
  node_modules/@geoit/ui/ai/components/geo-button.md
148
173
  node_modules/@geoit/ui/ai/components/geo-form-modal.md
174
+ node_modules/@geoit/ui/ai/components/geo-map-shell.md
149
175
  node_modules/@geoit/ui/ai/components/geo-table.md
150
176
  ```
151
177
 
@@ -160,20 +186,22 @@ alwaysApply: true
160
186
  ---
161
187
 
162
188
  UI must use `@geoit/ui`. Before writing UI, read:
189
+
163
190
  - node_modules/@geoit/ui/ai/AGENTS.md
164
191
  - node_modules/@geoit/ui/ai/catalog.json
165
192
  - node_modules/@geoit/ui/ai/components/<selector>.md when needed
193
+ - node_modules/@geoit/ui/ai/recipes.md for screen patterns
166
194
  ```
167
195
 
168
196
  ## Design tokens
169
197
 
170
- | Group | Examples |
171
- |-------|----------|
172
- | Primary | `--geo-color-primary-default` (`#9A4828`), hover, light, dark, background |
173
- | Neutral | `--geo-color-neutral-900` … `100`, white |
174
- | Semantic | success / error / warning / info |
175
- | Radius | `--geo-radius` (6px) |
176
- | Font | `--geo-font-family` |
198
+ | Group | Examples |
199
+ | -------- | ------------------------------------------------------------------------- |
200
+ | Primary | `--geo-color-primary-default` (`#9A4828`), hover, light, dark, background |
201
+ | Neutral | `--geo-color-neutral-900` … `100`, white |
202
+ | Semantic | success / error / warning / info |
203
+ | Radius | `--geo-radius` (8px) + `--geo-radius-{xs,sm,md,lg,xl,2xl,full}` |
204
+ | Font | `--geo-font-family` |
177
205
 
178
206
  TypeScript mirror: `geoColorTokens` from `@geoit/ui` (via styles/tokens export).
179
207
 
package/ai/AGENTS.md CHANGED
@@ -1,17 +1,73 @@
1
1
  # GEO UI — Agent instructions
2
2
 
3
- Instructions for AI coding agents (Cursor, Copilot, etc.) when building UI with **geo-ui**.
3
+ Instructions for **humans and AI coding agents** when building UI with **`@geoit/ui`** (installed from npm).
4
+
5
+ Package paths after install:
6
+
7
+ | Doc | Path |
8
+ |-----|------|
9
+ | This file | `node_modules/@geoit/ui/ai/AGENTS.md` |
10
+ | Index | `node_modules/@geoit/ui/ai/README.md` |
11
+ | Catalog | `node_modules/@geoit/ui/ai/catalog.json` |
12
+ | Per component | `node_modules/@geoit/ui/ai/components/<selector>.md` |
13
+ | Recipes | `node_modules/@geoit/ui/ai/recipes.md` |
4
14
 
5
15
  ## Mandatory
6
16
 
7
- 1. **Use `geo-*` components** from package `@geoit/ui` for all UI that has a match in the catalog.
8
- 2. **Do not** invent parallel wrappers or raw `nz-button` / `nz-input` / `nz-modal` when a `geo-*` equivalent exists.
17
+ 1. **Use `geo-*` components** from `@geoit/ui` for all UI that has a match in the catalog.
18
+ 2. **Do not** invent parallel wrappers or raw `nz-button` / `nz-input` / `nz-modal` / `nz-date-picker` when a `geo-*` equivalent exists.
9
19
  3. **Do not hardcode** brand colors or border-radius. Use tokens:
10
20
  - Colors: `var(--geo-color-*)` or `geoColorTokens` from `@geoit/ui`
11
- - Radius: `var(--geo-radius)` (default **6px**)
12
- 4. Before implementing a component, **read the full doc** `ai/components/<selector>.md` (Inputs/Outputs/Examples/Tips) and/or `ai/catalog.json`.
21
+ - Radius: `var(--geo-radius)` (default **8px**; scale: sm 6 / md 10 / lg 12 / xl 14)
22
+ 4. Before implementing a component, **read** `ai/components/<selector>.md` (Inputs/Outputs/Examples/Tips) and/or `ai/catalog.json`.
13
23
  5. Prefer **copying examples** from those docs — adapt labels/bindings only; do not invent props.
14
24
 
25
+ ## Install (consumer app)
26
+
27
+ ```bash
28
+ npm install @geoit/ui
29
+ ```
30
+
31
+ Peer dependencies (install if missing):
32
+
33
+ ```bash
34
+ npm install @angular/animations@^18 @angular/common@^18 @angular/core@^18 \
35
+ @angular/forms@^18 @angular/cdk@^18 @ant-design/icons-angular@^18 ng-zorro-antd@^18 \
36
+ ol@^10 proj4@^2
37
+ ```
38
+
39
+ > `ol` + `proj4` are required for map components (`geo-map`, `geo-map-shell`, …).
40
+
41
+ ## Styles (once per app)
42
+
43
+ In global styles (e.g. `styles.scss`):
44
+
45
+ ```scss
46
+ @import "node_modules/@geoit/ui/src/lib/styles/design-tokens.scss";
47
+ @import "node_modules/@geoit/ui/src/lib/styles/theme.scss";
48
+ ```
49
+
50
+ Also load ng-zorro CSS once (if not already):
51
+
52
+ ```scss
53
+ @import "node_modules/ng-zorro-antd/ng-zorro-antd.min.css";
54
+ ```
55
+
56
+ App providers typically need animations + ng-zorro i18n (vi):
57
+
58
+ ```ts
59
+ import { provideAnimations } from "@angular/platform-browser/animations";
60
+ import { provideNzI18n, vi_VN } from "ng-zorro-antd/i18n";
61
+ import { registerLocaleData } from "@angular/common";
62
+ import vi from "@angular/common/locales/vi";
63
+
64
+ registerLocaleData(vi);
65
+
66
+ export const appConfig = {
67
+ providers: [provideAnimations(), provideNzI18n(vi_VN), /* … */],
68
+ };
69
+ ```
70
+
15
71
  ## Import pattern
16
72
 
17
73
  ```ts
@@ -19,8 +75,9 @@ import {
19
75
  GeoButtonComponent,
20
76
  GeoInputComponent,
21
77
  GeoFormModalComponent,
22
- GeoStepperComponent,
23
- } from '@geoit/ui';
78
+ GeoMapShellComponent,
79
+ GeoToastService,
80
+ } from "@geoit/ui";
24
81
  ```
25
82
 
26
83
  Standalone consumers:
@@ -32,21 +89,27 @@ Standalone consumers:
32
89
  })
33
90
  ```
34
91
 
35
- ## Styles (app once)
92
+ ### Form controls & binding
36
93
 
37
- ```scss
38
- @import 'node_modules/@geoit/ui/src/lib/styles/design-tokens.scss';
39
- @import 'node_modules/@geoit/ui/src/lib/styles/theme.scss';
40
- ```
94
+ | Components | Binding |
95
+ |------------|---------|
96
+ | `geo-input`, `geo-textarea`, `geo-select`, `geo-radio`, `geo-date-picker`, `geo-date-range-picker`, `geo-file-picker` | **CVA** → `[(ngModel)]` or reactive forms |
97
+ | `geo-checkbox` | `[(checked)]` (not CVA) |
98
+ | `geo-slider` | `[(value)]` (`model()`) |
99
+ | Overlays (`geo-form-modal`, search panels, …) | often `[(open)]` / `[(visible)]` |
41
100
 
42
101
  ## Composition recipes
43
102
 
44
- See [`recipes.md`](./recipes.md) for:
103
+ See [`recipes.md`](./recipes.md) for copy-paste screens:
45
104
 
46
105
  - Form modal + steps
47
106
  - Page: breadcrumb + page title
48
107
  - Table + toolbar + filter
49
108
  - Toast via service
109
+ - App shell (`geo-layout`)
110
+ - Dashboard
111
+ - Auth login / forgot password
112
+ - **Map portal (`geo-map-shell`)**
50
113
 
51
114
  ## Decision cheat-sheet
52
115
 
@@ -57,31 +120,58 @@ See [`recipes.md`](./recipes.md) for:
57
120
  | Select | `geo-select` |
58
121
  | Exclusive options | `geo-radio` |
59
122
  | Checkbox | `geo-checkbox` |
123
+ | Date / date range | `geo-date-picker` / `geo-date-range-picker` |
60
124
  | Dialog form | `geo-form-modal` |
61
125
  | Confirm delete | `geo-confirm-modal` |
62
126
  | Multi-step in dialog | `geo-form-modal` + `geo-stepper` |
63
127
  | Multi-step full page | `geo-step-form-layout` |
64
- | Page heading | `geo-page-title` (+ `geo-breadcrumb`) |
128
+ | App shell (sider+header) | `geo-layout` |
129
+ | Layout pieces | `geo-layout-sidebar` / `geo-layout-header` / `geo-layout-footer` |
130
+ | Page heading | `geo-page-title` (+ `geo-breadcrumb`) or `geo-page-header` |
131
+ | Dashboard KPI / chart | `geo-stat-card` / `geo-chart` / `geo-dashboard` |
132
+ | Login / forgot password | `geo-login` / `geo-forgot-password` |
133
+ | Feedback form | `geo-feedback-form` |
134
+ | Overlap analysis | `geo-overlap-result` |
135
+ | Empty region | `geo-empty-state` |
65
136
  | Status pill | `geo-status-tag` |
66
137
  | Transient notice | `GeoToastService` / `geo-toast` |
67
138
  | Inline notice | `geo-alert` |
68
139
  | Upload drag-drop | `geo-upload` |
69
140
  | Compact file field | `geo-file-picker` |
70
141
  | Data grid | `geo-table` (+ toolbar/filter) |
142
+ | **Map portal (recommended)** | **`geo-map-shell`** |
143
+ | Bare OpenLayers host | `geo-map` + `GeoMapController` |
144
+ | Map chrome pieces | `geo-map-toolbar`, `geo-map-search`, `geo-map-layers-drawer`, … |
71
145
  | Typography | `geo-typography` |
72
146
 
147
+ ## Map guidance
148
+
149
+ 1. Prefer **`geo-map-shell`** for portal tra cứu (search, ĐVHC, layers, legend, measure, basemap, parcel popup).
150
+ 2. Use **`geo-map`** alone only for embedded/minimal maps.
151
+ 3. Import constants/types from `@geoit/ui` (`GEO_MAP_DEFAULT_*`, `GeoMapLayerConfig`, …).
152
+ 4. Do **not** invent VN-2000 proj4 strings — pass via `projections` / env.
153
+ 5. Peer deps: `ol`, `proj4`.
154
+
73
155
  ## Anti-patterns
74
156
 
75
157
  - Hardcoded `#9A4828`, `border-radius: 8px`, etc.
76
158
  - Custom modal markup instead of `geo-form-modal`
159
+ - Raw `nz-date-picker` / `nz-select` instead of `geo-date-picker` / `geo-select`
77
160
  - Using Ant Design Steps instead of `geo-stepper`
161
+ - Assembling map chrome from scratch when `geo-map-shell` fits
78
162
  - Mixing Inter/system fonts inconsistently — use `--geo-font-family`
79
163
 
164
+ ## Library maintainers only
165
+
166
+ When changing `projects/geo-ui/src/lib/figma`:
167
+
168
+ - Angular **18**: `input()` / `output()` / `model()`, `OnPush`, `@if`/`@for`, `inject()`
169
+ - Do **not** add new `@Input` / `@Output` / `EventEmitter`
170
+ - After API changes: `npm run ai:docs` (regenerates this package’s `ai/`)
171
+
80
172
  ## Catalog
81
173
 
82
174
  - Index: [`README.md`](./README.md)
83
175
  - Machine catalog: [`catalog.json`](./catalog.json) (includes input types/defaults)
84
176
  - Per component: [`components/`](./components/) — full Inputs/Outputs tables
85
177
  - Recipes: [`recipes.md`](./recipes.md)
86
-
87
- Regenerate docs: `npm run ai:docs`
package/ai/README.md CHANGED
@@ -10,21 +10,55 @@ Agent rules: [`AGENTS.md`](./AGENTS.md) · Recipes: [`recipes.md`](./recipes.md)
10
10
  | `geo-back-button` | navigation | Back navigation control (history or custom click). | [geo-back-button.md](./components/geo-back-button.md) |
11
11
  | `geo-breadcrumb` | navigation | Breadcrumb trail; last item active (primary). | [geo-breadcrumb.md](./components/geo-breadcrumb.md) |
12
12
  | `geo-button` | actions | Primary action button with brand/semantic colors and icons. | [geo-button.md](./components/geo-button.md) |
13
+ | `geo-chart` | data | Bar / donut chart for dashboard statistics (ApexCharts). | [geo-chart.md](./components/geo-chart.md) |
13
14
  | `geo-checkbox` | forms | Checkbox with label; bind with [(checked)] (not CVA/ngModel). | [geo-checkbox.md](./components/geo-checkbox.md) |
14
15
  | `geo-column-picker` | data | Column visibility picker for tables (optional persistence). | [geo-column-picker.md](./components/geo-column-picker.md) |
15
16
  | `geo-confirm-modal` | overlay | Confirm / danger dialog (destroy actions). | [geo-confirm-modal.md](./components/geo-confirm-modal.md) |
17
+ | `geo-dashboard` | layout | Composed dashboard: period, KPI cards, ward/mismatch charts. | [geo-dashboard.md](./components/geo-dashboard.md) |
16
18
  | `geo-date-picker` | forms | Single date (optional time) picker. | [geo-date-picker.md](./components/geo-date-picker.md) |
17
19
  | `geo-date-range-picker` | forms | Start–end date range picker. | [geo-date-range-picker.md](./components/geo-date-range-picker.md) |
20
+ | `geo-empty-state` | feedback | Empty region placeholder (icon + title + optional action). | [geo-empty-state.md](./components/geo-empty-state.md) |
21
+ | `geo-feedback-form` | forms | Citizen feedback / phản ánh form with validation. | [geo-feedback-form.md](./components/geo-feedback-form.md) |
18
22
  | `geo-file-picker` | forms | Compact file input for forms (button + filename). | [geo-file-picker.md](./components/geo-file-picker.md) |
23
+ | `geo-forgot-password` | forms | Forgot-password form (email + submit / back to login). | [geo-forgot-password.md](./components/geo-forgot-password.md) |
19
24
  | `geo-form-modal` | overlay | Form modal: fixed header/footer, scrollable body via ng-content. | [geo-form-modal.md](./components/geo-form-modal.md) |
20
25
  | `geo-icon` | display | Ant Design icon wrapper with GEO size/color tokens. | [geo-icon.md](./components/geo-icon.md) |
21
26
  | `geo-input` | forms | Text input with label, validation, icons; CVA/ngModel. | [geo-input.md](./components/geo-input.md) |
27
+ | `geo-layout` | layout | App shell composing sidebar + header + content + footer. | [geo-layout.md](./components/geo-layout.md) |
28
+ | `geo-layout-footer` | layout | Minimal layout footer with copyright text + content slot. | [geo-layout-footer.md](./components/geo-layout-footer.md) |
29
+ | `geo-layout-header` | layout | Soft top bar: toggle + breadcrumb + user/notification actions. | [geo-layout-header.md](./components/geo-layout-header.md) |
30
+ | `geo-layout-header-actions` | layout | Header actions: notification/subsystem icons + user chip with popovers. | [geo-layout-header-actions.md](./components/geo-layout-header-actions.md) |
31
+ | `geo-layout-sidebar` | layout | White sidebar: brand + recursive menu (collapse / mobile drawer). | [geo-layout-sidebar.md](./components/geo-layout-sidebar.md) |
32
+ | `geo-list-page` | layout | List page chrome: title + breadcrumb shell for admin CRUD screens. | [geo-list-page.md](./components/geo-list-page.md) |
33
+ | `geo-login` | forms | Login form (username, password, captcha, remember). | [geo-login.md](./components/geo-login.md) |
34
+ | `geo-map` | map | OpenLayers map host with basemap, typed layers, and GeoMapController. | [geo-map.md](./components/geo-map.md) |
35
+ | `geo-map-admin-filter` | map | Administrative unit tree filter (ĐVHC) for map extent. | [geo-map-admin-filter.md](./components/geo-map-admin-filter.md) |
36
+ | `geo-map-basemap-switcher` | map | Basemap preview chip (e.g. street ↔ satellite). | [geo-map-basemap-switcher.md](./components/geo-map-basemap-switcher.md) |
37
+ | `geo-map-help` | map | Map help / hướng dẫn popover with sections. | [geo-map-help.md](./components/geo-map-help.md) |
38
+ | `geo-map-layer-card` | map | Basemap / layer preview card (thumbnail + title). | [geo-map-layer-card.md](./components/geo-map-layer-card.md) |
39
+ | `geo-map-layer-panel` | map | Layer list with visibility / opacity / group selection. | [geo-map-layer-panel.md](./components/geo-map-layer-panel.md) |
40
+ | `geo-map-layers-drawer` | map | Popover/drawer hosting the layer panel (“Lớp bản đồ”). | [geo-map-layers-drawer.md](./components/geo-map-layers-drawer.md) |
41
+ | `geo-map-legend` | map | Map legend popover / panel with color swatches. | [geo-map-legend.md](./components/geo-map-legend.md) |
42
+ | `geo-map-locate` | map | Geolocation button (browser GPS) for the map view. | [geo-map-locate.md](./components/geo-map-locate.md) |
43
+ | `geo-map-location-chip` | map | Location breadcrumb chip shown on the map (ward / province). | [geo-map-location-chip.md](./components/geo-map-location-chip.md) |
44
+ | `geo-map-measure` | map | Distance / area measure interaction on the map. | [geo-map-measure.md](./components/geo-map-measure.md) |
45
+ | `geo-map-opacity` | map | Layer opacity slider bound to a map layer id. | [geo-map-opacity.md](./components/geo-map-opacity.md) |
46
+ | `geo-map-parcel-popup` | map | Parcel detail popup (citizen / specialist audience). | [geo-map-parcel-popup.md](./components/geo-map-parcel-popup.md) |
47
+ | `geo-map-search` | map | Map search panel (owner / certificate / parcel / address / coordinates). | [geo-map-search.md](./components/geo-map-search.md) |
48
+ | `geo-map-shell` | map | Full map portal chrome: search, ĐVHC, layers, legend, measure, basemap, parcel popup. | [geo-map-shell.md](./components/geo-map-shell.md) |
49
+ | `geo-map-snapshot` | map | Capture current map canvas to image / download. | [geo-map-snapshot.md](./components/geo-map-snapshot.md) |
50
+ | `geo-map-swipe` | map | Swipe compare control between two map layers. | [geo-map-swipe.md](./components/geo-map-swipe.md) |
51
+ | `geo-map-toolbar` | map | Vertical map tool strip (search, pan, measure, layers, …). | [geo-map-toolbar.md](./components/geo-map-toolbar.md) |
52
+ | `geo-map-zoom` | map | Zoom +/- and optional province / home navigation control. | [geo-map-zoom.md](./components/geo-map-zoom.md) |
53
+ | `geo-overlap-result` | data | Overlap analysis result list (planning type, area, percent). | [geo-overlap-result.md](./components/geo-overlap-result.md) |
54
+ | `geo-page-header` | display | Compact page header block (title + optional actions slot). | [geo-page-header.md](./components/geo-page-header.md) |
22
55
  | `geo-page-title` | display | Page title (uppercase) with short primary accent underline; uses geo-typography. | [geo-page-title.md](./components/geo-page-title.md) |
23
56
  | `geo-pagination` | navigation | Standalone pagination control. | [geo-pagination.md](./components/geo-pagination.md) |
24
57
  | `geo-radio` | forms | Radio group (horizontal/vertical or button style). | [geo-radio.md](./components/geo-radio.md) |
25
58
  | `geo-row-actions` | data | Row action icons/menu (edit, more, custom). | [geo-row-actions.md](./components/geo-row-actions.md) |
26
59
  | `geo-select` | forms | Select / multi-select dropdown. | [geo-select.md](./components/geo-select.md) |
27
60
  | `geo-slider` | forms | Numeric range slider. | [geo-slider.md](./components/geo-slider.md) |
61
+ | `geo-stat-card` | data | KPI stat card (label, value, optional delta / icon). | [geo-stat-card.md](./components/geo-stat-card.md) |
28
62
  | `geo-status-tag` | display | Pill status tag with optional dot (success/error/warning/info/teal/…). | [geo-status-tag.md](./components/geo-status-tag.md) |
29
63
  | `geo-step-form-layout` | layout | Full-page multi-step form: vertical stepper + content card + footer actions. | [geo-step-form-layout.md](./components/geo-step-form-layout.md) |
30
64
  | `geo-stepper` | navigation | Steps indicator (horizontal default). Active=primary, completed=success+check. | [geo-stepper.md](./components/geo-stepper.md) |
@@ -39,6 +73,6 @@ Agent rules: [`AGENTS.md`](./AGENTS.md) · Recipes: [`recipes.md`](./recipes.md)
39
73
  | `geo-typography` | display | Text with GEO type scale (h1–tiny) and semantic colors. | [geo-typography.md](./components/geo-typography.md) |
40
74
  | `geo-upload` | forms | Drag-drop upload zone with progress list. | [geo-upload.md](./components/geo-upload.md) |
41
75
 
42
- Generated: 2026-07-27T01:57:41.109Z
76
+ Generated: 2026-09-03T03:52:29.749Z
43
77
 
44
78
  Regenerate: `npm run ai:docs`