af-mobile-client-vue3 1.3.16 → 1.3.18

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 (274) hide show
  1. package/.cursorrules +60 -60
  2. package/.editorconfig +9 -9
  3. package/.env +10 -10
  4. package/.env.development +1 -1
  5. package/.env.production +1 -1
  6. package/.node-version +1 -1
  7. package/.vscode/extensions.json +12 -12
  8. package/.vscode/settings.json +66 -66
  9. package/CLAUDE.md +189 -189
  10. package/README.md +182 -182
  11. package/af-example-mobile-vue-web.iml +9 -9
  12. package/build/vite/index.ts +98 -98
  13. package/build/vite/optimize.ts +34 -34
  14. package/build/vite/vconsole.ts +47 -47
  15. package/commitlint.config.ts +32 -32
  16. package/compress.js +36 -36
  17. package/eslint.config.ts +30 -30
  18. package/index.html +23 -23
  19. package/mock/data.ts +20 -20
  20. package/mock/index.ts +7 -7
  21. package/mock/modules/prose.mock.ts +13 -13
  22. package/mock/modules/user.mock.ts +152 -152
  23. package/mock/util.ts +19 -19
  24. package/netlify.toml +12 -12
  25. package/package.json +114 -114
  26. package/postcss.config.ts +27 -27
  27. package/public/favicon.svg +4 -4
  28. package/public/safari-pinned-tab.svg +4 -4
  29. package/scripts/verifyCommit.js +19 -19
  30. package/src/App.vue +79 -79
  31. package/src/api/mock/index.ts +30 -30
  32. package/src/api/user/index.ts +40 -40
  33. package/src/assets/img/user/login/background-shadow-1.svg +20 -20
  34. package/src/assets/img/user/login/logo-background.svg +20 -20
  35. package/src/bootstrap.ts +26 -26
  36. package/src/components/core/BeautifulLoading/index.vue +52 -52
  37. package/src/components/core/ImageUploader/index.vue +244 -244
  38. package/src/components/core/NavBar/index.vue +53 -53
  39. package/src/components/core/Tabbar/index.vue +32 -32
  40. package/src/components/core/Uploader/index.vue +124 -124
  41. package/src/components/core/XGridDropOption/index.vue +154 -154
  42. package/src/components/core/XMultiSelect/index.vue +183 -183
  43. package/src/components/core/XSelect/index.vue +149 -149
  44. package/src/components/data/CardContainer/CardContainer.vue +118 -118
  45. package/src/components/data/CardContainer/CardHeader.vue +99 -99
  46. package/src/components/data/InfoDisplay/index.vue +132 -132
  47. package/src/components/data/UserDetail/api.ts +24 -24
  48. package/src/components/data/UserDetail/index.vue +620 -620
  49. package/src/components/data/UserDetail/recordEntries.ts +159 -159
  50. package/src/components/data/UserDetail/types.ts +26 -26
  51. package/src/components/data/XBadge/index.vue +82 -82
  52. package/src/components/data/XCellDetail/index.vue +105 -105
  53. package/src/components/data/XCellList/XCellList.md +313 -313
  54. package/src/components/data/XCellList/index.vue +1110 -1075
  55. package/src/components/data/XCellListFilter/QrScanner/index.vue +207 -207
  56. package/src/components/data/XCellListFilter/QrScanner/startScanAnimation.ts +53 -53
  57. package/src/components/data/XCellListFilter/VpnRecognition/index.vue +119 -119
  58. package/src/components/data/XCellListFilter/index.vue +705 -705
  59. package/src/components/data/XForm/index.vue +659 -659
  60. package/src/components/data/XFormGroup/doc/DeviceForm.vue +122 -122
  61. package/src/components/data/XFormGroup/doc/FormGroupDemo.vue +56 -56
  62. package/src/components/data/XFormGroup/doc/README.md +286 -286
  63. package/src/components/data/XFormGroup/doc/UserForm.vue +102 -102
  64. package/src/components/data/XFormGroup/index.vue +240 -240
  65. package/src/components/data/XFormItem/index.vue +1310 -1310
  66. package/src/components/data/XOlMap/README.md +227 -227
  67. package/src/components/data/XOlMap/XLocationPicker/index.vue +226 -226
  68. package/src/components/data/XOlMap/index.vue +1490 -1490
  69. package/src/components/data/XOlMap/types.ts +149 -149
  70. package/src/components/data/XOlMap/utils/wgs84ToGcj02.js +154 -154
  71. package/src/components/data/XReportForm/DateTimeSecondsPicker.vue +208 -208
  72. package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -220
  73. package/src/components/data/XReportForm/index.vue +1393 -1393
  74. package/src/components/data/XReportGrid/XAddReport/XAddReport.vue +198 -198
  75. package/src/components/data/XReportGrid/XAddReport/index.js +3 -3
  76. package/src/components/data/XReportGrid/XAddReport/index.md +53 -53
  77. package/src/components/data/XReportGrid/XAddReport/index.ts +10 -10
  78. package/src/components/data/XReportGrid/XReport.vue +960 -960
  79. package/src/components/data/XReportGrid/XReportDemo.vue +33 -33
  80. package/src/components/data/XReportGrid/XReportDesign.vue +597 -597
  81. package/src/components/data/XReportGrid/XReportDrawer/XReportDrawer.vue +148 -148
  82. package/src/components/data/XReportGrid/XReportDrawer/index.js +3 -3
  83. package/src/components/data/XReportGrid/XReportDrawer/index.ts +10 -10
  84. package/src/components/data/XReportGrid/XReportJsonRender.vue +399 -399
  85. package/src/components/data/XReportGrid/XReportTrGroup.vue +592 -592
  86. package/src/components/data/XReportGrid/index.md +46 -46
  87. package/src/components/data/XReportGrid/print.js +184 -184
  88. package/src/components/data/XSignature/index.vue +284 -284
  89. package/src/components/data/XTag/index.vue +10 -10
  90. package/src/components/layout/NormalDataLayout/index.vue +69 -69
  91. package/src/components/layout/TabBarLayout/index.vue +40 -40
  92. package/src/composables/dark.ts +5 -5
  93. package/src/config/routes.ts +9 -9
  94. package/src/constants/index.ts +2 -2
  95. package/src/enums/requestEnum.ts +25 -25
  96. package/src/expression/ExpressionRunner.ts +28 -28
  97. package/src/expression/TestExpression.ts +510 -510
  98. package/src/expression/core/Delegate.ts +116 -116
  99. package/src/expression/core/Expression.ts +1359 -1359
  100. package/src/expression/core/Program.ts +985 -985
  101. package/src/expression/core/Token.ts +29 -29
  102. package/src/expression/enums/ExpressionType.ts +81 -81
  103. package/src/expression/enums/TokenType.ts +11 -11
  104. package/src/expression/exception/BreakWayException.ts +2 -2
  105. package/src/expression/exception/ContinueWayException.ts +2 -2
  106. package/src/expression/exception/ExpressionException.ts +29 -29
  107. package/src/expression/exception/ReturnWayException.ts +14 -14
  108. package/src/expression/exception/ServiceException.ts +22 -22
  109. package/src/expression/instances/JSONArray.ts +52 -52
  110. package/src/expression/instances/JSONObject.ts +118 -118
  111. package/src/expression/instances/LogicConsole.ts +31 -31
  112. package/src/font-style/font.css +4 -4
  113. package/src/hooks/useBoolean.ts +26 -26
  114. package/src/hooks/useCommon.ts +9 -9
  115. package/src/hooks/useLoading.ts +16 -16
  116. package/src/hooks/useLogin.ts +97 -97
  117. package/src/icons/svg/check-in.svg +32 -32
  118. package/src/icons/svg/dark.svg +4 -4
  119. package/src/icons/svg/github.svg +4 -4
  120. package/src/icons/svg/light.svg +4 -4
  121. package/src/icons/svg/link.svg +4 -4
  122. package/src/icons/svgo.yml +22 -22
  123. package/src/layout/GridView/index.vue +16 -16
  124. package/src/layout/PageLayout.vue +9 -9
  125. package/src/layout/SingleLayout.vue +9 -9
  126. package/src/locales/en-US.json +128 -128
  127. package/src/locales/zh-CN.json +128 -128
  128. package/src/logic/LogicRunner.ts +67 -67
  129. package/src/logic/TestLogic.ts +13 -13
  130. package/src/logic/plugins/common/DateTools.ts +35 -35
  131. package/src/logic/plugins/common/VueTools.ts +30 -30
  132. package/src/logic/plugins/index.ts +7 -7
  133. package/src/main.ts +44 -44
  134. package/src/plugins/AppData.ts +38 -38
  135. package/src/plugins/GetLoginInfoService.ts +10 -10
  136. package/src/plugins/collectIcons.ts +10 -10
  137. package/src/plugins/index.ts +11 -11
  138. package/src/router/README.md +8 -8
  139. package/src/router/guards.ts +59 -59
  140. package/src/router/index.ts +35 -35
  141. package/src/router/invoiceRoutes.ts +33 -33
  142. package/src/router/routes.ts +353 -341
  143. package/src/router/types.ts +7 -7
  144. package/src/services/api/Login.ts +6 -6
  145. package/src/services/api/common.ts +109 -109
  146. package/src/services/api/index.ts +7 -7
  147. package/src/services/api/manage.ts +8 -8
  148. package/src/services/api/search.ts +16 -16
  149. package/src/services/api/user.ts +17 -17
  150. package/src/services/restTools.ts +56 -56
  151. package/src/services/v3Api.ts +147 -147
  152. package/src/stores/index.ts +11 -11
  153. package/src/stores/modules/counter.ts +19 -19
  154. package/src/stores/modules/routeCache.ts +23 -23
  155. package/src/stores/modules/setting.ts +77 -76
  156. package/src/stores/modules/user.ts +235 -235
  157. package/src/stores/mutation-type.ts +7 -7
  158. package/src/styles/app.less +36 -36
  159. package/src/styles/login.less +109 -109
  160. package/src/styles/var.less +25 -16
  161. package/src/types/env.d.ts +16 -16
  162. package/src/types/settings.ts +1 -1
  163. package/src/types/vue-router.d.ts +9 -9
  164. package/src/utils/Storage.ts +124 -124
  165. package/src/utils/authority-utils.ts +84 -84
  166. package/src/utils/common.ts +41 -41
  167. package/src/utils/crypto.ts +39 -39
  168. package/src/utils/dataUtil.ts +42 -42
  169. package/src/utils/dictUtil.ts +52 -52
  170. package/src/utils/http/index.ts +199 -199
  171. package/src/utils/i18n.ts +72 -72
  172. package/src/utils/indexedDB.ts +195 -195
  173. package/src/utils/inline-px-to-vw.ts +28 -28
  174. package/src/utils/mobileUtil.ts +34 -34
  175. package/src/utils/progress.ts +19 -19
  176. package/src/utils/routerUtil.ts +271 -271
  177. package/src/utils/runEvalFunction.ts +13 -13
  178. package/src/utils/secureStorage.ts +71 -71
  179. package/src/utils/set-page-title.ts +5 -5
  180. package/src/utils/validate.ts +6 -6
  181. package/src/utils/wechatUtil.ts +9 -9
  182. package/src/views/chat/index.vue +153 -153
  183. package/src/views/common/LoadError.vue +63 -63
  184. package/src/views/common/NotFound.vue +67 -67
  185. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  186. package/src/views/component/IconifyView/index.vue +504 -504
  187. package/src/views/component/UserDetailView/UserDetailPage.vue +77 -77
  188. package/src/views/component/UserDetailView/index.vue +234 -234
  189. package/src/views/component/XCellDetailView/index.vue +217 -217
  190. package/src/views/component/XCellListView/index.vue +157 -108
  191. package/src/views/component/XFormAppraiseView/index.vue +174 -174
  192. package/src/views/component/XFormGroupView/index.vue +82 -78
  193. package/src/views/component/XFormGroupView/xformgroup222.vue +97 -0
  194. package/src/views/component/XFormView/index.vue +27 -27
  195. package/src/views/component/XOlMapView/XLocationPicker/index.vue +118 -118
  196. package/src/views/component/XOlMapView/index.vue +434 -434
  197. package/src/views/component/XOlMapView/testData.ts +64 -64
  198. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  199. package/src/views/component/XReportFormView/index.vue +13 -13
  200. package/src/views/component/XReportGridView/index.vue +17 -17
  201. package/src/views/component/XRequestView/index.vue +234 -234
  202. package/src/views/component/XSignatureView/index.vue +50 -50
  203. package/src/views/component/index.vue +181 -181
  204. package/src/views/component/menu.vue +117 -117
  205. package/src/views/component/notice.vue +46 -46
  206. package/src/views/component/topNav.vue +36 -36
  207. package/src/views/invoiceShow/index.vue +61 -61
  208. package/src/views/user/login/ForgetPasswordForm.vue +94 -94
  209. package/src/views/user/login/LoginForm.vue +346 -346
  210. package/src/views/user/login/LoginTitle.vue +76 -76
  211. package/src/views/user/login/LoginWave.vue +109 -109
  212. package/src/views/user/login/index.vue +22 -22
  213. package/src/views/user/my/comm/ModifyPassword.vue +346 -346
  214. package/src/views/user/my/index.vue +340 -340
  215. package/src/views/user/register/index.vue +910 -0
  216. package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -21
  217. package/src/views/userRecords/CardReplacementRecords.vue +21 -21
  218. package/src/views/userRecords/ChangeRecords.vue +19 -19
  219. package/src/views/userRecords/CommandViewRecords.vue +20 -20
  220. package/src/views/userRecords/GasCompensationRecords.vue +20 -20
  221. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
  222. package/src/views/userRecords/MeterRecords.vue +20 -20
  223. package/src/views/userRecords/OperateRecords.vue +51 -51
  224. package/src/views/userRecords/OtherChargeRecords.vue +19 -19
  225. package/src/views/userRecords/PaymentRecords.vue +28 -28
  226. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
  227. package/src/views/userRecords/ReplacementRecords.vue +19 -19
  228. package/src/views/userRecords/SafetyRecords.vue +19 -19
  229. package/src/views/userRecords/TransactionRecords.vue +21 -21
  230. package/src/views/userRecords/TransferRecords.vue +19 -19
  231. package/src/views/userRecords/operateRecordDetail/index.vue +316 -316
  232. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -124
  233. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -88
  234. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -205
  235. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -192
  236. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -192
  237. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -192
  238. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -153
  239. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -101
  240. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -127
  241. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -153
  242. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -153
  243. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -166
  244. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -205
  245. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -127
  246. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -114
  247. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -124
  248. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -153
  249. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -126
  250. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -126
  251. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -114
  252. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -127
  253. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -88
  254. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -101
  255. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -218
  256. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -153
  257. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -140
  258. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -127
  259. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -114
  260. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -127
  261. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -127
  262. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -114
  263. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -127
  264. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -114
  265. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -140
  266. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -152
  267. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -178
  268. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -123
  269. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -192
  270. package/src/views/userRecords/types.ts +66 -66
  271. package/tsconfig.json +39 -39
  272. package/uno.config.ts +82 -82
  273. package/vite.config.ts +118 -118
  274. package/.claude/settings.local.json +0 -8
