@robot-admin/naive-ui-components 0.4.3 → 0.4.4

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 (285) hide show
  1. package/dist/C_ActionBar.cjs +1 -5
  2. package/dist/C_ActionBar.js +1 -4
  3. package/dist/C_ActionBar.js.map +1 -0
  4. package/dist/C_ActionBar2.js +1 -195
  5. package/dist/C_ActionBar2.js.map +1 -1
  6. package/dist/C_AntV.cjs +1 -8
  7. package/dist/C_AntV.js +1 -4
  8. package/dist/C_AntV.js.map +1 -0
  9. package/dist/C_AntV2.js +4 -3149
  10. package/dist/C_AntV2.js.map +1 -1
  11. package/dist/C_Barcode.cjs +1 -4
  12. package/dist/C_Barcode.js +1 -3
  13. package/dist/C_Barcode.js.map +1 -0
  14. package/dist/C_Barcode2.js +1 -67
  15. package/dist/C_Barcode2.js.map +1 -1
  16. package/dist/C_Captcha.cjs +1 -4
  17. package/dist/C_Captcha.js +1 -3
  18. package/dist/C_Captcha.js.map +1 -0
  19. package/dist/C_Captcha2.js +1 -154
  20. package/dist/C_Captcha2.js.map +1 -1
  21. package/dist/C_Cascade.cjs +1 -4
  22. package/dist/C_Cascade.js +1 -3
  23. package/dist/C_Cascade.js.map +1 -0
  24. package/dist/C_Cascade2.js +1 -102
  25. package/dist/C_Cascade2.js.map +1 -1
  26. package/dist/C_City.cjs +1 -4
  27. package/dist/C_City.js +1 -3
  28. package/dist/C_City.js.map +1 -0
  29. package/dist/C_City2.js +1 -840
  30. package/dist/C_City2.js.map +1 -1
  31. package/dist/C_Code.cjs +1 -5
  32. package/dist/C_Code.js +1 -4
  33. package/dist/C_Code.js.map +1 -0
  34. package/dist/C_Code2.js +1 -346
  35. package/dist/C_Code2.js.map +1 -1
  36. package/dist/C_CollapsePanel.cjs +1 -6
  37. package/dist/C_CollapsePanel.js +1 -4
  38. package/dist/C_CollapsePanel.js.map +1 -0
  39. package/dist/C_CollapsePanel2.js +1 -318
  40. package/dist/C_CollapsePanel2.js.map +1 -1
  41. package/dist/C_Cron.cjs +1 -15
  42. package/dist/C_Cron.js +1 -4
  43. package/dist/C_Cron.js.map +1 -0
  44. package/dist/C_Cron2.js +1 -1209
  45. package/dist/C_Cron2.js.map +1 -1
  46. package/dist/C_Date.cjs +1 -4
  47. package/dist/C_Date.js +1 -3
  48. package/dist/C_Date.js.map +1 -0
  49. package/dist/C_Date2.js +1 -218
  50. package/dist/C_Date2.js.map +1 -1
  51. package/dist/C_Draggable.cjs +1 -5
  52. package/dist/C_Draggable.js +1 -3
  53. package/dist/C_Draggable.js.map +1 -0
  54. package/dist/C_Draggable2.js +1 -294
  55. package/dist/C_Draggable2.js.map +1 -1
  56. package/dist/C_Editor.cjs +1 -4
  57. package/dist/C_Editor.js +1 -3
  58. package/dist/C_Editor.js.map +1 -0
  59. package/dist/C_Editor2.js +1 -159
  60. package/dist/C_Editor2.js.map +1 -1
  61. package/dist/C_FilePreview.cjs +1 -7
  62. package/dist/C_FilePreview.js +1 -4
  63. package/dist/C_FilePreview.js.map +1 -0
  64. package/dist/C_FilePreview2.js +1 -1031
  65. package/dist/C_FilePreview2.js.map +1 -1
  66. package/dist/C_Form.cjs +1 -16
  67. package/dist/C_Form.js +1 -5
  68. package/dist/C_Form.js.map +1 -0
  69. package/dist/C_Form2.js +1 -2569
  70. package/dist/C_Form2.js.map +1 -1
  71. package/dist/C_FormSearch.cjs +1 -6
  72. package/dist/C_FormSearch.js +1 -3
  73. package/dist/C_FormSearch.js.map +1 -0
  74. package/dist/C_FormSearch2.js +1 -355
  75. package/dist/C_FormSearch2.js.map +1 -1
  76. package/dist/C_FormulaEditor.cjs +1 -13
  77. package/dist/C_FormulaEditor.js +1 -4
  78. package/dist/C_FormulaEditor.js.map +1 -0
  79. package/dist/C_FormulaEditor2.js +1 -1432
  80. package/dist/C_FormulaEditor2.js.map +1 -1
  81. package/dist/C_FullCalendar.cjs +1 -9
  82. package/dist/C_FullCalendar.js +1 -3
  83. package/dist/C_FullCalendar.js.map +1 -0
  84. package/dist/C_FullCalendar2.js +1 -376
  85. package/dist/C_FullCalendar2.js.map +1 -1
  86. package/dist/C_GlobalSearch.cjs +1 -5
  87. package/dist/C_GlobalSearch.js +1 -3
  88. package/dist/C_GlobalSearch.js.map +1 -0
  89. package/dist/C_GlobalSearch2.js +1 -335
  90. package/dist/C_GlobalSearch2.js.map +1 -1
  91. package/dist/C_Guide.cjs +1 -5
  92. package/dist/C_Guide.js +1 -4
  93. package/dist/C_Guide.js.map +1 -0
  94. package/dist/C_Guide2.js +1 -60
  95. package/dist/C_Guide2.js.map +1 -1
  96. package/dist/C_Icon.cjs +1 -4
  97. package/dist/C_Icon.js +1 -3
  98. package/dist/C_Icon.js.map +1 -0
  99. package/dist/C_Icon2.js +1 -285
  100. package/dist/C_Icon2.js.map +1 -1
  101. package/dist/C_ImageCropper.cjs +1 -6
  102. package/dist/C_ImageCropper.js +1 -4
  103. package/dist/C_ImageCropper.js.map +1 -0
  104. package/dist/C_ImageCropper2.js +1 -722
  105. package/dist/C_ImageCropper2.js.map +1 -1
  106. package/dist/C_Language.cjs +1 -5
  107. package/dist/C_Language.js +1 -4
  108. package/dist/C_Language.js.map +1 -0
  109. package/dist/C_Language2.js +1 -78
  110. package/dist/C_Language2.js.map +1 -1
  111. package/dist/C_Map.cjs +1 -7
  112. package/dist/C_Map.js +1 -3
  113. package/dist/C_Map.js.map +1 -0
  114. package/dist/C_Map2.js +1 -198
  115. package/dist/C_Map2.js.map +1 -1
  116. package/dist/C_Markdown.cjs +1 -4
  117. package/dist/C_Markdown.js +1 -3
  118. package/dist/C_Markdown.js.map +1 -0
  119. package/dist/C_Markdown2.js +1 -185
  120. package/dist/C_Markdown2.js.map +1 -1
  121. package/dist/C_NotificationCenter.cjs +1 -20
  122. package/dist/C_NotificationCenter.js +1 -4
  123. package/dist/C_NotificationCenter.js.map +1 -0
  124. package/dist/C_NotificationCenter2.js +1 -1383
  125. package/dist/C_NotificationCenter2.js.map +1 -1
  126. package/dist/C_Progress.cjs +1 -4
  127. package/dist/C_Progress.js +1 -3
  128. package/dist/C_Progress.js.map +1 -0
  129. package/dist/C_Progress2.js +1 -102
  130. package/dist/C_Progress2.js.map +1 -1
  131. package/dist/C_QRCode.cjs +1 -5
  132. package/dist/C_QRCode.js +1 -3
  133. package/dist/C_QRCode.js.map +1 -0
  134. package/dist/C_QRCode2.js +1 -217
  135. package/dist/C_QRCode2.js.map +1 -1
  136. package/dist/C_Signature.cjs +1 -8
  137. package/dist/C_Signature.js +1 -4
  138. package/dist/C_Signature.js.map +1 -0
  139. package/dist/C_Signature2.js +1 -617
  140. package/dist/C_Signature2.js.map +1 -1
  141. package/dist/C_SplitPane.cjs +1 -6
  142. package/dist/C_SplitPane.js +1 -4
  143. package/dist/C_SplitPane.js.map +1 -0
  144. package/dist/C_SplitPane2.js +1 -355
  145. package/dist/C_SplitPane2.js.map +1 -1
  146. package/dist/C_Steps.cjs +1 -4
  147. package/dist/C_Steps.js +1 -3
  148. package/dist/C_Steps.js.map +1 -0
  149. package/dist/C_Steps2.js +1 -81
  150. package/dist/C_Steps2.js.map +1 -1
  151. package/dist/C_Table.cjs +1 -20
  152. package/dist/C_Table.js +1 -6
  153. package/dist/C_Table.js.map +1 -0
  154. package/dist/C_Table2.js +1 -3023
  155. package/dist/C_Table2.js.map +1 -1
  156. package/dist/C_Theme.cjs +1 -5
  157. package/dist/C_Theme.js +1 -4
  158. package/dist/C_Theme.js.map +1 -0
  159. package/dist/C_Theme2.js +1 -63
  160. package/dist/C_Theme2.js.map +1 -1
  161. package/dist/C_Time.cjs +1 -5
  162. package/dist/C_Time.js +1 -3
  163. package/dist/C_Time.js.map +1 -0
  164. package/dist/C_Time2.js +1 -198
  165. package/dist/C_Time2.js.map +1 -1
  166. package/dist/C_Tree.cjs +1 -7
  167. package/dist/C_Tree.js +1 -4
  168. package/dist/C_Tree.js.map +1 -0
  169. package/dist/C_Tree2.js +1 -440
  170. package/dist/C_Tree2.js.map +1 -1
  171. package/dist/C_Upload.cjs +1 -12
  172. package/dist/C_Upload.js +1 -4
  173. package/dist/C_Upload.js.map +1 -0
  174. package/dist/C_Upload2.js +2 -1365
  175. package/dist/C_Upload2.js.map +1 -1
  176. package/dist/C_VideoPlayer.cjs +1 -23
  177. package/dist/C_VideoPlayer.js +1 -3
  178. package/dist/C_VideoPlayer.js.map +1 -0
  179. package/dist/C_VideoPlayer2.js +3 -1932
  180. package/dist/C_VideoPlayer2.js.map +1 -1
  181. package/dist/C_VtableGantt.cjs +1 -6
  182. package/dist/C_VtableGantt.js +1 -4
  183. package/dist/C_VtableGantt.js.map +1 -0
  184. package/dist/C_VtableGantt2.js +1 -872
  185. package/dist/C_VtableGantt2.js.map +1 -1
  186. package/dist/C_WaterFall.cjs +1 -13
  187. package/dist/C_WaterFall.js +1 -3
  188. package/dist/C_WaterFall.js.map +1 -0
  189. package/dist/C_WaterFall2.js +1 -364
  190. package/dist/C_WaterFall2.js.map +1 -1
  191. package/dist/C_WorkFlow.cjs +1 -8
  192. package/dist/C_WorkFlow.js +1 -4
  193. package/dist/C_WorkFlow.js.map +1 -0
  194. package/dist/C_WorkFlow2.js +1 -1983
  195. package/dist/C_WorkFlow2.js.map +1 -1
  196. package/dist/chunk.js +1 -18
  197. package/dist/city.js +1 -4816
  198. package/dist/constants.d.ts +2 -2
  199. package/dist/constants2.d.ts +3 -3
  200. package/dist/constants3.d.ts +3 -3
  201. package/dist/constants4.d.ts +5 -5
  202. package/dist/constants5.d.ts +2 -2
  203. package/dist/data.d.ts +1 -1
  204. package/dist/export-helper.js +1 -9
  205. package/dist/index.cjs +2 -413
  206. package/dist/index.cjs.map +1 -0
  207. package/dist/index.d.cts +1 -2
  208. package/dist/index.d.ts +1 -2
  209. package/dist/index.js +1 -231
  210. package/dist/index.js.map +1 -1
  211. package/dist/index.vue.d.ts +2 -2
  212. package/dist/index10.vue.d.ts +5 -5
  213. package/dist/index12.vue.d.ts +3 -3
  214. package/dist/index13.vue.d.ts +3 -3
  215. package/dist/index14.vue.d.ts +3 -3
  216. package/dist/index16.vue.d.ts +3 -3
  217. package/dist/index3.vue.d.ts +3 -3
  218. package/dist/index5.vue.d.ts +1 -1
  219. package/dist/index7.vue.d.ts +4 -4
  220. package/dist/index8.vue.d.ts +2 -2
  221. package/dist/resolver.cjs +2 -89
  222. package/dist/resolver.cjs.map +1 -0
  223. package/dist/resolver.js +1 -86
  224. package/dist/resolver.js.map +1 -1
  225. package/dist/storage.js +1 -30
  226. package/dist/storage.js.map +1 -1
  227. package/dist/useCollapsePanel.d.ts +2 -2
  228. package/dist/useCropperCore.d.ts +8 -8
  229. package/dist/useDraggableLayout.d.ts +4 -4
  230. package/dist/useDynamicFormState.d.ts +7 -7
  231. package/dist/useEdgeInteraction.d.ts +1 -1
  232. package/dist/useFullscreen.d.ts +2 -2
  233. package/dist/useInfiniteScroll.d.ts +1 -1
  234. package/dist/useModalEdit.d.ts +1 -1
  235. package/dist/useQRCode.d.ts +3 -3
  236. package/dist/useSearchState.d.ts +2 -2
  237. package/dist/useSignatureHistory.d.ts +1 -1
  238. package/dist/useSplitResize.d.ts +6 -6
  239. package/dist/useTimeSelection.d.ts +2 -2
  240. package/dist/useTreeOperations.d.ts +6 -6
  241. package/dist/useWorkflowValidation.d.ts +4 -4
  242. package/package.json +1 -2
  243. package/dist/constants.d.ts.map +0 -1
  244. package/dist/constants2.d.ts.map +0 -1
  245. package/dist/constants3.d.ts.map +0 -1
  246. package/dist/constants4.d.ts.map +0 -1
  247. package/dist/constants5.d.ts.map +0 -1
  248. package/dist/data.d.ts.map +0 -1
  249. package/dist/index.d.cts.map +0 -1
  250. package/dist/index.d.ts.map +0 -1
  251. package/dist/index.vue.d.ts.map +0 -1
  252. package/dist/index10.vue.d.ts.map +0 -1
  253. package/dist/index11.vue.d.ts.map +0 -1
  254. package/dist/index12.vue.d.ts.map +0 -1
  255. package/dist/index13.vue.d.ts.map +0 -1
  256. package/dist/index14.vue.d.ts.map +0 -1
  257. package/dist/index15.vue.d.ts.map +0 -1
  258. package/dist/index16.vue.d.ts.map +0 -1
  259. package/dist/index2.vue.d.ts.map +0 -1
  260. package/dist/index3.vue.d.ts.map +0 -1
  261. package/dist/index4.vue.d.ts.map +0 -1
  262. package/dist/index5.vue.d.ts.map +0 -1
  263. package/dist/index6.vue.d.ts.map +0 -1
  264. package/dist/index7.vue.d.ts.map +0 -1
  265. package/dist/index8.vue.d.ts.map +0 -1
  266. package/dist/index9.vue.d.ts.map +0 -1
  267. package/dist/resolver.d.cts.map +0 -1
  268. package/dist/resolver.d.ts.map +0 -1
  269. package/dist/useCalendarEvents.d.ts.map +0 -1
  270. package/dist/useCollapsePanel.d.ts.map +0 -1
  271. package/dist/useCropperCore.d.ts.map +0 -1
  272. package/dist/useDraggableLayout.d.ts.map +0 -1
  273. package/dist/useDynamicFormState.d.ts.map +0 -1
  274. package/dist/useEdgeInteraction.d.ts.map +0 -1
  275. package/dist/useFullscreen.d.ts.map +0 -1
  276. package/dist/useGlobalSearch.d.ts.map +0 -1
  277. package/dist/useInfiniteScroll.d.ts.map +0 -1
  278. package/dist/useModalEdit.d.ts.map +0 -1
  279. package/dist/useQRCode.d.ts.map +0 -1
  280. package/dist/useSearchState.d.ts.map +0 -1
  281. package/dist/useSignatureHistory.d.ts.map +0 -1
  282. package/dist/useSplitResize.d.ts.map +0 -1
  283. package/dist/useTimeSelection.d.ts.map +0 -1
  284. package/dist/useTreeOperations.d.ts.map +0 -1
  285. package/dist/useWorkflowValidation.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"C_Cascade2.js","names":["placeholders"],"sources":["../src/components/C_Cascade/index.vue","../src/components/C_Cascade/index.vue","../src/components/C_Cascade/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;ECyCA,MAAM,QAAQ;EAWd,MAAM,OAAO;EAKb,MAAM,SAAS;GAAC;GAAG;GAAG;GAAE;EACxB,MAAM,iBAAiB,IAAgC;GAAC;GAAM;GAAM;GAAK,CAAC;EAE1E,MAAM,gBAAgB,UAAiC;AACrD,OAAI,UAAU,EAAG,QAAO,MAAM;AAC9B,OAAI,CAAC,eAAe,MAAM,QAAQ,GAAI,QAAO,EAAE;AAE/C,UADmB,aAAa,QAAQ,EAAE,CAE7B,MAAM,MAAM,EAAE,UAAU,eAAe,MAAM,QAAQ,GAAG,EAC/D,YAAY,EAAE;;EAItB,MAAM,eAAe,eACnB,OAAO,KAAK,UACV,aAAa,MAAM,CAAC,KAAK,UAAU;GACjC,OAAO,KAAK;GACZ,OAAO,KAAK;GACb,EAAE,CACJ,CACF;EAED,MAAM,gBAAgB,UAAkB;AACtC,kBAAe,MAAM,OACnB,QAAQ,GACR,OAAO,SAAS,QAAQ,GACxB,GAAG,MAAM,OAAO,SAAS,QAAQ,EAAE,CAAC,KAAK,KAAK,CAC/C;AACD,cAAW;;EAGb,MAAM,mBAAmB,UAAkB;GACzC,MAAM,QAAQ,eAAe,MAAM;AACnC,OAAI,CAAC,MAAO,QAAO;GAEnB,MAAM,OADO,aAAa,MAAM,CACd,MAAM,MAAM,EAAE,UAAU,MAAM;AAChD,UAAO,OAAO;IAAE,OAAO,KAAK;IAAO,OAAO,KAAK;IAAO,GAAG;;EAG3D,MAAM,kBAAkB;GACtB,MAAM,SAAuB;IAC3B,SAAS,gBAAgB,EAAE;IAC3B,WAAW,gBAAgB,EAAE;IAC7B,UAAU,gBAAgB,EAAE;IAC7B;AACD,QAAK,qBAAqB,OAAO;AACjC,QAAK,UAAU,OAAO;;AAGxB,cACQ,MAAM,aACX,QAAQ;AACP,kBAAe,QAAQ;IACrB,KAAK,SAAS,SAAS;IACvB,KAAK,WAAW,SAAS;IACzB,KAAK,UAAU,SAAS;IACzB;KAEH;GAAE,WAAW;GAAM,MAAM;GAAM,CAChC;;uBA5GC,mBAYM,OAZN,YAYM,eAXJ,mBAUE,UAAA,MAAA,WATyB,SAAjB,OAAO,UAAK;WADtB,YAUE,MAAA,QAAA,EAAA;KARC,KAAK;KACE,OAAO,eAAA,MAAe;oCAAf,eAAA,MAAe,SAAK,SAAA,WAKpB,aAAa,MAAK,CAAA;KAJhC,SAAS,aAAA,MAAa;KACvB,WAAA;KACC,aAAaA,KAAAA,aAAa;KAC1B,UAAU,QAAK,KAAA,CAAS,eAAA,MAAe,QAAK;KAE7C,OAAM"}
