@dssp/dkpi 1.0.0-alpha.9 β†’ 1.0.0-alpha.90

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 (261) hide show
  1. package/KPI-STATISTICS-SERVICE.md +233 -0
  2. package/_index.html +4 -9
  3. package/assets/favicon.ico +0 -0
  4. package/assets/helps/index.md +1 -1
  5. package/assets/images/project-image.png +0 -0
  6. package/assets/manifest/apple-1024.png +0 -0
  7. package/assets/manifest/apple-120.png +0 -0
  8. package/assets/manifest/apple-152.png +0 -0
  9. package/assets/manifest/apple-167.png +0 -0
  10. package/assets/manifest/apple-180.png +0 -0
  11. package/assets/manifest/apple-touch-icon.png +0 -0
  12. package/assets/manifest/badge-128x128.png +0 -0
  13. package/assets/manifest/chrome-splashscreen-icon-384x384.png +0 -0
  14. package/assets/manifest/chrome-touch-icon-192x192.png +0 -0
  15. package/assets/manifest/icon-128x128.png +0 -0
  16. package/assets/manifest/icon-192x192.png +0 -0
  17. package/assets/manifest/icon-512x512.png +0 -0
  18. package/assets/manifest/icon-72x72.png +0 -0
  19. package/assets/manifest/icon-96x96.png +0 -0
  20. package/assets/manifest/image-metaog.png +0 -0
  21. package/assets/manifest/maskable_icon.png +0 -0
  22. package/assets/manifest/ms-icon-144x144.png +0 -0
  23. package/assets/manifest/ms-touch-icon-144x144-precomposed.png +0 -0
  24. package/assets/manifest.json +2 -2
  25. package/assets/videos/intro.mp4 +0 -0
  26. package/config/config.development.js +2 -1
  27. package/config/config.production.js +2 -1
  28. package/dist-client/bootstrap.d.ts +1 -0
  29. package/dist-client/bootstrap.js +75 -4
  30. package/dist-client/bootstrap.js.map +1 -1
  31. package/dist-client/components/kpi-2d-lookup-chart.d.ts +50 -0
  32. package/dist-client/components/kpi-2d-lookup-chart.js +263 -0
  33. package/dist-client/components/kpi-2d-lookup-chart.js.map +1 -0
  34. package/dist-client/components/kpi-boxplot-chart.d.ts +31 -0
  35. package/dist-client/components/kpi-boxplot-chart.js +306 -0
  36. package/dist-client/components/kpi-boxplot-chart.js.map +1 -0
  37. package/dist-client/components/kpi-lookup-chart.d.ts +58 -0
  38. package/dist-client/components/kpi-lookup-chart.js +459 -0
  39. package/dist-client/components/kpi-lookup-chart.js.map +1 -0
  40. package/dist-client/components/kpi-mini-trend-chart.d.ts +14 -0
  41. package/dist-client/components/kpi-mini-trend-chart.js +180 -0
  42. package/dist-client/components/kpi-mini-trend-chart.js.map +1 -0
  43. package/dist-client/components/kpi-radar-chart.d.ts +17 -0
  44. package/dist-client/components/kpi-radar-chart.js +259 -0
  45. package/dist-client/components/kpi-radar-chart.js.map +1 -0
  46. package/dist-client/components/kpi-single-boxplot-chart.d.ts +36 -0
  47. package/dist-client/components/kpi-single-boxplot-chart.js +417 -0
  48. package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -0
  49. package/dist-client/components/kpi-step-lookup-chart.d.ts +33 -0
  50. package/dist-client/components/kpi-step-lookup-chart.js +181 -0
  51. package/dist-client/components/kpi-step-lookup-chart.js.map +1 -0
  52. package/dist-client/components/kpi-trend-chart.d.ts +25 -0
  53. package/dist-client/components/kpi-trend-chart.js +241 -0
  54. package/dist-client/components/kpi-trend-chart.js.map +1 -0
  55. package/dist-client/components/sv-pagenation-control.d.ts +18 -0
  56. package/dist-client/components/sv-pagenation-control.js +142 -0
  57. package/dist-client/components/sv-pagenation-control.js.map +1 -0
  58. package/dist-client/entries/auth/checkin.d.ts +38 -0
  59. package/dist-client/entries/auth/checkin.js +551 -0
  60. package/dist-client/entries/auth/checkin.js.map +1 -0
  61. package/dist-client/google-map/common-google-map.d.ts +35 -0
  62. package/dist-client/google-map/common-google-map.js +349 -0
  63. package/dist-client/google-map/common-google-map.js.map +1 -0
  64. package/dist-client/google-map/google-map-loader.d.ts +6 -0
  65. package/dist-client/google-map/google-map-loader.js +23 -0
  66. package/dist-client/google-map/google-map-loader.js.map +1 -0
  67. package/dist-client/icons/menu-icons.d.ts +6 -0
  68. package/dist-client/icons/menu-icons.js +42 -0
  69. package/dist-client/icons/menu-icons.js.map +1 -1
  70. package/dist-client/pages/component/project-update-header.d.ts +1 -0
  71. package/dist-client/pages/component/project-update-header.js +127 -0
  72. package/dist-client/pages/component/project-update-header.js.map +1 -0
  73. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.d.ts +22 -0
  74. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js +57 -0
  75. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js.map +1 -0
  76. package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +47 -0
  77. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +393 -0
  78. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -0
  79. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.d.ts +20 -0
  80. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js +445 -0
  81. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js.map +1 -0
  82. package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +18 -0
  83. package/dist-client/pages/kpi-admin/kpi-system-guide.js +696 -0
  84. package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -0
  85. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +18 -0
  86. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +259 -0
  87. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
  88. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +22 -0
  89. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +346 -0
  90. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
  91. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +26 -0
  92. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +433 -0
  93. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
  94. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
  95. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
  96. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
  97. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +46 -0
  98. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +937 -0
  99. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  100. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +33 -0
  101. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +231 -0
  102. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
  103. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +35 -0
  104. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +632 -0
  105. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  106. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  107. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +131 -0
  108. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  109. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +52 -0
  110. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +842 -0
  111. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
  112. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +63 -0
  113. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +1097 -0
  114. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  115. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  116. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  117. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  118. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  119. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  120. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  121. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  122. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  123. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  124. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  125. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +147 -0
  126. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  127. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  128. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  129. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  130. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +57 -0
  131. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +719 -0
  132. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
  133. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
  134. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +76 -0
  135. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
  136. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +68 -0
  137. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +394 -0
  138. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
  139. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +12 -0
  140. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +174 -0
  141. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
  142. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +40 -0
  143. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +190 -0
  144. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
  145. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +23 -0
  146. package/dist-client/pages/kpi-value/kpi-value-importer.js +93 -0
  147. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -0
  148. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +71 -0
  149. package/dist-client/pages/kpi-value/kpi-value-list-page.js +454 -0
  150. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -0
  151. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +66 -0
  152. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +775 -0
  153. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -0
  154. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +16 -0
  155. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +337 -0
  156. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -0
  157. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +21 -0
  158. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +335 -0
  159. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +1 -0
  160. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.d.ts +42 -0
  161. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +635 -0
  162. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -0
  163. package/dist-client/pages/sv-project-complete.d.ts +25 -0
  164. package/dist-client/pages/sv-project-complete.js +259 -0
  165. package/dist-client/pages/sv-project-complete.js.map +1 -0
  166. package/dist-client/pages/sv-project-completed-list.d.ts +27 -0
  167. package/dist-client/pages/sv-project-completed-list.js +416 -0
  168. package/dist-client/pages/sv-project-completed-list.js.map +1 -0
  169. package/dist-client/pages/sv-project-detail.d.ts +70 -0
  170. package/dist-client/pages/sv-project-detail.js +1486 -0
  171. package/dist-client/pages/sv-project-detail.js.map +1 -0
  172. package/dist-client/pages/sv-project-list.d.ts +175 -0
  173. package/dist-client/pages/sv-project-list.js +581 -0
  174. package/dist-client/pages/sv-project-list.js.map +1 -0
  175. package/dist-client/pages/sv-project-update.d.ts +91 -0
  176. package/dist-client/pages/sv-project-update.js +1151 -0
  177. package/dist-client/pages/sv-project-update.js.map +1 -0
  178. package/dist-client/pages/sv-user-management.d.ts +1 -0
  179. package/dist-client/pages/sv-user-management.js +5 -0
  180. package/dist-client/pages/sv-user-management.js.map +1 -1
  181. package/dist-client/route.d.ts +1 -1
  182. package/dist-client/route.js +50 -2
  183. package/dist-client/route.js.map +1 -1
  184. package/dist-client/shared/complete-api.d.ts +37 -0
  185. package/dist-client/shared/complete-api.js +227 -0
  186. package/dist-client/shared/complete-api.js.map +1 -0
  187. package/dist-client/shared/func.d.ts +2 -0
  188. package/dist-client/shared/func.js +22 -0
  189. package/dist-client/shared/func.js.map +1 -0
  190. package/dist-client/shared/geo-group-mapping.d.ts +25 -0
  191. package/dist-client/shared/geo-group-mapping.js +189 -0
  192. package/dist-client/shared/geo-group-mapping.js.map +1 -0
  193. package/dist-client/shared/integration-fetch.d.ts +35 -0
  194. package/dist-client/shared/integration-fetch.js +53 -0
  195. package/dist-client/shared/integration-fetch.js.map +1 -0
  196. package/dist-client/themes/dark.css +24 -24
  197. package/dist-client/themes/light.css +23 -23
  198. package/dist-client/tsconfig.tsbuildinfo +1 -1
  199. package/dist-client/viewparts/menu-tools.d.ts +40 -5
  200. package/dist-client/viewparts/menu-tools.js +317 -52
  201. package/dist-client/viewparts/menu-tools.js.map +1 -1
  202. package/dist-server/index.d.ts +2 -0
  203. package/dist-server/index.js +5 -0
  204. package/dist-server/index.js.map +1 -1
  205. package/dist-server/migrations/index.d.ts +1 -0
  206. package/dist-server/migrations/index.js +12 -0
  207. package/dist-server/migrations/index.js.map +1 -0
  208. package/dist-server/scripts/calculate-kpi-scores.d.ts +10 -0
  209. package/dist-server/scripts/calculate-kpi-scores.js +333 -0
  210. package/dist-server/scripts/calculate-kpi-scores.js.map +1 -0
  211. package/dist-server/scripts/load-grade-data-migration.d.ts +14 -0
  212. package/dist-server/scripts/load-grade-data-migration.js +279 -0
  213. package/dist-server/scripts/load-grade-data-migration.js.map +1 -0
  214. package/dist-server/scripts/propagate-parent-kpi-values.d.ts +14 -0
  215. package/dist-server/scripts/propagate-parent-kpi-values.js +786 -0
  216. package/dist-server/scripts/propagate-parent-kpi-values.js.map +1 -0
  217. package/dist-server/scripts/recalculate-by-project-name.d.ts +2 -0
  218. package/dist-server/scripts/recalculate-by-project-name.js +72 -0
  219. package/dist-server/scripts/recalculate-by-project-name.js.map +1 -0
  220. package/dist-server/service/index.d.ts +4 -0
  221. package/dist-server/service/index.js +20 -0
  222. package/dist-server/service/index.js.map +1 -0
  223. package/dist-server/service/kpi-metric-value/index.d.ts +4 -0
  224. package/dist-server/service/kpi-metric-value/index.js +8 -0
  225. package/dist-server/service/kpi-metric-value/index.js.map +1 -0
  226. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +171 -0
  227. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +983 -0
  228. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
  229. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +12 -0
  230. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +56 -0
  231. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
  232. package/dist-server/service/kpi-stat/index.d.ts +4 -0
  233. package/dist-server/service/kpi-stat/index.js +8 -0
  234. package/dist-server/service/kpi-stat/index.js.map +1 -0
  235. package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +13 -0
  236. package/dist-server/service/kpi-stat/kpi-stat-query.js +727 -0
  237. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -0
  238. package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +32 -0
  239. package/dist-server/service/kpi-stat/kpi-stat-types.js +180 -0
  240. package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -0
  241. package/dist-server/service/kpi-value/index.d.ts +3 -0
  242. package/dist-server/service/kpi-value/index.js +7 -0
  243. package/dist-server/service/kpi-value/index.js.map +1 -0
  244. package/dist-server/service/kpi-value/kpi-value-query.d.ts +8 -0
  245. package/dist-server/service/kpi-value/kpi-value-query.js +90 -0
  246. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
  247. package/dist-server/tsconfig.tsbuildinfo +1 -1
  248. package/kpi-module-service-tests.md +1286 -0
  249. package/kpi-module-test-report.md +676 -0
  250. package/kpi-module-unit-test-detailed-report.md +925 -0
  251. package/kpi-module-unit-tests-detailed.md +1452 -0
  252. package/openapi/unstable.yaml +2 -2
  253. package/package.json +69 -55
  254. package/recalculate-batch.sh +64 -0
  255. package/recalculate-projects-range.sh +98 -0
  256. package/schema.graphql +3464 -458
  257. package/things-factory.config.js +12 -1
  258. package/translations/en.json +5 -1
  259. package/translations/ko.json +5 -1
  260. package/views/auth-page.html +4 -5
  261. package/views/public/home.html +5 -6