@@ -1,504 +1,504 @@
1
- <script setup lang="ts">
2
- import { Icon } from '@iconify/vue'
3
- import {
4
- Cell as VanCell,
5
- CellGroup as VanCellGroup,
6
- Divider as VanDivider,
7
- Grid as VanGrid,
8
- GridItem as VanGridItem,
9
- NavBar as VanNavBar,
10
- Tab as VanTab,
11
- Tabs as VanTabs,
12
- } from 'vant'
13
- import { computed, ref } from 'vue'
14
- import { useRouter } from 'vue-router'
15
-
16
- const router = useRouter()
17
- const searchKeyword = ref('')
18
- const activeTab = ref(0)
19
-
20
- // 图标分类展示
21
- const iconCategories = [
22
- {
23
- title: '常用图标',
24
- icons: [
25
- { name: 'mdi:home', label: '首页' },
26
- { name: 'mdi:account', label: '用户' },
27
- { name: 'mdi:bell', label: '通知' },
28
- { name: 'mdi:cog', label: '设置' },
29
- { name: 'mdi:magnify', label: '搜索' },
30
- { name: 'mdi:plus', label: '添加' },
31
- { name: 'mdi:check', label: '确认' },
32
- { name: 'mdi:close', label: '关闭' },
33
- ],
34
- },
35
- {
36
- title: '方向图标',
37
- icons: [
38
- { name: 'mdi:arrow-up', label: '向上' },
39
- { name: 'mdi:arrow-right', label: '向右' },
40
- { name: 'mdi:arrow-down', label: '向下' },
41
- { name: 'mdi:arrow-left', label: '向左' },
42
- { name: 'mdi:chevron-up', label: '上箭头' },
43
- { name: 'mdi:chevron-right', label: '右箭头' },
44
- { name: 'mdi:chevron-down', label: '下箭头' },
45
- { name: 'mdi:chevron-left', label: '左箭头' },
46
- ],
47
- },
48
- {
49
- title: '文件图标',
50
- icons: [
51
- { name: 'mdi:file', label: '文件' },
52
- { name: 'mdi:file-document', label: '文档' },
53
- { name: 'mdi:file-excel', label: 'Excel' },
54
- { name: 'mdi:file-pdf', label: 'PDF' },
55
- { name: 'mdi:file-image', label: '图片' },
56
- { name: 'mdi:file-video', label: '视频' },
57
- { name: 'mdi:file-music', label: '音频' },
58
- { name: 'mdi:folder', label: '文件夹' },
59
- ],
60
- },
61
- {
62
- title: '通信图标',
63
- icons: [
64
- { name: 'mdi:email', label: '邮件' },
65
- { name: 'mdi:phone', label: '电话' },
66
- { name: 'mdi:message', label: '消息' },
67
- { name: 'mdi:chat', label: '聊天' },
68
- { name: 'mdi:wifi', label: 'WiFi' },
69
- { name: 'mdi:bluetooth', label: '蓝牙' },
70
- { name: 'mdi:share', label: '分享' },
71
- { name: 'mdi:cloud', label: '云' },
72
- ],
73
- },
74
- ]
75
-
76
- // UnoCSS图标示例
77
- const unocssIcons = [
78
- { name: 'i-mdi:home', label: '首页' },
79
- { name: 'i-mdi:account', label: '用户' },
80
- { name: 'i-mdi:bell', label: '通知' },
81
- { name: 'i-mdi:cog', label: '设置' },
82
- { name: 'i-mdi:magnify', label: '搜索' },
83
- { name: 'i-mdi:plus', label: '添加' },
84
- { name: 'i-mdi:check', label: '确认' },
85
- { name: 'i-mdi:close', label: '关闭' },
86
- { name: 'i-mdi:arrow-up', label: '向上' },
87
- { name: 'i-mdi:arrow-right', label: '向右' },
88
- { name: 'i-mdi:arrow-down', label: '向下' },
89
- { name: 'i-mdi:arrow-left', label: '向左' },
90
- ]
91
-
92
- // 样式设置示例
93
- const styleExamples = [
94
- { name: 'mdi:home', label: '默认样式', style: {} },
95
- { name: 'mdi:home', label: '大尺寸', style: { fontSize: '32px' } },
96
- { name: 'mdi:home', label: '自定义颜色', style: { color: '#1989fa' } },
97
- { name: 'mdi:home', label: '旋转效果', style: { transform: 'rotate(45deg)' } },
98
- { name: 'mdi:home', label: '背景填充', style: { backgroundColor: '#eee', padding: '5px', borderRadius: '4px' } },
99
- { name: 'mdi:home', label: '悬停效果', class: 'hover-effect', style: {} },
100
- ]
101
-
102
- // UnoCSS样式设例
103
- const unocssStyleExamples = [
104
- { name: 'i-mdi:home', label: '默认样式', classes: '' },
105
- { name: 'i-mdi:home', label: '大尺寸 (text-3xl)', classes: 'text-3xl' },
106
- { name: 'i-mdi:home', label: '自定义颜色 (text-blue-500)', classes: 'text-blue-500' },
107
- { name: 'i-mdi:home', label: '旋转效果 (transform rotate-45)', classes: 'transform rotate-45' },
108
- { name: 'i-mdi:home', label: '背景填充 (bg-gray-200 p-1 rounded)', classes: 'bg-gray-200 p-1 rounded' },
109
- { name: 'i-mdi:home', label: '悬停效果 (hover:scale-125)', classes: 'transition hover:scale-125' },
110
- ]
111
-
112
- // 使用方法示例代码
113
- const usageExamples = [
114
- {
115
- title: '基本使用',
116
- code: '<Icon icon="mdi:home" />',
117
- },
118
- {
119
- title: '设置尺寸',
120
- code: '<Icon icon="mdi:home" :width="24" :height="24" />',
121
- },
122
- {
123
- title: '自定义样式',
124
- code: '<Icon icon="mdi:home" style="color: red; font-size: 24px;" />',
125
- },
126
- {
127
- title: '内联样式',
128
- code: '<Icon icon="mdi:home" :style="{ color: \'#1989fa\', fontSize: \'24px\' }" />',
129
- },
130
- {
131
- title: '自定义类名',
132
- code: '<Icon icon="mdi:home" class="custom-icon" />',
133
- },
134
- ]
135
-
136
- // UnoCSS使用方法示例代码
137
- const unocssUsageExamples = [
138
- {
139
- title: '基本使用',
140
- code: '<div class="i-mdi:home"></div>',
141
- },
142
- {
143
- title: '设置尺寸',
144
- code: '<div class="i-mdi:home text-2xl"></div>',
145
- },
146
- {
147
- title: '自定义颜色',
148
- code: '<div class="i-mdi:home text-red-500"></div>',
149
- },
150
- {
151
- title: '添加多个样式',
152
- code: '<div class="i-mdi:home p-1 bg-gray-100 rounded text-blue-500"></div>',
153
- },
154
- {
155
- title: '交互效果',
156
- code: '<div class="i-mdi:home transition hover:text-green-500 hover:scale-125"></div>',
157
- },
158
- ]
159
-
160
- // 过滤显示的图标
161
- const filteredCategories = computed(() => {
162
- if (!searchKeyword.value) {
163
- return iconCategories
164
- }
165
-
166
- return iconCategories.map((category) => {
167
- const filteredIcons = category.icons.filter(icon =>
168
- icon.name.toLowerCase().includes(searchKeyword.value.toLowerCase())
169
- || icon.label.toLowerCase().includes(searchKeyword.value.toLowerCase()),
170
- )
171
-
172
- return {
173
- ...category,
174
- icons: filteredIcons,
175
- }
176
- }).filter(category => category.icons.length > 0)
177
- })
178
-
179
- // 过滤UnoCSS图标
180
- const filteredUnocssIcons = computed(() => {
181
- if (!searchKeyword.value) {
182
- return unocssIcons
183
- }
184
-
185
- return unocssIcons.filter(icon =>
186
- icon.name.toLowerCase().includes(searchKeyword.value.toLowerCase())
187
- || icon.label.toLowerCase().includes(searchKeyword.value.toLowerCase()),
188
- )
189
- })
190
- </script>
191
-
192
- <template>
193
- <div class="iconify-view">
194
- <VanNavBar
195
- title="Iconify 图标使用示例"
196
- left-arrow
197
- @click-left="router.back()"
198
- />
199
-
200
- <div class="container">
201
- <section class="intro-section">
202
- <h2>Iconify 图标使用</h2>
203
- <p>
204
- Iconify 是一个开源的图标框架,提供超过 100,000 个开源图标。在本项目中有两种使用方式:
205
- </p>
206
- </section>
207
-
208
- <VanTabs v-model:active="activeTab" animated>
209
- <VanTab title="@iconify/vue 组件">
210
- <section class="intro-section">
211
- <p>
212
- 使用 @iconify/vue 提供的 Icon 组件可以直接在模板中渲染图标。
213
- </p>
214
- </section>
215
-
216
- <section class="icons-section">
217
- <div v-for="(category, index) in filteredCategories" :key="index" class="icon-category">
218
- <h3>{{ category.title }}</h3>
219
- <VanGrid :column-num="4" :border="false">
220
- <VanGridItem v-for="(icon, iconIndex) in category.icons" :key="iconIndex">
221
- <div class="icon-item">
222
- <Icon :icon="icon.name" width="28" height="28" />
223
- <div class="icon-label">
224
- {{ icon.label }}
225
- </div>
226
- <div class="icon-name">
227
- {{ icon.name }}
228
- </div>
229
- </div>
230
- </VanGridItem>
231
- </VanGrid>
232
- </div>
233
- </section>
234
-
235
- <VanDivider />
236
-
237
- <section class="style-section">
238
- <h3>样式自定义示例</h3>
239
- <VanGrid :column-num="3" :border="false">
240
- <VanGridItem v-for="(example, index) in styleExamples" :key="index">
241
- <div class="style-example">
242
- <Icon
243
- :icon="example.name"
244
- width="28"
245
- height="28"
246
- :style="example.style"
247
- :class="example.class"
248
- />
249
- <div class="style-label">
250
- {{ example.label }}
251
- </div>
252
- </div>
253
- </VanGridItem>
254
- </VanGrid>
255
- </section>
256
-
257
- <VanDivider />
258
-
259
- <section class="usage-section">
260
- <h3>使用方法</h3>
261
- <VanCellGroup inset>
262
- <VanCell v-for="(example, index) in usageExamples" :key="index" :title="example.title">
263
- <template #value>
264
- <code class="code-example">{{ example.code }}</code>
265
- </template>
266
- </VanCell>
267
- </VanCellGroup>
268
- </section>
269
-
270
- <section class="usage-guide">
271
- <h3>使用指南</h3>
272
- <div class="guide-content">
273
- <h4>1. 安装</h4>
274
- <code class="code-block">npm install @iconify/vue</code>
275
-
276
- <h4>2. 导入</h4>
277
- <code class="code-block">import { Icon } from '@iconify/vue'</code>
278
-
279
- <h4>3. 在模板中使用</h4>
280
- <code class="code-block">&lt;Icon icon="mdi:home" /&gt;</code>
281
- </div>
282
- </section>
283
- </VanTab>
284
-
285
- <VanTab title="UnoCSS 图标类">
286
- <section class="intro-section">
287
- <p>
288
- 使用 UnoCSS 的图标预设,可以通过类名直接使用图标,无需导入组件。
289
- </p>
290
- </section>
291
-
292
- <VanDivider />
293
-
294
- <section class="style-section">
295
- <h3>样式自定义示例</h3>
296
- <VanGrid :column-num="3" :border="false">
297
- <VanGridItem v-for="(example, index) in unocssStyleExamples" :key="index">
298
- <div class="style-example">
299
- <div :class="`${example.name} ${example.classes}`" />
300
- <div class="style-label">
301
- {{ example.label }}
302
- </div>
303
- </div>
304
- </VanGridItem>
305
- </VanGrid>
306
- </section>
307
-
308
- <VanDivider />
309
-
310
- <section class="usage-section">
311
- <h3>使用方法</h3>
312
- <VanCellGroup inset>
313
- <VanCell v-for="(example, index) in unocssUsageExamples" :key="index" :title="example.title">
314
- <template #value>
315
- <code class="code-example">{{ example.code }}</code>
316
- </template>
317
- </VanCell>
318
- </VanCellGroup>
319
- </section>
320
-
321
- <section class="usage-guide">
322
- <h3>使用指南</h3>
323
- <div class="guide-content">
324
- <h4>项目配置</h4>
325
- <p>本项目已通过 Vite 配置了 UnoCSS 的图标预设:</p>
326
- <code class="code-block">
327
- {{ `
328
- // build/vite/index.ts
329
- UnoCSS({
330
- presets: [
331
- presetIcons({
332
- scale: 1.2,
333
- warn: true,
334
- extraProperties: {
335
- 'display': 'inline-block',
336
- 'vertical-align': 'middle',
337
- // ...
338
- },
339
- }),
340
- ],
341
- }),
342
- ` }}
343
- </code>
344
-
345
- <h4>使用方式</h4>
346
- <p>直接在 HTML 元素上使用图标类名,格式为:<code>i-{collection}:{name}</code></p>
347
- <code class="code-block">&lt;div class="i-mdi:home"&gt;&lt;/div&gt;</code>
348
-
349
- <h4>结合其他 UnoCSS 类</h4>
350
- <p>可以结合 UnoCSS 的其他工具类设置图标样式:</p>
351
- <code class="code-block">&lt;div class="i-mdi:home text-blue-500 text-2xl"&gt;&lt;/div&gt;</code>
352
- </div>
353
- </section>
354
- </VanTab>
355
- </VanTabs>
356
-
357
- <VanDivider />
358
-
359
- <section class="usage-guide">
360
- <h3>图标集</h3>
361
- <div class="guide-content">
362
- <p>Iconify 支持多个图标集,格式为 "集合名:图标名"。例如:</p>
363
- <ul>
364
- <li>mdi:home - Material Design Icons</li>
365
- <li>fa:user - Font Awesome</li>
366
- <li>carbon:settings - Carbon</li>
367
- <li>更多图标集可访问 <a href="https://icon-sets.iconify.design/" target="_blank">Iconify Icon Sets</a></li>
368
- </ul>
369
- </div>
370
- </section>
371
- </div>
372
- </div>
373
- </template>
374
-
375
- <style scoped lang="less">
376
- .iconify-view {
377
- background-color: #f7f8fa;
378
- min-height: 100vh;
379
-
380
- .container {
381
- padding: var(--base-interval-2);
382
- }
383
-
384
- .intro-section,
385
- .icons-section,
386
- .style-section,
387
- .usage-section,
388
- .usage-guide {
389
- margin-bottom: 20px;
390
- }
391
-
392
- h2 {
393
- font-size: 20px;
394
- margin-bottom: 12px;
395
- color: #323233;
396
- }
397
-
398
- h3 {
399
- font-size: 16px;
400
- margin-bottom: 12px;
401
- color: #323233;
402
- padding-left: 12px;
403
- }
404
-
405
- h4 {
406
- font-size: 14px;
407
- margin: 12px 0 8px;
408
- color: #323233;
409
- }
410
-
411
- p {
412
- font-size: 14px;
413
- color: #646566;
414
- line-height: 1.5;
415
- }
416
-
417
- .icon-category {
418
- margin-bottom: 16px;
419
- }
420
-
421
- .icon-item {
422
- display: flex;
423
- flex-direction: column;
424
- align-items: center;
425
- padding: 12px 0;
426
- }
427
-
428
- .icon-label {
429
- margin-top: 8px;
430
- font-size: 12px;
431
- color: #323233;
432
- }
433
-
434
- .icon-name {
435
- margin-top: 4px;
436
- font-size: 10px;
437
- color: #969799;
438
- overflow: hidden;
439
- text-overflow: ellipsis;
440
- white-space: nowrap;
441
- max-width: 90%;
442
- }
443
-
444
- .style-example {
445
- display: flex;
446
- flex-direction: column;
447
- align-items: center;
448
- padding: 12px 0;
449
- }
450
-
451
- .style-label {
452
- margin-top: 8px;
453
- font-size: 12px;
454
- color: #323233;
455
- }
456
-
457
- .code-example {
458
- font-size: 12px;
459
- color: #333;
460
- background-color: #f5f5f5;
461
- padding: 2px 4px;
462
- border-radius: 2px;
463
- overflow-wrap: break-word;
464
- word-break: break-all;
465
- }
466
-
467
- .code-block {
468
- display: block;
469
- font-size: 12px;
470
- color: #333;
471
- background-color: #f5f5f5;
472
- padding: 8px 12px;
473
- border-radius: 4px;
474
- margin: 8px 0;
475
- overflow-x: auto;
476
- }
477
-
478
- .guide-content {
479
- background-color: white;
480
- padding: 16px;
481
- border-radius: 8px;
482
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
483
- }
484
-
485
- .guide-content ul {
486
- padding-left: 16px;
487
- margin: 8px 0;
488
- }
489
-
490
- .guide-content li {
491
- font-size: 13px;
492
- color: #646566;
493
- line-height: 1.6;
494
- }
495
-
496
- .hover-effect {
497
- transition: transform 0.3s ease;
498
-
499
- &:hover {
500
- transform: scale(1.2);
501
- }
502
- }
503
- }
504
- </style>
1
+ <script setup lang="ts">
2
+ import { Icon } from '@iconify/vue'
3
+ import {
4
+ Cell as VanCell,
5
+ CellGroup as VanCellGroup,
6
+ Divider as VanDivider,
7
+ Grid as VanGrid,
8
+ GridItem as VanGridItem,
9
+ NavBar as VanNavBar,
10
+ Tab as VanTab,
11
+ Tabs as VanTabs,
12
+ } from 'vant'
13
+ import { computed, ref } from 'vue'
14
+ import { useRouter } from 'vue-router'
15
+
16
+ const router = useRouter()
17
+ const searchKeyword = ref('')
18
+ const activeTab = ref(0)
19
+
20
+ // 图标分类展示
21
+ const iconCategories = [
22
+ {
23
+ title: '常用图标',
24
+ icons: [
25
+ { name: 'mdi:home', label: '首页' },
26
+ { name: 'mdi:account', label: '用户' },
27
+ { name: 'mdi:bell', label: '通知' },
28
+ { name: 'mdi:cog', label: '设置' },
29
+ { name: 'mdi:magnify', label: '搜索' },
30
+ { name: 'mdi:plus', label: '添加' },
31
+ { name: 'mdi:check', label: '确认' },
32
+ { name: 'mdi:close', label: '关闭' },
33
+ ],
34
+ },
35
+ {
36
+ title: '方向图标',
37
+ icons: [
38
+ { name: 'mdi:arrow-up', label: '向上' },
39
+ { name: 'mdi:arrow-right', label: '向右' },
40
+ { name: 'mdi:arrow-down', label: '向下' },
41
+ { name: 'mdi:arrow-left', label: '向左' },
42
+ { name: 'mdi:chevron-up', label: '上箭头' },
43
+ { name: 'mdi:chevron-right', label: '右箭头' },
44
+ { name: 'mdi:chevron-down', label: '下箭头' },
45
+ { name: 'mdi:chevron-left', label: '左箭头' },
46
+ ],
47
+ },
48
+ {
49
+ title: '文件图标',
50
+ icons: [
51
+ { name: 'mdi:file', label: '文件' },
52
+ { name: 'mdi:file-document', label: '文档' },
53
+ { name: 'mdi:file-excel', label: 'Excel' },
54
+ { name: 'mdi:file-pdf', label: 'PDF' },
55
+ { name: 'mdi:file-image', label: '图片' },
56
+ { name: 'mdi:file-video', label: '视频' },
57
+ { name: 'mdi:file-music', label: '音频' },
58
+ { name: 'mdi:folder', label: '文件夹' },
59
+ ],
60
+ },
61
+ {
62
+ title: '通信图标',
63
+ icons: [
64
+ { name: 'mdi:email', label: '邮件' },
65
+ { name: 'mdi:phone', label: '电话' },
66
+ { name: 'mdi:message', label: '消息' },
67
+ { name: 'mdi:chat', label: '聊天' },
68
+ { name: 'mdi:wifi', label: 'WiFi' },
69
+ { name: 'mdi:bluetooth', label: '蓝牙' },
70
+ { name: 'mdi:share', label: '分享' },
71
+ { name: 'mdi:cloud', label: '云' },
72
+ ],
73
+ },
74
+ ]
75
+
76
+ // UnoCSS图标示例
77
+ const unocssIcons = [
78
+ { name: 'i-mdi:home', label: '首页' },
79
+ { name: 'i-mdi:account', label: '用户' },
80
+ { name: 'i-mdi:bell', label: '通知' },
81
+ { name: 'i-mdi:cog', label: '设置' },
82
+ { name: 'i-mdi:magnify', label: '搜索' },
83
+ { name: 'i-mdi:plus', label: '添加' },
84
+ { name: 'i-mdi:check', label: '确认' },
85
+ { name: 'i-mdi:close', label: '关闭' },
86
+ { name: 'i-mdi:arrow-up', label: '向上' },
87
+ { name: 'i-mdi:arrow-right', label: '向右' },
88
+ { name: 'i-mdi:arrow-down', label: '向下' },
89
+ { name: 'i-mdi:arrow-left', label: '向左' },
90
+ ]
91
+
92
+ // 样式设置示例
93
+ const styleExamples = [
94
+ { name: 'mdi:home', label: '默认样式', style: {} },
95
+ { name: 'mdi:home', label: '大尺寸', style: { fontSize: '32px' } },
96
+ { name: 'mdi:home', label: '自定义颜色', style: { color: '#1989fa' } },
97
+ { name: 'mdi:home', label: '旋转效果', style: { transform: 'rotate(45deg)' } },
98
+ { name: 'mdi:home', label: '背景填充', style: { backgroundColor: '#eee', padding: '5px', borderRadius: '4px' } },
99
+ { name: 'mdi:home', label: '悬停效果', class: 'hover-effect', style: {} },
100
+ ]
101
+
102
+ // UnoCSS样式设例
103
+ const unocssStyleExamples = [
104
+ { name: 'i-mdi:home', label: '默认样式', classes: '' },
105
+ { name: 'i-mdi:home', label: '大尺寸 (text-3xl)', classes: 'text-3xl' },
106
+ { name: 'i-mdi:home', label: '自定义颜色 (text-blue-500)', classes: 'text-blue-500' },
107
+ { name: 'i-mdi:home', label: '旋转效果 (transform rotate-45)', classes: 'transform rotate-45' },
108
+ { name: 'i-mdi:home', label: '背景填充 (bg-gray-200 p-1 rounded)', classes: 'bg-gray-200 p-1 rounded' },
109
+ { name: 'i-mdi:home', label: '悬停效果 (hover:scale-125)', classes: 'transition hover:scale-125' },
110
+ ]
111
+
112
+ // 使用方法示例代码
113
+ const usageExamples = [
114
+ {
115
+ title: '基本使用',
116
+ code: '<Icon icon="mdi:home" />',
117
+ },
118
+ {
119
+ title: '设置尺寸',
120
+ code: '<Icon icon="mdi:home" :width="24" :height="24" />',
121
+ },
122
+ {
123
+ title: '自定义样式',
124
+ code: '<Icon icon="mdi:home" style="color: red; font-size: 24px;" />',
125
+ },
126
+ {
127
+ title: '内联样式',
128
+ code: '<Icon icon="mdi:home" :style="{ color: \'#1989fa\', fontSize: \'24px\' }" />',
129
+ },
130
+ {
131
+ title: '自定义类名',
132
+ code: '<Icon icon="mdi:home" class="custom-icon" />',
133
+ },
134
+ ]
135
+
136
+ // UnoCSS使用方法示例代码
137
+ const unocssUsageExamples = [
138
+ {
139
+ title: '基本使用',
140
+ code: '<div class="i-mdi:home"></div>',
141
+ },
142
+ {
143
+ title: '设置尺寸',
144
+ code: '<div class="i-mdi:home text-2xl"></div>',
145
+ },
146
+ {
147
+ title: '自定义颜色',
148
+ code: '<div class="i-mdi:home text-red-500"></div>',
149
+ },
150
+ {
151
+ title: '添加多个样式',
152
+ code: '<div class="i-mdi:home p-1 bg-gray-100 rounded text-blue-500"></div>',
153
+ },
154
+ {
155
+ title: '交互效果',
156
+ code: '<div class="i-mdi:home transition hover:text-green-500 hover:scale-125"></div>',
157
+ },
158
+ ]
159
+
160
+ // 过滤显示的图标
161
+ const filteredCategories = computed(() => {
162
+ if (!searchKeyword.value) {
163
+ return iconCategories
164
+ }
165
+
166
+ return iconCategories.map((category) => {
167
+ const filteredIcons = category.icons.filter(icon =>
168
+ icon.name.toLowerCase().includes(searchKeyword.value.toLowerCase())
169
+ || icon.label.toLowerCase().includes(searchKeyword.value.toLowerCase()),
170
+ )
171
+
172
+ return {
173
+ ...category,
174
+ icons: filteredIcons,
175
+ }
176
+ }).filter(category => category.icons.length > 0)
177
+ })
178
+
179
+ // 过滤UnoCSS图标
180
+ const filteredUnocssIcons = computed(() => {
181
+ if (!searchKeyword.value) {
182
+ return unocssIcons
183
+ }
184
+
185
+ return unocssIcons.filter(icon =>
186
+ icon.name.toLowerCase().includes(searchKeyword.value.toLowerCase())
187
+ || icon.label.toLowerCase().includes(searchKeyword.value.toLowerCase()),
188
+ )
189
+ })
190
+ </script>
191
+
192
+ <template>
193
+ <div class="iconify-view">
194
+ <VanNavBar
195
+ title="Iconify 图标使用示例"
196
+ left-arrow
197
+ @click-left="router.back()"
198
+ />
199
+
200
+ <div class="container">
201
+ <section class="intro-section">
202
+ <h2>Iconify 图标使用</h2>
203
+ <p>
204
+ Iconify 是一个开源的图标框架,提供超过 100,000 个开源图标。在本项目中有两种使用方式:
205
+ </p>
206
+ </section>
207
+
208
+ <VanTabs v-model:active="activeTab" animated>
209
+ <VanTab title="@iconify/vue 组件">
210
+ <section class="intro-section">
211
+ <p>
212
+ 使用 @iconify/vue 提供的 Icon 组件可以直接在模板中渲染图标。
213
+ </p>
214
+ </section>
215
+
216
+ <section class="icons-section">
217
+ <div v-for="(category, index) in filteredCategories" :key="index" class="icon-category">
218
+ <h3>{{ category.title }}</h3>
219
+ <VanGrid :column-num="4" :border="false">
220
+ <VanGridItem v-for="(icon, iconIndex) in category.icons" :key="iconIndex">
221
+ <div class="icon-item">
222
+ <Icon :icon="icon.name" width="28" height="28" />
223
+ <div class="icon-label">
224
+ {{ icon.label }}
225
+ </div>
226
+ <div class="icon-name">
227
+ {{ icon.name }}
228
+ </div>
229
+ </div>
230
+ </VanGridItem>
231
+ </VanGrid>
232
+ </div>
233
+ </section>
234
+
235
+ <VanDivider />
236
+
237
+ <section class="style-section">
238
+ <h3>样式自定义示例</h3>
239
+ <VanGrid :column-num="3" :border="false">
240
+ <VanGridItem v-for="(example, index) in styleExamples" :key="index">
241
+ <div class="style-example">
242
+ <Icon
243
+ :icon="example.name"
244
+ width="28"
245
+ height="28"
246
+ :style="example.style"
247
+ :class="example.class"
248
+ />
249
+ <div class="style-label">
250
+ {{ example.label }}
251
+ </div>
252
+ </div>
253
+ </VanGridItem>
254
+ </VanGrid>
255
+ </section>
256
+
257
+ <VanDivider />
258
+
259
+ <section class="usage-section">
260
+ <h3>使用方法</h3>
261
+ <VanCellGroup inset>
262
+ <VanCell v-for="(example, index) in usageExamples" :key="index" :title="example.title">
263
+ <template #value>
264
+ <code class="code-example">{{ example.code }}</code>
265
+ </template>
266
+ </VanCell>
267
+ </VanCellGroup>
268
+ </section>
269
+
270
+ <section class="usage-guide">
271
+ <h3>使用指南</h3>
272
+ <div class="guide-content">
273
+ <h4>1. 安装</h4>
274
+ <code class="code-block">npm install @iconify/vue</code>
275
+
276
+ <h4>2. 导入</h4>
277
+ <code class="code-block">import { Icon } from '@iconify/vue'</code>
278
+
279
+ <h4>3. 在模板中使用</h4>
280
+ <code class="code-block">&lt;Icon icon="mdi:home" /&gt;</code>
281
+ </div>
282
+ </section>
283
+ </VanTab>
284
+
285
+ <VanTab title="UnoCSS 图标类">
286
+ <section class="intro-section">
287
+ <p>
288
+ 使用 UnoCSS 的图标预设,可以通过类名直接使用图标,无需导入组件。
289
+ </p>
290
+ </section>
291
+
292
+ <VanDivider />
293
+
294
+ <section class="style-section">
295
+ <h3>样式自定义示例</h3>
296
+ <VanGrid :column-num="3" :border="false">
297
+ <VanGridItem v-for="(example, index) in unocssStyleExamples" :key="index">
298
+ <div class="style-example">
299
+ <div :class="`${example.name} ${example.classes}`" />
300
+ <div class="style-label">
301
+ {{ example.label }}
302
+ </div>
303
+ </div>
304
+ </VanGridItem>
305
+ </VanGrid>
306
+ </section>
307
+
308
+ <VanDivider />
309
+
310
+ <section class="usage-section">
311
+ <h3>使用方法</h3>
312
+ <VanCellGroup inset>
313
+ <VanCell v-for="(example, index) in unocssUsageExamples" :key="index" :title="example.title">
314
+ <template #value>
315
+ <code class="code-example">{{ example.code }}</code>
316
+ </template>
317
+ </VanCell>
318
+ </VanCellGroup>
319
+ </section>
320
+
321
+ <section class="usage-guide">
322
+ <h3>使用指南</h3>
323
+ <div class="guide-content">
324
+ <h4>项目配置</h4>
325
+ <p>本项目已通过 Vite 配置了 UnoCSS 的图标预设:</p>
326
+ <code class="code-block">
327
+ {{ `
328
+ // build/vite/index.ts
329
+ UnoCSS({
330
+ presets: [
331
+ presetIcons({
332
+ scale: 1.2,
333
+ warn: true,
334
+ extraProperties: {
335
+ 'display': 'inline-block',
336
+ 'vertical-align': 'middle',
337
+ // ...
338
+ },
339
+ }),
340
+ ],
341
+ }),
342
+ ` }}
343
+ </code>
344
+
345
+ <h4>使用方式</h4>
346
+ <p>直接在 HTML 元素上使用图标类名,格式为:<code>i-{collection}:{name}</code></p>
347
+ <code class="code-block">&lt;div class="i-mdi:home"&gt;&lt;/div&gt;</code>
348
+
349
+ <h4>结合其他 UnoCSS 类</h4>
350
+ <p>可以结合 UnoCSS 的其他工具类设置图标样式:</p>
351
+ <code class="code-block">&lt;div class="i-mdi:home text-blue-500 text-2xl"&gt;&lt;/div&gt;</code>
352
+ </div>
353
+ </section>
354
+ </VanTab>
355
+ </VanTabs>
356
+
357
+ <VanDivider />
358
+
359
+ <section class="usage-guide">
360
+ <h3>图标集</h3>
361
+ <div class="guide-content">
362
+ <p>Iconify 支持多个图标集,格式为 "集合名:图标名"。例如:</p>
363
+ <ul>
364
+ <li>mdi:home - Material Design Icons</li>
365
+ <li>fa:user - Font Awesome</li>
366
+ <li>carbon:settings - Carbon</li>
367
+ <li>更多图标集可访问 <a href="https://icon-sets.iconify.design/" target="_blank">Iconify Icon Sets</a></li>
368
+ </ul>
369
+ </div>
370
+ </section>
371
+ </div>
372
+ </div>
373
+ </template>
374
+
375
+ <style scoped lang="less">
376
+ .iconify-view {
377
+ background-color: #f7f8fa;
378
+ min-height: 100vh;
379
+
380
+ .container {
381
+ padding: var(--base-interval-2);
382
+ }
383
+
384
+ .intro-section,
385
+ .icons-section,
386
+ .style-section,
387
+ .usage-section,
388
+ .usage-guide {
389
+ margin-bottom: 20px;
390
+ }
391
+
392
+ h2 {
393
+ font-size: 20px;
394
+ margin-bottom: 12px;
395
+ color: #323233;
396
+ }
397
+
398
+ h3 {
399
+ font-size: 16px;
400
+ margin-bottom: 12px;
401
+ color: #323233;
402
+ padding-left: 12px;
403
+ }
404
+
405
+ h4 {
406
+ font-size: 14px;
407
+ margin: 12px 0 8px;
408
+ color: #323233;
409
+ }
410
+
411
+ p {
412
+ font-size: 14px;
413
+ color: #646566;
414
+ line-height: 1.5;
415
+ }
416
+
417
+ .icon-category {
418
+ margin-bottom: 16px;
419
+ }
420
+
421
+ .icon-item {
422
+ display: flex;
423
+ flex-direction: column;
424
+ align-items: center;
425
+ padding: 12px 0;
426
+ }
427
+
428
+ .icon-label {
429
+ margin-top: 8px;
430
+ font-size: 12px;
431
+ color: #323233;
432
+ }
433
+
434
+ .icon-name {
435
+ margin-top: 4px;
436
+ font-size: 10px;
437
+ color: #969799;
438
+ overflow: hidden;
439
+ text-overflow: ellipsis;
440
+ white-space: nowrap;
441
+ max-width: 90%;
442
+ }
443
+
444
+ .style-example {
445
+ display: flex;
446
+ flex-direction: column;
447
+ align-items: center;
448
+ padding: 12px 0;
449
+ }
450
+
451
+ .style-label {
452
+ margin-top: 8px;
453
+ font-size: 12px;
454
+ color: #323233;
455
+ }
456
+
457
+ .code-example {
458
+ font-size: 12px;
459
+ color: #333;
460
+ background-color: #f5f5f5;
461
+ padding: 2px 4px;
462
+ border-radius: 2px;
463
+ overflow-wrap: break-word;
464
+ word-break: break-all;
465
+ }
466
+
467
+ .code-block {
468
+ display: block;
469
+ font-size: 12px;
470
+ color: #333;
471
+ background-color: #f5f5f5;
472
+ padding: 8px 12px;
473
+ border-radius: 4px;
474
+ margin: 8px 0;
475
+ overflow-x: auto;
476
+ }
477
+
478
+ .guide-content {
479
+ background-color: white;
480
+ padding: 16px;
481
+ border-radius: 8px;
482
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
483
+ }
484
+
485
+ .guide-content ul {
486
+ padding-left: 16px;
487
+ margin: 8px 0;
488
+ }
489
+
490
+ .guide-content li {
491
+ font-size: 13px;
492
+ color: #646566;
493
+ line-height: 1.6;
494
+ }
495
+
496
+ .hover-effect {
497
+ transition: transform 0.3s ease;
498
+
499
+ &:hover {
500
+ transform: scale(1.2);
501
+ }
502
+ }
503
+ }
504
+ </style>