1
+ {"version":3,"file":"C_Cascade2.js","names":["placeholders"],"sources":["../src/components/C_Cascade/index.vue","../src/components/C_Cascade/index.vue","../src/components/C_Cascade/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n"],"mappings":"ucEyCA,IAAM,EAAQ,EAWR,EAAO,EAKP,EAAS,CAAC,EAAG,EAAG,EAAE,CAClB,EAAiB,EAAgC,CAAC,KAAM,KAAM,KAAK,CAAC,CAEpE,EAAgB,GAChB,IAAU,EAAU,EAAM,KACzB,EAAe,MAAM,EAAQ,IACf,EAAa,EAAQ,EAAE,CAE7B,KAAM,GAAM,EAAE,QAAU,EAAe,MAAM,EAAQ,GAAG,EAC/D,UAJuC,EAAE,CAQ3C,EAAe,MACnB,EAAO,IAAK,GACV,EAAa,EAAM,CAAC,IAAK,IAAU,CACjC,MAAO,EAAK,MACZ,MAAO,EAAK,MACb,EAAE,CACJ,CACF,CAEK,EAAgB,GAAkB,CACtC,EAAe,MAAM,OACnB,EAAQ,EACR,EAAO,OAAS,EAAQ,EACxB,GAAG,MAAM,EAAO,OAAS,EAAQ,EAAE,CAAC,KAAK,KAAK,CAC/C,CACD,GAAW,EAGP,EAAmB,GAAkB,CACzC,IAAM,EAAQ,EAAe,MAAM,GACnC,GAAI,CAAC,EAAO,OAAO,KAEnB,IAAM,EADO,EAAa,EAAM,CACd,KAAM,GAAM,EAAE,QAAU,EAAM,CAChD,OAAO,EAAO,CAAE,MAAO,EAAK,MAAO,MAAO,EAAK,MAAO,CAAG,MAGrD,MAAkB,CACtB,IAAM,EAAuB,CAC3B,QAAS,EAAgB,EAAE,CAC3B,UAAW,EAAgB,EAAE,CAC7B,SAAU,EAAgB,EAAE,CAC7B,CACD,EAAK,oBAAqB,EAAO,CACjC,EAAK,SAAU,EAAO,SAGxB,MACQ,EAAM,WACX,GAAQ,CACP,EAAe,MAAQ,CACrB,GAAK,SAAS,OAAS,KACvB,GAAK,WAAW,OAAS,KACzB,GAAK,UAAU,OAAS,KACzB,EAEH,CAAE,UAAW,GAAM,KAAM,GAAM,CAChC,aA5GC,EAYM,MAZN,EAYM,EAAA,GAAA,CAXJ,EAUE,EAAA,KAAA,EATyB,GAAjB,EAAO,IADjB,EAUE,EAAA,EAAA,CAAA,CARC,IAAK,EACE,MAAO,EAAA,MAAe,wBAAf,EAAA,MAAe,GAAK,EAAA,GAKpB,EAAa,EAAK,CAAA,CAJhC,QAAS,EAAA,MAAa,GACvB,UAAA,GACC,YAAaA,EAAAA,aAAa,GAC1B,SAAU,EAAK,GAAA,CAAS,EAAA,MAAe,EAAK,GAE7C,MAAM"}
package/dist/C_City.cjs CHANGED
@@ -1,4 +1 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_C_City = require('./C_City.js');
3
-
4
- exports.C_City = require_C_City.C_City_default;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./C_City.js`);exports.C_City=e.t;
package/dist/C_City.js CHANGED
@@ -1,3 +1 @@
1
- import { t as C_City_default } from "./C_City2.js";
2
-
3
- export { C_City_default as C_City };
1
+ import{t as e}from"./C_City2.js";export{e as C_City};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_City.js","names":["modelValue","placeholder","showLetters"],"sources":["../src/components/C_City/province.json","../src/components/C_City/index.vue","../src/components/C_City/index.vue","../src/components/C_City/index.vue"],"sourcesContent":["","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-30\r\n * @Description: 城市选择器组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NPopover\r\n v-model:show=\"visible\"\r\n placement=\"bottom-start\"\r\n :width=\"430\"\r\n trigger=\"click\"\r\n :show-arrow=\"false\"\r\n >\r\n <template #trigger>\r\n <slot name=\"trigger\" :value=\"modelValue\" :visible=\"visible\">\r\n <div class=\"city-selector-trigger\">\r\n <span class=\"city-selector-trigger__text\">{{\r\n modelValue || placeholder\r\n }}</span>\r\n </div>\r\n </slot>\r\n </template>\r\n\r\n <div class=\"city-selector-content\">\r\n <div class=\"city-selector-header\">\r\n <NRadioGroup v-model:value=\"radioValue\" size=\"small\">\r\n <NRadioButton value=\"city\">按城市</NRadioButton>\r\n <NRadioButton value=\"province\">按省份</NRadioButton>\r\n </NRadioGroup>\r\n <NSelect\r\n v-model:value=\"searchValue\"\r\n class=\"city-selector-search\"\r\n :options=\"searchOptions\"\r\n filterable\r\n clearable\r\n placeholder=\"搜索城市\"\r\n @update:value=\"handleSearchSelect\"\r\n />\r\n </div>\r\n\r\n <div v-if=\"showLetters\" class=\"city-selector-letters\">\r\n <span\r\n v-for=\"letter in letters\"\r\n :key=\"letter\"\r\n class=\"city-selector-letter\"\r\n @click=\"scrollToLetter(letter)\"\r\n >\r\n {{ letter }}\r\n </span>\r\n </div>\r\n\r\n <NScrollbar class=\"city-selector-body\">\r\n <div v-if=\"radioValue === 'city'\" class=\"city-list\">\r\n <div\r\n v-for=\"(cities, letter) in cityDataByLetter\"\r\n :key=\"letter\"\r\n :id=\"`letter-${letter}`\"\r\n class=\"city-group\"\r\n >\r\n <div class=\"city-group__letter\">{{ letter }}:</div>\r\n <div class=\"city-group__cities\">\r\n <span\r\n v-for=\"(city, index) in cities\"\r\n :key=\"`${letter}-${index}`\"\r\n class=\"city-item\"\r\n :class=\"{ 'is-active': modelValue === city.name }\"\r\n @click=\"handleCitySelect(city.name)\"\r\n >\r\n {{ city.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-else class=\"province-list\">\r\n <div\r\n v-for=\"province in allProvinces\"\r\n :key=\"province.id\"\r\n :id=\"`letter-${province.id}`\"\r\n class=\"province-group\"\r\n >\r\n <div class=\"province-group__name\">{{ province.name }}:</div>\r\n <div class=\"province-group__cities\">\r\n <span\r\n v-for=\"(city, index) in province.data\"\r\n :key=\"`${province.id}-${index}`\"\r\n class=\"city-item\"\r\n :class=\"{ 'is-active': modelValue === city }\"\r\n @click=\"handleCitySelect(city)\"\r\n >\r\n {{ city }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </NScrollbar>\r\n </div>\r\n </NPopover>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted } from \"vue\";\r\nimport {\r\n NPopover,\r\n NRadioGroup,\r\n NRadioButton,\r\n NSelect,\r\n NScrollbar,\r\n} from \"naive-ui\";\r\nimport type { SelectOption } from \"naive-ui\";\r\nimport provinceData from \"./province.json\";\r\n\r\ndefineOptions({ name: \"C_City\" });\r\n\r\ninterface CityItem {\r\n id: number;\r\n spell: string;\r\n name: string;\r\n}\r\n\r\n// 城市数据懒加载(83KB JSON 仅在组件挂载时加载)\r\nconst cityData = ref<{ cities: Record<string, CityItem[]> } | null>(null);\r\n\r\nonMounted(async () => {\r\n const mod = await import(\"./city.json\");\r\n cityData.value = mod.default ?? mod;\r\n});\r\n\r\ninterface ProvinceItem {\r\n id?: string;\r\n name: string;\r\n data: string[];\r\n}\r\n\r\ninterface Props {\r\n modelValue?: string;\r\n placeholder?: string;\r\n showLetters?: boolean;\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"change\", value: string): void;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n placeholder: \"请选择城市\",\r\n showLetters: true,\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst visible = ref(false);\r\nconst radioValue = ref<\"city\" | \"province\">(\"city\");\r\nconst searchValue = ref(\"\");\r\n\r\nconst allProvinces = computed(() => {\r\n const provinces: ProvinceItem[] = [];\r\n Object.values(provinceData).forEach((group) => {\r\n provinces.push(...(group as ProvinceItem[]));\r\n });\r\n return provinces;\r\n});\r\n\r\nconst cityDataByLetter = computed(() => {\r\n if (cityData.value?.cities) {\r\n return cityData.value.cities;\r\n }\r\n // 数据未加载时,从省份数据生成城市索引作为 fallback\r\n const cities: Record<string, CityItem[]> = {};\r\n let cityId = 1;\r\n const citySet = new Set<string>();\r\n allProvinces.value.forEach((province) => {\r\n province.data.forEach((cityName) => {\r\n citySet.add(cityName);\r\n });\r\n });\r\n Array.from(citySet).forEach((cityName) => {\r\n const letter = cityName[0].toUpperCase();\r\n if (!cities[letter]) cities[letter] = [];\r\n cities[letter].push({ id: cityId++, name: cityName, spell: \"\" });\r\n });\r\n const sortedCities: Record<string, CityItem[]> = {};\r\n Object.keys(cities)\r\n .sort()\r\n .forEach((letter) => {\r\n sortedCities[letter] = cities[letter].sort((a, b) =>\r\n a.name.localeCompare(b.name, \"zh-CN\"),\r\n );\r\n });\r\n return sortedCities;\r\n});\r\n\r\nconst letters = computed(() => {\r\n if (radioValue.value === \"city\") {\r\n return Object.keys(cityDataByLetter.value).sort();\r\n } else {\r\n const provinceLetters = new Set<string>();\r\n Object.keys(provinceData).forEach((key) => {\r\n if (key !== \"直辖市\" && key !== \"港澳\") {\r\n provinceLetters.add(key);\r\n }\r\n });\r\n const result = Array.from(provinceLetters).sort();\r\n result.push(\"直辖市\", \"港澳\");\r\n return result;\r\n }\r\n});\r\n\r\nconst searchOptions = computed((): SelectOption[] => {\r\n if (radioValue.value === \"city\") {\r\n const options: SelectOption[] = [];\r\n Object.values(cityDataByLetter.value).forEach((cities) => {\r\n (cities as CityItem[]).forEach((city) => {\r\n options.push({\r\n label: city.name,\r\n value: city.name,\r\n });\r\n });\r\n });\r\n return options;\r\n } else {\r\n return allProvinces.value.flatMap((province) =>\r\n province.data.map((city) => ({\r\n label: `${city} (${province.name})`,\r\n value: city,\r\n })),\r\n );\r\n }\r\n});\r\n\r\nconst handleCitySelect = (cityName: string): void => {\r\n emit(\"update:modelValue\", cityName);\r\n emit(\"change\", cityName);\r\n visible.value = false;\r\n};\r\n\r\nconst handleSearchSelect = (value: string): void => {\r\n if (value) {\r\n handleCitySelect(value);\r\n searchValue.value = \"\";\r\n }\r\n};\r\n\r\nconst scrollToLetter = (letter: string): void => {\r\n const element = document.getElementById(`letter-${letter}`);\r\n if (element) {\r\n element.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-30\r\n * @Description: 城市选择器组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NPopover\r\n v-model:show=\"visible\"\r\n placement=\"bottom-start\"\r\n :width=\"430\"\r\n trigger=\"click\"\r\n :show-arrow=\"false\"\r\n >\r\n <template #trigger>\r\n <slot name=\"trigger\" :value=\"modelValue\" :visible=\"visible\">\r\n <div class=\"city-selector-trigger\">\r\n <span class=\"city-selector-trigger__text\">{{\r\n modelValue || placeholder\r\n }}</span>\r\n </div>\r\n </slot>\r\n </template>\r\n\r\n <div class=\"city-selector-content\">\r\n <div class=\"city-selector-header\">\r\n <NRadioGroup v-model:value=\"radioValue\" size=\"small\">\r\n <NRadioButton value=\"city\">按城市</NRadioButton>\r\n <NRadioButton value=\"province\">按省份</NRadioButton>\r\n </NRadioGroup>\r\n <NSelect\r\n v-model:value=\"searchValue\"\r\n class=\"city-selector-search\"\r\n :options=\"searchOptions\"\r\n filterable\r\n clearable\r\n placeholder=\"搜索城市\"\r\n @update:value=\"handleSearchSelect\"\r\n />\r\n </div>\r\n\r\n <div v-if=\"showLetters\" class=\"city-selector-letters\">\r\n <span\r\n v-for=\"letter in letters\"\r\n :key=\"letter\"\r\n class=\"city-selector-letter\"\r\n @click=\"scrollToLetter(letter)\"\r\n >\r\n {{ letter }}\r\n </span>\r\n </div>\r\n\r\n <NScrollbar class=\"city-selector-body\">\r\n <div v-if=\"radioValue === 'city'\" class=\"city-list\">\r\n <div\r\n v-for=\"(cities, letter) in cityDataByLetter\"\r\n :key=\"letter\"\r\n :id=\"`letter-${letter}`\"\r\n class=\"city-group\"\r\n >\r\n <div class=\"city-group__letter\">{{ letter }}:</div>\r\n <div class=\"city-group__cities\">\r\n <span\r\n v-for=\"(city, index) in cities\"\r\n :key=\"`${letter}-${index}`\"\r\n class=\"city-item\"\r\n :class=\"{ 'is-active': modelValue === city.name }\"\r\n @click=\"handleCitySelect(city.name)\"\r\n >\r\n {{ city.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-else class=\"province-list\">\r\n <div\r\n v-for=\"province in allProvinces\"\r\n :key=\"province.id\"\r\n :id=\"`letter-${province.id}`\"\r\n class=\"province-group\"\r\n >\r\n <div class=\"province-group__name\">{{ province.name }}:</div>\r\n <div class=\"province-group__cities\">\r\n <span\r\n v-for=\"(city, index) in province.data\"\r\n :key=\"`${province.id}-${index}`\"\r\n class=\"city-item\"\r\n :class=\"{ 'is-active': modelValue === city }\"\r\n @click=\"handleCitySelect(city)\"\r\n >\r\n {{ city }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </NScrollbar>\r\n </div>\r\n </NPopover>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted } from \"vue\";\r\nimport {\r\n NPopover,\r\n NRadioGroup,\r\n NRadioButton,\r\n NSelect,\r\n NScrollbar,\r\n} from \"naive-ui\";\r\nimport type { SelectOption } from \"naive-ui\";\r\nimport provinceData from \"./province.json\";\r\n\r\ndefineOptions({ name: \"C_City\" });\r\n\r\ninterface CityItem {\r\n id: number;\r\n spell: string;\r\n name: string;\r\n}\r\n\r\n// 城市数据懒加载(83KB JSON 仅在组件挂载时加载)\r\nconst cityData = ref<{ cities: Record<string, CityItem[]> } | null>(null);\r\n\r\nonMounted(async () => {\r\n const mod = await import(\"./city.json\");\r\n cityData.value = mod.default ?? mod;\r\n});\r\n\r\ninterface ProvinceItem {\r\n id?: string;\r\n name: string;\r\n data: string[];\r\n}\r\n\r\ninterface Props {\r\n modelValue?: string;\r\n placeholder?: string;\r\n showLetters?: boolean;\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"change\", value: string): void;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n placeholder: \"请选择城市\",\r\n showLetters: true,\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst visible = ref(false);\r\nconst radioValue = ref<\"city\" | \"province\">(\"city\");\r\nconst searchValue = ref(\"\");\r\n\r\nconst allProvinces = computed(() => {\r\n const provinces: ProvinceItem[] = [];\r\n Object.values(provinceData).forEach((group) => {\r\n provinces.push(...(group as ProvinceItem[]));\r\n });\r\n return provinces;\r\n});\r\n\r\nconst cityDataByLetter = computed(() => {\r\n if (cityData.value?.cities) {\r\n return cityData.value.cities;\r\n }\r\n // 数据未加载时,从省份数据生成城市索引作为 fallback\r\n const cities: Record<string, CityItem[]> = {};\r\n let cityId = 1;\r\n const citySet = new Set<string>();\r\n allProvinces.value.forEach((province) => {\r\n province.data.forEach((cityName) => {\r\n citySet.add(cityName);\r\n });\r\n });\r\n Array.from(citySet).forEach((cityName) => {\r\n const letter = cityName[0].toUpperCase();\r\n if (!cities[letter]) cities[letter] = [];\r\n cities[letter].push({ id: cityId++, name: cityName, spell: \"\" });\r\n });\r\n const sortedCities: Record<string, CityItem[]> = {};\r\n Object.keys(cities)\r\n .sort()\r\n .forEach((letter) => {\r\n sortedCities[letter] = cities[letter].sort((a, b) =>\r\n a.name.localeCompare(b.name, \"zh-CN\"),\r\n );\r\n });\r\n return sortedCities;\r\n});\r\n\r\nconst letters = computed(() => {\r\n if (radioValue.value === \"city\") {\r\n return Object.keys(cityDataByLetter.value).sort();\r\n } else {\r\n const provinceLetters = new Set<string>();\r\n Object.keys(provinceData).forEach((key) => {\r\n if (key !== \"直辖市\" && key !== \"港澳\") {\r\n provinceLetters.add(key);\r\n }\r\n });\r\n const result = Array.from(provinceLetters).sort();\r\n result.push(\"直辖市\", \"港澳\");\r\n return result;\r\n }\r\n});\r\n\r\nconst searchOptions = computed((): SelectOption[] => {\r\n if (radioValue.value === \"city\") {\r\n const options: SelectOption[] = [];\r\n Object.values(cityDataByLetter.value).forEach((cities) => {\r\n (cities as CityItem[]).forEach((city) => {\r\n options.push({\r\n label: city.name,\r\n value: city.name,\r\n });\r\n });\r\n });\r\n return options;\r\n } else {\r\n return allProvinces.value.flatMap((province) =>\r\n province.data.map((city) => ({\r\n label: `${city} (${province.name})`,\r\n value: city,\r\n })),\r\n );\r\n }\r\n});\r\n\r\nconst handleCitySelect = (cityName: string): void => {\r\n emit(\"update:modelValue\", cityName);\r\n emit(\"change\", cityName);\r\n visible.value = false;\r\n};\r\n\r\nconst handleSearchSelect = (value: string): void => {\r\n if (value) {\r\n handleCitySelect(value);\r\n searchValue.value = \"\";\r\n }\r\n};\r\n\r\nconst scrollToLetter = (letter: string): void => {\r\n const element = document.getElementById(`letter-${letter}`);\r\n if (element) {\r\n element.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-30\r\n * @Description: 城市选择器组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NPopover\r\n v-model:show=\"visible\"\r\n placement=\"bottom-start\"\r\n :width=\"430\"\r\n trigger=\"click\"\r\n :show-arrow=\"false\"\r\n >\r\n <template #trigger>\r\n <slot name=\"trigger\" :value=\"modelValue\" :visible=\"visible\">\r\n <div class=\"city-selector-trigger\">\r\n <span class=\"city-selector-trigger__text\">{{\r\n modelValue || placeholder\r\n }}</span>\r\n </div>\r\n </slot>\r\n </template>\r\n\r\n <div class=\"city-selector-content\">\r\n <div class=\"city-selector-header\">\r\n <NRadioGroup v-model:value=\"radioValue\" size=\"small\">\r\n <NRadioButton value=\"city\">按城市</NRadioButton>\r\n <NRadioButton value=\"province\">按省份</NRadioButton>\r\n </NRadioGroup>\r\n <NSelect\r\n v-model:value=\"searchValue\"\r\n class=\"city-selector-search\"\r\n :options=\"searchOptions\"\r\n filterable\r\n clearable\r\n placeholder=\"搜索城市\"\r\n @update:value=\"handleSearchSelect\"\r\n />\r\n </div>\r\n\r\n <div v-if=\"showLetters\" class=\"city-selector-letters\">\r\n <span\r\n v-for=\"letter in letters\"\r\n :key=\"letter\"\r\n class=\"city-selector-letter\"\r\n @click=\"scrollToLetter(letter)\"\r\n >\r\n {{ letter }}\r\n </span>\r\n </div>\r\n\r\n <NScrollbar class=\"city-selector-body\">\r\n <div v-if=\"radioValue === 'city'\" class=\"city-list\">\r\n <div\r\n v-for=\"(cities, letter) in cityDataByLetter\"\r\n :key=\"letter\"\r\n :id=\"`letter-${letter}`\"\r\n class=\"city-group\"\r\n >\r\n <div class=\"city-group__letter\">{{ letter }}:</div>\r\n <div class=\"city-group__cities\">\r\n <span\r\n v-for=\"(city, index) in cities\"\r\n :key=\"`${letter}-${index}`\"\r\n class=\"city-item\"\r\n :class=\"{ 'is-active': modelValue === city.name }\"\r\n @click=\"handleCitySelect(city.name)\"\r\n >\r\n {{ city.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-else class=\"province-list\">\r\n <div\r\n v-for=\"province in allProvinces\"\r\n :key=\"province.id\"\r\n :id=\"`letter-${province.id}`\"\r\n class=\"province-group\"\r\n >\r\n <div class=\"province-group__name\">{{ province.name }}:</div>\r\n <div class=\"province-group__cities\">\r\n <span\r\n v-for=\"(city, index) in province.data\"\r\n :key=\"`${province.id}-${index}`\"\r\n class=\"city-item\"\r\n :class=\"{ 'is-active': modelValue === city }\"\r\n @click=\"handleCitySelect(city)\"\r\n >\r\n {{ city }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </NScrollbar>\r\n </div>\r\n </NPopover>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted } from \"vue\";\r\nimport {\r\n NPopover,\r\n NRadioGroup,\r\n NRadioButton,\r\n NSelect,\r\n NScrollbar,\r\n} from \"naive-ui\";\r\nimport type { SelectOption } from \"naive-ui\";\r\nimport provinceData from \"./province.json\";\r\n\r\ndefineOptions({ name: \"C_City\" });\r\n\r\ninterface CityItem {\r\n id: number;\r\n spell: string;\r\n name: string;\r\n}\r\n\r\n// 城市数据懒加载(83KB JSON 仅在组件挂载时加载)\r\nconst cityData = ref<{ cities: Record<string, CityItem[]> } | null>(null);\r\n\r\nonMounted(async () => {\r\n const mod = await import(\"./city.json\");\r\n cityData.value = mod.default ?? mod;\r\n});\r\n\r\ninterface ProvinceItem {\r\n id?: string;\r\n name: string;\r\n data: string[];\r\n}\r\n\r\ninterface Props {\r\n modelValue?: string;\r\n placeholder?: string;\r\n showLetters?: boolean;\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"change\", value: string): void;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n placeholder: \"请选择城市\",\r\n showLetters: true,\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst visible = ref(false);\r\nconst radioValue = ref<\"city\" | \"province\">(\"city\");\r\nconst searchValue = ref(\"\");\r\n\r\nconst allProvinces = computed(() => {\r\n const provinces: ProvinceItem[] = [];\r\n Object.values(provinceData).forEach((group) => {\r\n provinces.push(...(group as ProvinceItem[]));\r\n });\r\n return provinces;\r\n});\r\n\r\nconst cityDataByLetter = computed(() => {\r\n if (cityData.value?.cities) {\r\n return cityData.value.cities;\r\n }\r\n // 数据未加载时,从省份数据生成城市索引作为 fallback\r\n const cities: Record<string, CityItem[]> = {};\r\n let cityId = 1;\r\n const citySet = new Set<string>();\r\n allProvinces.value.forEach((province) => {\r\n province.data.forEach((cityName) => {\r\n citySet.add(cityName);\r\n });\r\n });\r\n Array.from(citySet).forEach((cityName) => {\r\n const letter = cityName[0].toUpperCase();\r\n if (!cities[letter]) cities[letter] = [];\r\n cities[letter].push({ id: cityId++, name: cityName, spell: \"\" });\r\n });\r\n const sortedCities: Record<string, CityItem[]> = {};\r\n Object.keys(cities)\r\n .sort()\r\n .forEach((letter) => {\r\n sortedCities[letter] = cities[letter].sort((a, b) =>\r\n a.name.localeCompare(b.name, \"zh-CN\"),\r\n );\r\n });\r\n return sortedCities;\r\n});\r\n\r\nconst letters = computed(() => {\r\n if (radioValue.value === \"city\") {\r\n return Object.keys(cityDataByLetter.value).sort();\r\n } else {\r\n const provinceLetters = new Set<string>();\r\n Object.keys(provinceData).forEach((key) => {\r\n if (key !== \"直辖市\" && key !== \"港澳\") {\r\n provinceLetters.add(key);\r\n }\r\n });\r\n const result = Array.from(provinceLetters).sort();\r\n result.push(\"直辖市\", \"港澳\");\r\n return result;\r\n }\r\n});\r\n\r\nconst searchOptions = computed((): SelectOption[] => {\r\n if (radioValue.value === \"city\") {\r\n const options: SelectOption[] = [];\r\n Object.values(cityDataByLetter.value).forEach((cities) => {\r\n (cities as CityItem[]).forEach((city) => {\r\n options.push({\r\n label: city.name,\r\n value: city.name,\r\n });\r\n });\r\n });\r\n return options;\r\n } else {\r\n return allProvinces.value.flatMap((province) =>\r\n province.data.map((city) => ({\r\n label: `${city} (${province.name})`,\r\n value: city,\r\n })),\r\n );\r\n }\r\n});\r\n\r\nconst handleCitySelect = (cityName: string): void => {\r\n emit(\"update:modelValue\", cityName);\r\n emit(\"change\", cityName);\r\n visible.value = false;\r\n};\r\n\r\nconst handleSearchSelect = (value: string): void => {\r\n if (value) {\r\n handleCitySelect(value);\r\n searchValue.value = \"\";\r\n }\r\n};\r\n\r\nconst scrollToLetter = (letter: string): void => {\r\n const element = document.getElementById(`letter-${letter}`);\r\n if (element) {\r\n element.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}