@@ -0,0 +1,25 @@
1
+ /**
2
+ * geo_group 2자리 μ½”λ“œ ↔ μ‹œλ„/μ‹œκ΅°κ΅¬ λ§€ν•‘.
3
+ * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS dict λ₯Ό TypeScript 둜 이식.
4
+ *
5
+ * μš΄μ˜μžκ°€ ν”„λ‘œμ νŠΈ μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜λ©΄ κ·Έ μ•ˆμ—μ„œ μ‹œλ„+μ‹œκ΅°κ΅¬ ν‘œμ€€λͺ…을 λΆ€λΆ„ λ§€μΉ­ν•˜μ—¬
6
+ * 2자리 μ½”λ“œλ₯Ό μΆ”μ •. μžλ™ 채움 후에도 μš΄μ˜μžκ°€ μˆ˜λ™ μ •μ • κ°€λŠ₯.
7
+ */
8
+ /**
9
+ * 우편번호 prefix (2자리) β†’ geo_group 2자리 μ½”λ“œ best-guess λ§€ν•‘.
10
+ * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS μ„Έ 번째 κ°’ (postal_prefix) κΈ°μ€€,
11
+ * 1:N μΌ€μ΄μŠ€λŠ” 첫 λ§€μΉ­ μ‚¬μš©. μ •ν™•ν•œ μ‹œκ΅°κ΅¬ λΆ„λ¦¬μ—λŠ” ν•œκ΅­ ν–‰μ •μ•ˆμ „λΆ€ 5자리 우편번호
12
+ * 룩업 ν•„μš”ν•˜μ§€λ§Œ client embed λΆˆκ°€λŠ₯ β€” best-guess 둜 μ‹œλ„ λ‹¨μœ„ ν†΅κ³„λ§Œ μ‹ λ’° κ°€λŠ₯.
13
+ */
14
+ export declare const POSTAL_PREFIX_TO_GEO_GROUP: Record<string, string>;
15
+ export declare function inferGeoGroupFromPostalCode(postalCode: string | null | undefined): string | null;
16
+ /** "μ‹œλ„+μ‹œκ΅°κ΅¬ ν‘œμ€€λͺ…" β†’ "2자리 geo_group μ½”λ“œ" */
17
+ export declare const ADDRESS_TO_GEO_GROUP: Record<string, string>;
18
+ /**
19
+ * μ£Όμ†Œ λ¬Έμžμ—΄μ—μ„œ 2자리 geo_group μ½”λ“œ μΆ”μ •. λ§€μΉ­ μ•ˆ 되면 null.
20
+ * λ§€μΉ­ μš°μ„ :
21
+ * 1) 정식 μ‹œλ„λͺ… + μ‹œκ΅°κ΅¬λͺ… (예: 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬')
22
+ * 2) μ•½μΉ­ μ‹œλ„ + μ‹œκ΅°κ΅¬ (예: 'μ„œμšΈ μ’…λ‘œκ΅¬' β†’ 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬')
23
+ * 3) μ‹œκ΅°κ΅¬λͺ… 단독 λ§€μΉ­ (예: 'μ’…λ‘œκ΅¬') β€” μœ λ‹ˆν¬ν•œ 경우
24
+ */
25
+ export declare function inferGeoGroupFromAddress(address: string | null | undefined): string | null;
@@ -0,0 +1,189 @@
1
+ /**
2
+ * geo_group 2자리 μ½”λ“œ ↔ μ‹œλ„/μ‹œκ΅°κ΅¬ λ§€ν•‘.
3
+ * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS dict λ₯Ό TypeScript 둜 이식.
4
+ *
5
+ * μš΄μ˜μžκ°€ ν”„λ‘œμ νŠΈ μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜λ©΄ κ·Έ μ•ˆμ—μ„œ μ‹œλ„+μ‹œκ΅°κ΅¬ ν‘œμ€€λͺ…을 λΆ€λΆ„ λ§€μΉ­ν•˜μ—¬
6
+ * 2자리 μ½”λ“œλ₯Ό μΆ”μ •. μžλ™ 채움 후에도 μš΄μ˜μžκ°€ μˆ˜λ™ μ •μ • κ°€λŠ₯.
7
+ */
8
+ /**
9
+ * 우편번호 prefix (2자리) β†’ geo_group 2자리 μ½”λ“œ best-guess λ§€ν•‘.
10
+ * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS μ„Έ 번째 κ°’ (postal_prefix) κΈ°μ€€,
11
+ * 1:N μΌ€μ΄μŠ€λŠ” 첫 λ§€μΉ­ μ‚¬μš©. μ •ν™•ν•œ μ‹œκ΅°κ΅¬ λΆ„λ¦¬μ—λŠ” ν•œκ΅­ ν–‰μ •μ•ˆμ „λΆ€ 5자리 우편번호
12
+ * 룩업 ν•„μš”ν•˜μ§€λ§Œ client embed λΆˆκ°€λŠ₯ β€” best-guess 둜 μ‹œλ„ λ‹¨μœ„ ν†΅κ³„λ§Œ μ‹ λ’° κ°€λŠ₯.
13
+ */
14
+ export const POSTAL_PREFIX_TO_GEO_GROUP = {
15
+ '03': '01', // μ„œμšΈ μ’…λ‘œκ΅¬
16
+ '04': '02', // μ„œμšΈ 쀑ꡬ
17
+ '05': '05', // μ„œμšΈ 광진ꡬ
18
+ '06': '06', // μ„œμšΈ 강남ꡬ
19
+ '07': '08', // μ„œμšΈ κ°•μ„œκ΅¬
20
+ '10': '12', // κ²½κΈ° κ³ μ–‘μ‹œ / νŒŒμ£Όμ‹œ
21
+ '11': '11', // κ²½κΈ° μ„±λ‚¨μ‹œ
22
+ '12': '11', // κ²½κΈ° μ„±λ‚¨μ‹œ
23
+ '13': '11', // κ²½κΈ° μ„±λ‚¨μ‹œ
24
+ '14': '14', // κ²½κΈ° λΆ€μ²œμ‹œ
25
+ '15': '15', // κ²½κΈ° μ•ˆμ‚°μ‹œ
26
+ '16': '10', // κ²½κΈ° μˆ˜μ›μ‹œ
27
+ '17': '13', // κ²½κΈ° μš©μΈμ‹œ / ν‰νƒμ‹œ
28
+ '18': '16', // κ²½κΈ° ν™”μ„±μ‹œ
29
+ '21': '21', // 인천 남동ꡬ / 뢀평ꡬ
30
+ '22': '23', // 인천 μ„œκ΅¬
31
+ '24': '24', // 강원 μΆ˜μ²œμ‹œ
32
+ '25': '26', // 강원 κ°•λ¦‰μ‹œ
33
+ '26': '25', // 강원 μ›μ£Όμ‹œ
34
+ '27': '28', // 좩뢁 μΆ©μ£Όμ‹œ / μ œμ²œμ‹œ
35
+ '28': '27', // 좩뢁 μ²­μ£Όμ‹œ
36
+ '30': '30', // μ„Έμ’…
37
+ '31': '31', // 좩남 μ²œμ•ˆμ‹œ / μ•„μ‚°μ‹œ
38
+ '34': '35', // λŒ€μ „ μœ μ„±κ΅¬
39
+ '35': '34', // λŒ€μ „ μ„œκ΅¬
40
+ '36': '39', // 경뢁 μ•ˆλ™μ‹œ
41
+ '37': '36', // 경뢁 ν¬ν•­μ‹œ
42
+ '38': '37', // 경뢁 κ²½μ£Όμ‹œ
43
+ '39': '38', // 경뢁 κ΅¬λ―Έμ‹œ / κΉ€μ²œμ‹œ
44
+ '41': '41', // λŒ€κ΅¬ 쀑ꡬ
45
+ '42': '42', // λŒ€κ΅¬ μˆ˜μ„±κ΅¬ / λ‹¬μ„œκ΅¬
46
+ '44': '44', // μšΈμ‚° 남ꡬ / 쀑ꡬ
47
+ '46': '49', // λΆ€μ‚° κΈˆμ •κ΅¬
48
+ '48': '46', // λΆ€μ‚° 쀑ꡬ / ν•΄μš΄λŒ€κ΅¬
49
+ '49': '48', // λΆ€μ‚° μ‚¬ν•˜κ΅¬
50
+ '50': '51', // 경남 κΉ€ν•΄μ‹œ / μ–‘μ‚°μ‹œ
51
+ '51': '50', // 경남 μ°½μ›μ‹œ
52
+ '52': '52', // 경남 μ§„μ£Όμ‹œ
53
+ '54': '54', // 전뢁 μ „μ£Όμ‹œ / μ΅μ‚°μ‹œ / κ΅°μ‚°μ‹œ
54
+ '57': '59', // 전남 μˆœμ²œμ‹œ
55
+ '58': '57', // 전남 λͺ©ν¬μ‹œ
56
+ '59': '58', // 전남 μ—¬μˆ˜μ‹œ
57
+ '61': '61', // κ΄‘μ£Ό μ„œκ΅¬ / 뢁ꡬ
58
+ '63': '63' // 제주
59
+ };
60
+ export function inferGeoGroupFromPostalCode(postalCode) {
61
+ if (!postalCode)
62
+ return null;
63
+ const prefix = postalCode.trim().slice(0, 2);
64
+ return POSTAL_PREFIX_TO_GEO_GROUP[prefix] || null;
65
+ }
66
+ /** "μ‹œλ„+μ‹œκ΅°κ΅¬ ν‘œμ€€λͺ…" β†’ "2자리 geo_group μ½”λ“œ" */
67
+ export const ADDRESS_TO_GEO_GROUP = {
68
+ 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬': '01',
69
+ 'μ„œμšΈνŠΉλ³„μ‹œ 쀑ꡬ': '02',
70
+ 'μ„œμšΈνŠΉλ³„μ‹œ μš©μ‚°κ΅¬': '03',
71
+ 'μ„œμšΈνŠΉλ³„μ‹œ 성동ꡬ': '04',
72
+ 'μ„œμšΈνŠΉλ³„μ‹œ 광진ꡬ': '05',
73
+ 'μ„œμšΈνŠΉλ³„μ‹œ 강남ꡬ': '06',
74
+ 'μ„œμšΈνŠΉλ³„μ‹œ μ†‘νŒŒκ΅¬': '07',
75
+ 'μ„œμšΈνŠΉλ³„μ‹œ κ°•μ„œκ΅¬': '08',
76
+ '경기도 μˆ˜μ›μ‹œ': '10',
77
+ '경기도 μ„±λ‚¨μ‹œ': '11',
78
+ '경기도 κ³ μ–‘μ‹œ': '12',
79
+ '경기도 μš©μΈμ‹œ': '13',
80
+ '경기도 λΆ€μ²œμ‹œ': '14',
81
+ '경기도 μ•ˆμ‚°μ‹œ': '15',
82
+ '경기도 ν™”μ„±μ‹œ': '16',
83
+ '경기도 ν‰νƒμ‹œ': '17',
84
+ '경기도 νŒŒμ£Όμ‹œ': '18',
85
+ 'μΈμ²œκ΄‘μ—­μ‹œ 남동ꡬ': '21',
86
+ 'μΈμ²œκ΄‘μ—­μ‹œ 뢀평ꡬ': '22',
87
+ 'μΈμ²œκ΄‘μ—­μ‹œ μ„œκ΅¬': '23',
88
+ '강원도 μΆ˜μ²œμ‹œ': '24',
89
+ '강원도 μ›μ£Όμ‹œ': '25',
90
+ '강원도 κ°•λ¦‰μ‹œ': '26',
91
+ '좩청뢁도 μ²­μ£Όμ‹œ': '27',
92
+ '좩청뢁도 μΆ©μ£Όμ‹œ': '28',
93
+ '좩청뢁도 μ œμ²œμ‹œ': '29',
94
+ 'μ„Έμ’…νŠΉλ³„μžμΉ˜μ‹œ': '30',
95
+ '좩청남도 μ²œμ•ˆμ‹œ': '31',
96
+ '좩청남도 μ•„μ‚°μ‹œ': '32',
97
+ '강원도 μ†μ΄ˆμ‹œ': '33',
98
+ 'λŒ€μ „κ΄‘μ—­μ‹œ μ„œκ΅¬': '34',
99
+ 'λŒ€μ „κ΄‘μ—­μ‹œ μœ μ„±κ΅¬': '35',
100
+ '경상뢁도 ν¬ν•­μ‹œ': '36',
101
+ '경상뢁도 κ²½μ£Όμ‹œ': '37',
102
+ '경상뢁도 κ΅¬λ―Έμ‹œ': '38',
103
+ '경상뢁도 μ•ˆλ™μ‹œ': '39',
104
+ '경상뢁도 κΉ€μ²œμ‹œ': '40',
105
+ 'λŒ€κ΅¬κ΄‘μ—­μ‹œ 쀑ꡬ': '41',
106
+ 'λŒ€κ΅¬κ΄‘μ—­μ‹œ μˆ˜μ„±κ΅¬': '42',
107
+ 'λŒ€κ΅¬κ΄‘μ—­μ‹œ λ‹¬μ„œκ΅¬': '43',
108
+ 'μšΈμ‚°κ΄‘μ—­μ‹œ 남ꡬ': '44',
109
+ 'μšΈμ‚°κ΄‘μ—­μ‹œ 쀑ꡬ': '45',
110
+ 'λΆ€μ‚°κ΄‘μ—­μ‹œ 쀑ꡬ': '46',
111
+ 'λΆ€μ‚°κ΄‘μ—­μ‹œ ν•΄μš΄λŒ€κ΅¬': '47',
112
+ 'λΆ€μ‚°κ΄‘μ—­μ‹œ μ‚¬ν•˜κ΅¬': '48',
113
+ 'λΆ€μ‚°κ΄‘μ—­μ‹œ κΈˆμ •κ΅¬': '49',
114
+ '경상남도 μ°½μ›μ‹œ': '50',
115
+ '경상남도 κΉ€ν•΄μ‹œ': '51',
116
+ '경상남도 μ§„μ£Όμ‹œ': '52',
117
+ '경상남도 μ–‘μ‚°μ‹œ': '53',
118
+ '전라뢁도 μ „μ£Όμ‹œ': '54',
119
+ '전라뢁도 μ΅μ‚°μ‹œ': '55',
120
+ '전라뢁도 κ΅°μ‚°μ‹œ': '56',
121
+ '전라남도 λͺ©ν¬μ‹œ': '57',
122
+ '전라남도 μ—¬μˆ˜μ‹œ': '58',
123
+ '전라남도 μˆœμ²œμ‹œ': '59',
124
+ 'κ΄‘μ£Όκ΄‘μ—­μ‹œ μ„œκ΅¬': '61',
125
+ 'κ΄‘μ£Όκ΄‘μ—­μ‹œ 뢁ꡬ': '62',
126
+ 'μ œμ£ΌνŠΉλ³„μžμΉ˜λ„ μ œμ£Όμ‹œ': '63'
127
+ };
128
+ /** μ‹œλ„ μ•½μΉ­ β†’ 정식 λͺ… (λΆ€λΆ„ 맀칭용). */
129
+ const PROVINCE_ALIASES = {
130
+ μ„œμšΈ: 'μ„œμšΈνŠΉλ³„μ‹œ',
131
+ κ²½κΈ°: '경기도',
132
+ 인천: 'μΈμ²œκ΄‘μ—­μ‹œ',
133
+ 강원: '강원도',
134
+ 좩뢁: '좩청뢁도',
135
+ 좩남: '좩청남도',
136
+ μ„Έμ’…: 'μ„Έμ’…νŠΉλ³„μžμΉ˜μ‹œ',
137
+ λŒ€μ „: 'λŒ€μ „κ΄‘μ—­μ‹œ',
138
+ 경뢁: '경상뢁도',
139
+ 경남: '경상남도',
140
+ λŒ€κ΅¬: 'λŒ€κ΅¬κ΄‘μ—­μ‹œ',
141
+ μšΈμ‚°: 'μšΈμ‚°κ΄‘μ—­μ‹œ',
142
+ λΆ€μ‚°: 'λΆ€μ‚°κ΄‘μ—­μ‹œ',
143
+ 전뢁: '전라뢁도',
144
+ 전남: '전라남도',
145
+ κ΄‘μ£Ό: 'κ΄‘μ£Όκ΄‘μ—­μ‹œ',
146
+ 제주: 'μ œμ£ΌνŠΉλ³„μžμΉ˜λ„'
147
+ };
148
+ /**
149
+ * μ£Όμ†Œ λ¬Έμžμ—΄μ—μ„œ 2자리 geo_group μ½”λ“œ μΆ”μ •. λ§€μΉ­ μ•ˆ 되면 null.
150
+ * λ§€μΉ­ μš°μ„ :
151
+ * 1) 정식 μ‹œλ„λͺ… + μ‹œκ΅°κ΅¬λͺ… (예: 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬')
152
+ * 2) μ•½μΉ­ μ‹œλ„ + μ‹œκ΅°κ΅¬ (예: 'μ„œμšΈ μ’…λ‘œκ΅¬' β†’ 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬')
153
+ * 3) μ‹œκ΅°κ΅¬λͺ… 단독 λ§€μΉ­ (예: 'μ’…λ‘œκ΅¬') β€” μœ λ‹ˆν¬ν•œ 경우
154
+ */
155
+ export function inferGeoGroupFromAddress(address) {
156
+ if (!address)
157
+ return null;
158
+ const trimmed = address.trim();
159
+ if (!trimmed)
160
+ return null;
161
+ // 1) 정식 λ§€μΉ­
162
+ for (const key of Object.keys(ADDRESS_TO_GEO_GROUP)) {
163
+ if (trimmed.includes(key))
164
+ return ADDRESS_TO_GEO_GROUP[key];
165
+ }
166
+ // 2) μ•½μΉ­ μ‹œλ„ β†’ 정식 μ‹œλ„λ‘œ expand ν›„ λ‹€μ‹œ λ§€μΉ­
167
+ for (const [short, full] of Object.entries(PROVINCE_ALIASES)) {
168
+ if (trimmed.startsWith(short) && !trimmed.startsWith(full)) {
169
+ const expanded = trimmed.replace(short, full);
170
+ for (const key of Object.keys(ADDRESS_TO_GEO_GROUP)) {
171
+ if (expanded.includes(key))
172
+ return ADDRESS_TO_GEO_GROUP[key];
173
+ }
174
+ }
175
+ }
176
+ // 3) μ‹œκ΅°κ΅¬λͺ… 단독 λ§€μΉ­ (μ‹œλ„ prefix μ—†λŠ” 경우). μœ λ‹ˆν¬ν•œ μ‹œκ΅°κ΅¬λ§Œ 톡과.
177
+ const districtMatches = Object.entries(ADDRESS_TO_GEO_GROUP)
178
+ .filter(([key]) => {
179
+ const parts = key.split(' ');
180
+ const district = parts[parts.length - 1];
181
+ return trimmed.includes(district);
182
+ })
183
+ .map(([, code]) => code);
184
+ const uniqueDistrictCodes = Array.from(new Set(districtMatches));
185
+ if (uniqueDistrictCodes.length === 1)
186
+ return uniqueDistrictCodes[0];
187
+ return null;
188
+ }
189
+ //# sourceMappingURL=geo-group-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geo-group-mapping.js","sourceRoot":"","sources":["../../client/shared/geo-group-mapping.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * geo_group 2자리 μ½”λ“œ ↔ μ‹œλ„/μ‹œκ΅°κ΅¬ λ§€ν•‘.\n * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS dict λ₯Ό TypeScript 둜 이식.\n *\n * μš΄μ˜μžκ°€ ν”„λ‘œμ νŠΈ μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜λ©΄ κ·Έ μ•ˆμ—μ„œ μ‹œλ„+μ‹œκ΅°κ΅¬ ν‘œμ€€λͺ…을 λΆ€λΆ„ λ§€μΉ­ν•˜μ—¬\n * 2자리 μ½”λ“œλ₯Ό μΆ”μ •. μžλ™ 채움 후에도 μš΄μ˜μžκ°€ μˆ˜λ™ μ •μ • κ°€λŠ₯.\n */\n\n/**\n * 우편번호 prefix (2자리) β†’ geo_group 2자리 μ½”λ“œ best-guess λ§€ν•‘.\n * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS μ„Έ 번째 κ°’ (postal_prefix) κΈ°μ€€,\n * 1:N μΌ€μ΄μŠ€λŠ” 첫 λ§€μΉ­ μ‚¬μš©. μ •ν™•ν•œ μ‹œκ΅°κ΅¬ λΆ„λ¦¬μ—λŠ” ν•œκ΅­ ν–‰μ •μ•ˆμ „λΆ€ 5자리 우편번호\n * 룩업 ν•„μš”ν•˜μ§€λ§Œ client embed λΆˆκ°€λŠ₯ β€” best-guess 둜 μ‹œλ„ λ‹¨μœ„ ν†΅κ³„λ§Œ μ‹ λ’° κ°€λŠ₯.\n */\nexport const POSTAL_PREFIX_TO_GEO_GROUP: Record<string, string> = {\n '03': '01', // μ„œμšΈ μ’…λ‘œκ΅¬\n '04': '02', // μ„œμšΈ 쀑ꡬ\n '05': '05', // μ„œμšΈ 광진ꡬ\n '06': '06', // μ„œμšΈ 강남ꡬ\n '07': '08', // μ„œμšΈ κ°•μ„œκ΅¬\n '10': '12', // κ²½κΈ° κ³ μ–‘μ‹œ / νŒŒμ£Όμ‹œ\n '11': '11', // κ²½κΈ° μ„±λ‚¨μ‹œ\n '12': '11', // κ²½κΈ° μ„±λ‚¨μ‹œ\n '13': '11', // κ²½κΈ° μ„±λ‚¨μ‹œ\n '14': '14', // κ²½κΈ° λΆ€μ²œμ‹œ\n '15': '15', // κ²½κΈ° μ•ˆμ‚°μ‹œ\n '16': '10', // κ²½κΈ° μˆ˜μ›μ‹œ\n '17': '13', // κ²½κΈ° μš©μΈμ‹œ / ν‰νƒμ‹œ\n '18': '16', // κ²½κΈ° ν™”μ„±μ‹œ\n '21': '21', // 인천 남동ꡬ / 뢀평ꡬ\n '22': '23', // 인천 μ„œκ΅¬\n '24': '24', // 강원 μΆ˜μ²œμ‹œ\n '25': '26', // 강원 κ°•λ¦‰μ‹œ\n '26': '25', // 강원 μ›μ£Όμ‹œ\n '27': '28', // 좩뢁 μΆ©μ£Όμ‹œ / μ œμ²œμ‹œ\n '28': '27', // 좩뢁 μ²­μ£Όμ‹œ\n '30': '30', // μ„Έμ’…\n '31': '31', // 좩남 μ²œμ•ˆμ‹œ / μ•„μ‚°μ‹œ\n '34': '35', // λŒ€μ „ μœ μ„±κ΅¬\n '35': '34', // λŒ€μ „ μ„œκ΅¬\n '36': '39', // 경뢁 μ•ˆλ™μ‹œ\n '37': '36', // 경뢁 ν¬ν•­μ‹œ\n '38': '37', // 경뢁 κ²½μ£Όμ‹œ\n '39': '38', // 경뢁 κ΅¬λ―Έμ‹œ / κΉ€μ²œμ‹œ\n '41': '41', // λŒ€κ΅¬ 쀑ꡬ\n '42': '42', // λŒ€κ΅¬ μˆ˜μ„±κ΅¬ / λ‹¬μ„œκ΅¬\n '44': '44', // μšΈμ‚° 남ꡬ / 쀑ꡬ\n '46': '49', // λΆ€μ‚° κΈˆμ •κ΅¬\n '48': '46', // λΆ€μ‚° 쀑ꡬ / ν•΄μš΄λŒ€κ΅¬\n '49': '48', // λΆ€μ‚° μ‚¬ν•˜κ΅¬\n '50': '51', // 경남 κΉ€ν•΄μ‹œ / μ–‘μ‚°μ‹œ\n '51': '50', // 경남 μ°½μ›μ‹œ\n '52': '52', // 경남 μ§„μ£Όμ‹œ\n '54': '54', // 전뢁 μ „μ£Όμ‹œ / μ΅μ‚°μ‹œ / κ΅°μ‚°μ‹œ\n '57': '59', // 전남 μˆœμ²œμ‹œ\n '58': '57', // 전남 λͺ©ν¬μ‹œ\n '59': '58', // 전남 μ—¬μˆ˜μ‹œ\n '61': '61', // κ΄‘μ£Ό μ„œκ΅¬ / 뢁ꡬ\n '63': '63' // 제주\n}\n\nexport function inferGeoGroupFromPostalCode(postalCode: string | null | undefined): string | null {\n if (!postalCode) return null\n const prefix = postalCode.trim().slice(0, 2)\n return POSTAL_PREFIX_TO_GEO_GROUP[prefix] || null\n}\n\n/** \"μ‹œλ„+μ‹œκ΅°κ΅¬ ν‘œμ€€λͺ…\" β†’ \"2자리 geo_group μ½”λ“œ\" */\nexport const ADDRESS_TO_GEO_GROUP: Record<string, string> = {\n 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬': '01',\n 'μ„œμšΈνŠΉλ³„μ‹œ 쀑ꡬ': '02',\n 'μ„œμšΈνŠΉλ³„μ‹œ μš©μ‚°κ΅¬': '03',\n 'μ„œμšΈνŠΉλ³„μ‹œ 성동ꡬ': '04',\n 'μ„œμšΈνŠΉλ³„μ‹œ 광진ꡬ': '05',\n 'μ„œμšΈνŠΉλ³„μ‹œ 강남ꡬ': '06',\n 'μ„œμšΈνŠΉλ³„μ‹œ μ†‘νŒŒκ΅¬': '07',\n 'μ„œμšΈνŠΉλ³„μ‹œ κ°•μ„œκ΅¬': '08',\n '경기도 μˆ˜μ›μ‹œ': '10',\n '경기도 μ„±λ‚¨μ‹œ': '11',\n '경기도 κ³ μ–‘μ‹œ': '12',\n '경기도 μš©μΈμ‹œ': '13',\n '경기도 λΆ€μ²œμ‹œ': '14',\n '경기도 μ•ˆμ‚°μ‹œ': '15',\n '경기도 ν™”μ„±μ‹œ': '16',\n '경기도 ν‰νƒμ‹œ': '17',\n '경기도 νŒŒμ£Όμ‹œ': '18',\n 'μΈμ²œκ΄‘μ—­μ‹œ 남동ꡬ': '21',\n 'μΈμ²œκ΄‘μ—­μ‹œ 뢀평ꡬ': '22',\n 'μΈμ²œκ΄‘μ—­μ‹œ μ„œκ΅¬': '23',\n '강원도 μΆ˜μ²œμ‹œ': '24',\n '강원도 μ›μ£Όμ‹œ': '25',\n '강원도 κ°•λ¦‰μ‹œ': '26',\n '좩청뢁도 μ²­μ£Όμ‹œ': '27',\n '좩청뢁도 μΆ©μ£Όμ‹œ': '28',\n '좩청뢁도 μ œμ²œμ‹œ': '29',\n 'μ„Έμ’…νŠΉλ³„μžμΉ˜μ‹œ': '30',\n '좩청남도 μ²œμ•ˆμ‹œ': '31',\n '좩청남도 μ•„μ‚°μ‹œ': '32',\n '강원도 μ†μ΄ˆμ‹œ': '33',\n 'λŒ€μ „κ΄‘μ—­μ‹œ μ„œκ΅¬': '34',\n 'λŒ€μ „κ΄‘μ—­μ‹œ μœ μ„±κ΅¬': '35',\n '경상뢁도 ν¬ν•­μ‹œ': '36',\n '경상뢁도 κ²½μ£Όμ‹œ': '37',\n '경상뢁도 κ΅¬λ―Έμ‹œ': '38',\n '경상뢁도 μ•ˆλ™μ‹œ': '39',\n '경상뢁도 κΉ€μ²œμ‹œ': '40',\n 'λŒ€κ΅¬κ΄‘μ—­μ‹œ 쀑ꡬ': '41',\n 'λŒ€κ΅¬κ΄‘μ—­μ‹œ μˆ˜μ„±κ΅¬': '42',\n 'λŒ€κ΅¬κ΄‘μ—­μ‹œ λ‹¬μ„œκ΅¬': '43',\n 'μšΈμ‚°κ΄‘μ—­μ‹œ 남ꡬ': '44',\n 'μšΈμ‚°κ΄‘μ—­μ‹œ 쀑ꡬ': '45',\n 'λΆ€μ‚°κ΄‘μ—­μ‹œ 쀑ꡬ': '46',\n 'λΆ€μ‚°κ΄‘μ—­μ‹œ ν•΄μš΄λŒ€κ΅¬': '47',\n 'λΆ€μ‚°κ΄‘μ—­μ‹œ μ‚¬ν•˜κ΅¬': '48',\n 'λΆ€μ‚°κ΄‘μ—­μ‹œ κΈˆμ •κ΅¬': '49',\n '경상남도 μ°½μ›μ‹œ': '50',\n '경상남도 κΉ€ν•΄μ‹œ': '51',\n '경상남도 μ§„μ£Όμ‹œ': '52',\n '경상남도 μ–‘μ‚°μ‹œ': '53',\n '전라뢁도 μ „μ£Όμ‹œ': '54',\n '전라뢁도 μ΅μ‚°μ‹œ': '55',\n '전라뢁도 κ΅°μ‚°μ‹œ': '56',\n '전라남도 λͺ©ν¬μ‹œ': '57',\n '전라남도 μ—¬μˆ˜μ‹œ': '58',\n '전라남도 μˆœμ²œμ‹œ': '59',\n 'κ΄‘μ£Όκ΄‘μ—­μ‹œ μ„œκ΅¬': '61',\n 'κ΄‘μ£Όκ΄‘μ—­μ‹œ 뢁ꡬ': '62',\n 'μ œμ£ΌνŠΉλ³„μžμΉ˜λ„ μ œμ£Όμ‹œ': '63'\n}\n\n/** μ‹œλ„ μ•½μΉ­ β†’ 정식 λͺ… (λΆ€λΆ„ 맀칭용). */\nconst PROVINCE_ALIASES: Record<string, string> = {\n μ„œμšΈ: 'μ„œμšΈνŠΉλ³„μ‹œ',\n κ²½κΈ°: '경기도',\n 인천: 'μΈμ²œκ΄‘μ—­μ‹œ',\n 강원: '강원도',\n 좩뢁: '좩청뢁도',\n 좩남: '좩청남도',\n μ„Έμ’…: 'μ„Έμ’…νŠΉλ³„μžμΉ˜μ‹œ',\n λŒ€μ „: 'λŒ€μ „κ΄‘μ—­μ‹œ',\n 경뢁: '경상뢁도',\n 경남: '경상남도',\n λŒ€κ΅¬: 'λŒ€κ΅¬κ΄‘μ—­μ‹œ',\n μšΈμ‚°: 'μšΈμ‚°κ΄‘μ—­μ‹œ',\n λΆ€μ‚°: 'λΆ€μ‚°κ΄‘μ—­μ‹œ',\n 전뢁: '전라뢁도',\n 전남: '전라남도',\n κ΄‘μ£Ό: 'κ΄‘μ£Όκ΄‘μ—­μ‹œ',\n 제주: 'μ œμ£ΌνŠΉλ³„μžμΉ˜λ„'\n}\n\n/**\n * μ£Όμ†Œ λ¬Έμžμ—΄μ—μ„œ 2자리 geo_group μ½”λ“œ μΆ”μ •. λ§€μΉ­ μ•ˆ 되면 null.\n * λ§€μΉ­ μš°μ„ :\n * 1) 정식 μ‹œλ„λͺ… + μ‹œκ΅°κ΅¬λͺ… (예: 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬')\n * 2) μ•½μΉ­ μ‹œλ„ + μ‹œκ΅°κ΅¬ (예: 'μ„œμšΈ μ’…λ‘œκ΅¬' β†’ 'μ„œμšΈνŠΉλ³„μ‹œ μ’…λ‘œκ΅¬')\n * 3) μ‹œκ΅°κ΅¬λͺ… 단독 λ§€μΉ­ (예: 'μ’…λ‘œκ΅¬') β€” μœ λ‹ˆν¬ν•œ 경우\n */\nexport function inferGeoGroupFromAddress(address: string | null | undefined): string | null {\n if (!address) return null\n const trimmed = address.trim()\n if (!trimmed) return null\n\n // 1) 정식 λ§€μΉ­\n for (const key of Object.keys(ADDRESS_TO_GEO_GROUP)) {\n if (trimmed.includes(key)) return ADDRESS_TO_GEO_GROUP[key]\n }\n\n // 2) μ•½μΉ­ μ‹œλ„ β†’ 정식 μ‹œλ„λ‘œ expand ν›„ λ‹€μ‹œ λ§€μΉ­\n for (const [short, full] of Object.entries(PROVINCE_ALIASES)) {\n if (trimmed.startsWith(short) && !trimmed.startsWith(full)) {\n const expanded = trimmed.replace(short, full)\n for (const key of Object.keys(ADDRESS_TO_GEO_GROUP)) {\n if (expanded.includes(key)) return ADDRESS_TO_GEO_GROUP[key]\n }\n }\n }\n\n // 3) μ‹œκ΅°κ΅¬λͺ… 단독 λ§€μΉ­ (μ‹œλ„ prefix μ—†λŠ” 경우). μœ λ‹ˆν¬ν•œ μ‹œκ΅°κ΅¬λ§Œ 톡과.\n const districtMatches = Object.entries(ADDRESS_TO_GEO_GROUP)\n .filter(([key]) => {\n const parts = key.split(' ')\n const district = parts[parts.length - 1]\n return trimmed.includes(district)\n })\n .map(([, code]) => code)\n const uniqueDistrictCodes = Array.from(new Set(districtMatches))\n if (uniqueDistrictCodes.length === 1) return uniqueDistrictCodes[0]\n\n return null\n}\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 완곡 μž…λ ₯ ν™”λ©΄μ˜ "μžλ™ μˆ˜μ§‘" μ›Œν¬ν”Œλ‘œμš© μ™ΈλΆ€ μ‹œμŠ€ν…œ 연동 μˆ˜μ§‘ ν•¨μˆ˜.
3
+ *
4
+ * 데λͺ¨ λͺ©μ : ν‚€μŠ€μ½˜Β·μ„Έμ›€ν„°Β·μ˜¬λ°”λ‘œμ—μ„œ "연동을 톡해 값을 κ°€μ Έμ˜¨λ‹€"λŠ” μ›Œν¬ν”Œλ‘œλ₯Ό
5
+ * 보여주기 μœ„ν•œ 것. μ‹€μ œ μŠ€ν¬λž˜ν•‘/API μ—°λ™μ˜ κΉŠμ΄λŠ” 이 ν•¨μˆ˜ 내뢀에 μΊ‘μŠν™”λ˜μ–΄
6
+ * μžˆμœΌλ―€λ‘œ, μΆ”ν›„ 싀연동(integration-kiscon / data-go-kr / integration-allbaro)
7
+ * 으둜 ꡐ체할 λ•Œ 이 본문만 λ°”κΎΈλ©΄ ν™”λ©΄/μ €μž₯ 흐름은 κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€.
8
+ */
9
+ export type IntegrationSource = 'kiscon' | 'saeumteo' | 'allbaro';
10
+ export interface IntegrationSourceMeta {
11
+ source: IntegrationSource;
12
+ label: string;
13
+ icon: string;
14
+ desc: string;
15
+ }
16
+ /** 화면에 ν‘œμ‹œν•  연동 μ†ŒμŠ€ λͺ©λ‘ (μˆ˜μ§‘ μˆœμ„œλŒ€λ‘œ) */
17
+ export declare const INTEGRATION_SOURCES: IntegrationSourceMeta[];
18
+ export interface CollectedField {
19
+ /** 폼의 projectKey (KPI_METRIC_KEY_MAPPING 의 projectKey 와 일치) */
20
+ projectKey: string;
21
+ label: string;
22
+ value: number | string;
23
+ unit?: string;
24
+ }
25
+ export interface CollectionResult {
26
+ source: IntegrationSource;
27
+ label: string;
28
+ fields: CollectedField[];
29
+ }
30
+ /**
31
+ * ν•œ μ™ΈλΆ€ μ‹œμŠ€ν…œμ—μ„œ μ—°λ™μœΌλ‘œ 값을 μˆ˜μ§‘ν•œλ‹€.
32
+ * 데λͺ¨μ—μ„œλŠ” 연동 μˆ˜μ§‘μ„ 흉내내기 μœ„ν•΄ 짧은 μ§€μ—° ν›„ λŒ€ν‘œκ°’μ„ λ°˜ν™˜ν•œλ‹€
33
+ * (ν”„λ‘œμ νŠΈμ— 이미 μžˆλŠ” 값이 있으면 μš°μ„  μ‚¬μš©).
34
+ */
35
+ export declare function collectFromSource(source: IntegrationSource, project: any): Promise<CollectionResult>;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 완곡 μž…λ ₯ ν™”λ©΄μ˜ "μžλ™ μˆ˜μ§‘" μ›Œν¬ν”Œλ‘œμš© μ™ΈλΆ€ μ‹œμŠ€ν…œ 연동 μˆ˜μ§‘ ν•¨μˆ˜.
3
+ *
4
+ * 데λͺ¨ λͺ©μ : ν‚€μŠ€μ½˜Β·μ„Έμ›€ν„°Β·μ˜¬λ°”λ‘œμ—μ„œ "연동을 톡해 값을 κ°€μ Έμ˜¨λ‹€"λŠ” μ›Œν¬ν”Œλ‘œλ₯Ό
5
+ * 보여주기 μœ„ν•œ 것. μ‹€μ œ μŠ€ν¬λž˜ν•‘/API μ—°λ™μ˜ κΉŠμ΄λŠ” 이 ν•¨μˆ˜ 내뢀에 μΊ‘μŠν™”λ˜μ–΄
6
+ * μžˆμœΌλ―€λ‘œ, μΆ”ν›„ 싀연동(integration-kiscon / data-go-kr / integration-allbaro)
7
+ * 으둜 ꡐ체할 λ•Œ 이 본문만 λ°”κΎΈλ©΄ ν™”λ©΄/μ €μž₯ 흐름은 κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€.
8
+ */
9
+ /** 화면에 ν‘œμ‹œν•  연동 μ†ŒμŠ€ λͺ©λ‘ (μˆ˜μ§‘ μˆœμ„œλŒ€λ‘œ) */
10
+ export const INTEGRATION_SOURCES = [
11
+ { source: 'kiscon', label: 'ν‚€μŠ€μ½˜', icon: 'πŸ—', desc: 'κ±΄μ„€κ³΅μ‚¬λŒ€μž₯ 톡보' },
12
+ { source: 'saeumteo', label: '세움터', icon: 'πŸ›', desc: 'κ±΄μΆ•λ¬ΌλŒ€μž₯ / 건좕HUB' },
13
+ { source: 'allbaro', label: 'μ˜¬λ°”λ‘œ', icon: 'β™»', desc: '건섀폐기물 μ²˜λ¦¬μ‹€μ ' }
14
+ ];
15
+ /**
16
+ * ν•œ μ™ΈλΆ€ μ‹œμŠ€ν…œμ—μ„œ μ—°λ™μœΌλ‘œ 값을 μˆ˜μ§‘ν•œλ‹€.
17
+ * 데λͺ¨μ—μ„œλŠ” 연동 μˆ˜μ§‘μ„ 흉내내기 μœ„ν•΄ 짧은 μ§€μ—° ν›„ λŒ€ν‘œκ°’μ„ λ°˜ν™˜ν•œλ‹€
18
+ * (ν”„λ‘œμ νŠΈμ— 이미 μžˆλŠ” 값이 있으면 μš°μ„  μ‚¬μš©).
19
+ */
20
+ export async function collectFromSource(source, project) {
21
+ // 연동 μˆ˜μ§‘μ΄ "μ§„ν–‰λ˜λŠ”" λŠλ‚Œμ„ μ£ΌκΈ° μœ„ν•œ 짧은 μ§€μ—° (데λͺ¨μš©)
22
+ await new Promise(r => setTimeout(r, 700));
23
+ const bc = (project === null || project === void 0 ? void 0 : project.buildingComplex) || {};
24
+ switch (source) {
25
+ case 'kiscon':
26
+ return {
27
+ source,
28
+ label: 'ν‚€μŠ€μ½˜',
29
+ fields: [
30
+ { projectKey: 'constructionPeriod', label: 'κ³„νšκ³΅μ‚¬κΈ°κ°„', value: 30, unit: 'κ°œμ›”' },
31
+ { projectKey: 'constructionCost', label: 'κ³„νšκ³΅μ‚¬λΉ„', value: bc.constructionCost || 2500, unit: '얡원' }
32
+ ]
33
+ };
34
+ case 'saeumteo':
35
+ return {
36
+ source,
37
+ label: '세움터',
38
+ fields: [
39
+ { projectKey: 'area', label: '연면적', value: bc.area || 114000, unit: '㎑' },
40
+ { projectKey: 'floorAreaRatio', label: '용적율', value: bc.floorAreaRatio || 250, unit: '%' },
41
+ { projectKey: 'upperFloorCount', label: 'μ§€μƒμΈ΅μˆ˜', value: 25, unit: 'μΈ΅' },
42
+ { projectKey: 'lowerFloorCount', label: 'μ§€ν•˜μΈ΅μˆ˜', value: 3, unit: 'μΈ΅' }
43
+ ]
44
+ };
45
+ case 'allbaro':
46
+ return {
47
+ source,
48
+ label: 'μ˜¬λ°”λ‘œ',
49
+ fields: [{ projectKey: 'totalConstructionWasteAmount', label: '총 건섀폐기물', value: 15, unit: 'ton' }]
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=integration-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-fetch.js","sourceRoot":"","sources":["../../client/shared/integration-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,iCAAiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAA4B;IAC1D,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;IACjE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE;IACvE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE;CACnE,CAAA;AAgBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAyB,EAAE,OAAY;IAC7E,sCAAsC;IACtC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAE1C,MAAM,EAAE,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,KAAI,EAAE,CAAA;IAEzC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE;oBACN,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;oBAC5E,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;iBACnG;aACF,CAAA;QAEH,KAAK,UAAU;YACb,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE;oBACN,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE;oBACzE,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;oBAC1F,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;oBACtE,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;iBACtE;aACF,CAAA;QAEH,KAAK,SAAS;YACZ,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,8BAA8B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;aACnG,CAAA;IACL,CAAC;AACH,CAAC","sourcesContent":["/**\n * 완곡 μž…λ ₯ ν™”λ©΄μ˜ \"μžλ™ μˆ˜μ§‘\" μ›Œν¬ν”Œλ‘œμš© μ™ΈλΆ€ μ‹œμŠ€ν…œ 연동 μˆ˜μ§‘ ν•¨μˆ˜.\n *\n * 데λͺ¨ λͺ©μ : ν‚€μŠ€μ½˜Β·μ„Έμ›€ν„°Β·μ˜¬λ°”λ‘œμ—μ„œ \"연동을 톡해 값을 κ°€μ Έμ˜¨λ‹€\"λŠ” μ›Œν¬ν”Œλ‘œλ₯Ό\n * 보여주기 μœ„ν•œ 것. μ‹€μ œ μŠ€ν¬λž˜ν•‘/API μ—°λ™μ˜ κΉŠμ΄λŠ” 이 ν•¨μˆ˜ 내뢀에 μΊ‘μŠν™”λ˜μ–΄\n * μžˆμœΌλ―€λ‘œ, μΆ”ν›„ 싀연동(integration-kiscon / data-go-kr / integration-allbaro)\n * 으둜 ꡐ체할 λ•Œ 이 본문만 λ°”κΎΈλ©΄ ν™”λ©΄/μ €μž₯ 흐름은 κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€.\n */\n\nexport type IntegrationSource = 'kiscon' | 'saeumteo' | 'allbaro'\n\nexport interface IntegrationSourceMeta {\n source: IntegrationSource\n label: string\n icon: string\n desc: string\n}\n\n/** 화면에 ν‘œμ‹œν•  연동 μ†ŒμŠ€ λͺ©λ‘ (μˆ˜μ§‘ μˆœμ„œλŒ€λ‘œ) */\nexport const INTEGRATION_SOURCES: IntegrationSourceMeta[] = [\n { source: 'kiscon', label: 'ν‚€μŠ€μ½˜', icon: 'πŸ—', desc: 'κ±΄μ„€κ³΅μ‚¬λŒ€μž₯ 톡보' },\n { source: 'saeumteo', label: '세움터', icon: 'πŸ›', desc: 'κ±΄μΆ•λ¬ΌλŒ€μž₯ / 건좕HUB' },\n { source: 'allbaro', label: 'μ˜¬λ°”λ‘œ', icon: 'β™»', desc: '건섀폐기물 μ²˜λ¦¬μ‹€μ ' }\n]\n\nexport interface CollectedField {\n /** 폼의 projectKey (KPI_METRIC_KEY_MAPPING 의 projectKey 와 일치) */\n projectKey: string\n label: string\n value: number | string\n unit?: string\n}\n\nexport interface CollectionResult {\n source: IntegrationSource\n label: string\n fields: CollectedField[]\n}\n\n/**\n * ν•œ μ™ΈλΆ€ μ‹œμŠ€ν…œμ—μ„œ μ—°λ™μœΌλ‘œ 값을 μˆ˜μ§‘ν•œλ‹€.\n * 데λͺ¨μ—μ„œλŠ” 연동 μˆ˜μ§‘μ„ 흉내내기 μœ„ν•΄ 짧은 μ§€μ—° ν›„ λŒ€ν‘œκ°’μ„ λ°˜ν™˜ν•œλ‹€\n * (ν”„λ‘œμ νŠΈμ— 이미 μžˆλŠ” 값이 있으면 μš°μ„  μ‚¬μš©).\n */\nexport async function collectFromSource(source: IntegrationSource, project: any): Promise<CollectionResult> {\n // 연동 μˆ˜μ§‘μ΄ \"μ§„ν–‰λ˜λŠ”\" λŠλ‚Œμ„ μ£ΌκΈ° μœ„ν•œ 짧은 μ§€μ—° (데λͺ¨μš©)\n await new Promise(r => setTimeout(r, 700))\n\n const bc = project?.buildingComplex || {}\n\n switch (source) {\n case 'kiscon':\n return {\n source,\n label: 'ν‚€μŠ€μ½˜',\n fields: [\n { projectKey: 'constructionPeriod', label: 'κ³„νšκ³΅μ‚¬κΈ°κ°„', value: 30, unit: 'κ°œμ›”' },\n { projectKey: 'constructionCost', label: 'κ³„νšκ³΅μ‚¬λΉ„', value: bc.constructionCost || 2500, unit: '얡원' }\n ]\n }\n\n case 'saeumteo':\n return {\n source,\n label: '세움터',\n fields: [\n { projectKey: 'area', label: '연면적', value: bc.area || 114000, unit: '㎑' },\n { projectKey: 'floorAreaRatio', label: '용적율', value: bc.floorAreaRatio || 250, unit: '%' },\n { projectKey: 'upperFloorCount', label: 'μ§€μƒμΈ΅μˆ˜', value: 25, unit: 'μΈ΅' },\n { projectKey: 'lowerFloorCount', label: 'μ§€ν•˜μΈ΅μˆ˜', value: 3, unit: 'μΈ΅' }\n ]\n }\n\n case 'allbaro':\n return {\n source,\n label: 'μ˜¬λ°”λ‘œ',\n fields: [{ projectKey: 'totalConstructionWasteAmount', label: '총 건섀폐기물', value: 15, unit: 'ton' }]\n }\n }\n}\n"]}
@@ -1,17 +1,17 @@
1
1
  .dark {
2
- --md-sys-color-primary: rgb(174 198 255);
3
- --md-sys-color-surface-tint: rgb(174 198 255);
4
- --md-sys-color-on-primary: rgb(17 47 96);
5
- --md-sys-color-primary-container: rgb(44 70 120);
2
+ --md-sys-color-primary: rgb(173 198 255);
3
+ --md-sys-color-surface-tint: rgb(173 198 255);
4
+ --md-sys-color-on-primary: rgb(16 47 96);
5
+ --md-sys-color-primary-container: rgb(43 70 120);
6
6
  --md-sys-color-on-primary-container: rgb(216 226 255);
7
- --md-sys-color-secondary: rgb(191 198 220);
8
- --md-sys-color-on-secondary: rgb(41 48 65);
9
- --md-sys-color-secondary-container: rgb(63 71 89);
10
- --md-sys-color-on-secondary-container: rgb(219 226 249);
11
- --md-sys-color-tertiary: rgb(222 188 223);
12
- --md-sys-color-on-tertiary: rgb(64 40 67);
13
- --md-sys-color-tertiary-container: rgb(88 62 91);
14
- --md-sys-color-on-tertiary-container: rgb(252 215 251);
7
+ --md-sys-color-secondary: rgb(167 200 255);
8
+ --md-sys-color-on-secondary: rgb(4 48 95);
9
+ --md-sys-color-secondary-container: rgb(36 71 119);
10
+ --md-sys-color-on-secondary-container: rgb(213 227 255);
11
+ --md-sys-color-tertiary: rgb(234 181 238);
12
+ --md-sys-color-on-tertiary: rgb(72 32 79);
13
+ --md-sys-color-tertiary-container: rgb(96 55 103);
14
+ --md-sys-color-on-tertiary-container: rgb(254 214 255);
15
15
  --md-sys-color-error: rgb(255 180 171);
16
16
  --md-sys-color-on-error: rgb(105 0 5);
17
17
  --md-sys-color-error-container: rgb(147 0 10);
@@ -21,7 +21,7 @@
21
21
  --md-sys-color-surface: rgb(17 19 24);
22
22
  --md-sys-color-on-surface: rgb(226 226 233);
23
23
  --md-sys-color-surface-variant: rgb(68 71 79);
24
- --md-sys-color-on-surface-variant: rgb(197 198 208);
24
+ --md-sys-color-on-surface-variant: rgb(196 198 208);
25
25
  --md-sys-color-outline: rgb(142 144 153);
26
26
  --md-sys-color-outline-variant: rgb(68 71 79);
27
27
  --md-sys-color-shadow: rgb(0 0 0);
@@ -30,17 +30,17 @@
30
30
  --md-sys-color-inverse-on-surface: rgb(47 48 54);
31
31
  --md-sys-color-inverse-primary: rgb(68 94 145);
32
32
  --md-sys-color-primary-fixed: rgb(216 226 255);
33
- --md-sys-color-on-primary-fixed: rgb(0 26 66);
34
- --md-sys-color-primary-fixed-dim: rgb(174 198 255);
35
- --md-sys-color-on-primary-fixed-variant: rgb(44 70 120);
36
- --md-sys-color-secondary-fixed: rgb(219 226 249);
37
- --md-sys-color-on-secondary-fixed: rgb(20 27 44);
38
- --md-sys-color-secondary-fixed-dim: rgb(191 198 220);
39
- --md-sys-color-on-secondary-fixed-variant: rgb(63 71 89);
40
- --md-sys-color-tertiary-fixed: rgb(252 215 251);
41
- --md-sys-color-on-tertiary-fixed: rgb(41 19 45);
42
- --md-sys-color-tertiary-fixed-dim: rgb(222 188 223);
43
- --md-sys-color-on-tertiary-fixed-variant: rgb(88 62 91);
33
+ --md-sys-color-on-primary-fixed: rgb(0 26 65);
34
+ --md-sys-color-primary-fixed-dim: rgb(173 198 255);
35
+ --md-sys-color-on-primary-fixed-variant: rgb(43 70 120);
36
+ --md-sys-color-secondary-fixed: rgb(213 227 255);
37
+ --md-sys-color-on-secondary-fixed: rgb(0 27 60);
38
+ --md-sys-color-secondary-fixed-dim: rgb(167 200 255);
39
+ --md-sys-color-on-secondary-fixed-variant: rgb(36 71 119);
40
+ --md-sys-color-tertiary-fixed: rgb(254 214 255);
41
+ --md-sys-color-on-tertiary-fixed: rgb(48 9 57);
42
+ --md-sys-color-tertiary-fixed-dim: rgb(234 181 238);
43
+ --md-sys-color-on-tertiary-fixed-variant: rgb(96 55 103);
44
44
  --md-sys-color-surface-dim: rgb(17 19 24);
45
45
  --md-sys-color-surface-bright: rgb(55 57 62);
46
46
  --md-sys-color-surface-container-lowest: rgb(12 14 19);
@@ -1,17 +1,17 @@
1
1
  .light {
2
- --md-sys-color-primary: rgb(68 94 145);
2
+ --md-sys-color-primary: rgb(11 77 162);
3
3
  --md-sys-color-surface-tint: rgb(68 94 145);
4
4
  --md-sys-color-on-primary: rgb(255 255 255);
5
5
  --md-sys-color-primary-container: rgb(216 226 255);
6
- --md-sys-color-on-primary-container: rgb(44 70 120);
7
- --md-sys-color-secondary: rgb(87 94 113);
6
+ --md-sys-color-on-primary-container: rgb(43 70 120);
7
+ --md-sys-color-secondary: rgb(36, 41, 60);
8
8
  --md-sys-color-on-secondary: rgb(255 255 255);
9
- --md-sys-color-secondary-container: rgb(219 226 249);
10
- --md-sys-color-on-secondary-container: rgb(63 71 89);
11
- --md-sys-color-tertiary: rgb(113 85 115);
9
+ --md-sys-color-secondary-container: rgb(213 227 255);
10
+ --md-sys-color-on-secondary-container: rgb(36 71 119);
11
+ --md-sys-color-tertiary: rgb(122 79 128);
12
12
  --md-sys-color-on-tertiary: rgb(255 255 255);
13
- --md-sys-color-tertiary-container: rgb(252 215 251);
14
- --md-sys-color-on-tertiary-container: rgb(88 62 91);
13
+ --md-sys-color-tertiary-container: rgb(254 214 255);
14
+ --md-sys-color-on-tertiary-container: rgb(96 55 103);
15
15
  --md-sys-color-error: rgb(186 26 26);
16
16
  --md-sys-color-on-error: rgb(255 255 255);
17
17
  --md-sys-color-error-container: rgb(255 218 214);
@@ -23,29 +23,29 @@
23
23
  --md-sys-color-surface-variant: rgb(225 226 236);
24
24
  --md-sys-color-on-surface-variant: rgb(68 71 79);
25
25
  --md-sys-color-outline: rgb(117 119 127);
26
- --md-sys-color-outline-variant: rgb(197 198 208);
26
+ --md-sys-color-outline-variant: rgb(196 198 208);
27
27
  --md-sys-color-shadow: rgb(0 0 0);
28
28
  --md-sys-color-scrim: rgb(0 0 0);
29
29
  --md-sys-color-inverse-surface: rgb(47 48 54);
30
30
  --md-sys-color-inverse-on-surface: rgb(240 240 247);
31
- --md-sys-color-inverse-primary: rgb(174 198 255);
31
+ --md-sys-color-inverse-primary: rgb(173 198 255);
32
32
  --md-sys-color-primary-fixed: rgb(216 226 255);
33
- --md-sys-color-on-primary-fixed: rgb(0 26 66);
34
- --md-sys-color-primary-fixed-dim: rgb(174 198 255);
35
- --md-sys-color-on-primary-fixed-variant: rgb(44 70 120);
36
- --md-sys-color-secondary-fixed: rgb(219 226 249);
37
- --md-sys-color-on-secondary-fixed: rgb(20 27 44);
38
- --md-sys-color-secondary-fixed-dim: rgb(191 198 220);
39
- --md-sys-color-on-secondary-fixed-variant: rgb(63 71 89);
40
- --md-sys-color-tertiary-fixed: rgb(252 215 251);
41
- --md-sys-color-on-tertiary-fixed: rgb(41 19 45);
42
- --md-sys-color-tertiary-fixed-dim: rgb(222 188 223);
43
- --md-sys-color-on-tertiary-fixed-variant: rgb(88 62 91);
33
+ --md-sys-color-on-primary-fixed: rgb(0 26 65);
34
+ --md-sys-color-primary-fixed-dim: rgb(173 198 255);
35
+ --md-sys-color-on-primary-fixed-variant: rgb(43 70 120);
36
+ --md-sys-color-secondary-fixed: rgb(213 227 255);
37
+ --md-sys-color-on-secondary-fixed: rgb(0 27 60);
38
+ --md-sys-color-secondary-fixed-dim: rgb(167 200 255);
39
+ --md-sys-color-on-secondary-fixed-variant: rgb(36 71 119);
40
+ --md-sys-color-tertiary-fixed: rgb(254 214 255);
41
+ --md-sys-color-on-tertiary-fixed: rgb(48 9 57);
42
+ --md-sys-color-tertiary-fixed-dim: rgb(234 181 238);
43
+ --md-sys-color-on-tertiary-fixed-variant: rgb(96 55 103);
44
44
  --md-sys-color-surface-dim: rgb(217 217 224);
45
45
  --md-sys-color-surface-bright: rgb(249 249 255);
46
46
  --md-sys-color-surface-container-lowest: rgb(255 255 255);
47
47
  --md-sys-color-surface-container-low: rgb(243 243 250);
48
- --md-sys-color-surface-container: rgb(238 237 244);
49
- --md-sys-color-surface-container-high: rgb(232 231 239);
48
+ --md-sys-color-surface-container: rgb(237 237 244);
49
+ --md-sys-color-surface-container-high: rgb(232 231 238);
50
50
  --md-sys-color-surface-container-highest: rgb(226 226 233);
51
51
  }