af-mobile-client-vue3 1.3.16 → 1.3.17

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 (273) 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 +347 -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 +76 -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/userRecords/AbnormalAlarmRecords.vue +21 -21
  216. package/src/views/userRecords/CardReplacementRecords.vue +21 -21
  217. package/src/views/userRecords/ChangeRecords.vue +19 -19
  218. package/src/views/userRecords/CommandViewRecords.vue +20 -20
  219. package/src/views/userRecords/GasCompensationRecords.vue +20 -20
  220. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
  221. package/src/views/userRecords/MeterRecords.vue +20 -20
  222. package/src/views/userRecords/OperateRecords.vue +51 -51
  223. package/src/views/userRecords/OtherChargeRecords.vue +19 -19
  224. package/src/views/userRecords/PaymentRecords.vue +28 -28
  225. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
  226. package/src/views/userRecords/ReplacementRecords.vue +19 -19
  227. package/src/views/userRecords/SafetyRecords.vue +19 -19
  228. package/src/views/userRecords/TransactionRecords.vue +21 -21
  229. package/src/views/userRecords/TransferRecords.vue +19 -19
  230. package/src/views/userRecords/operateRecordDetail/index.vue +316 -316
  231. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -124
  232. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -88
  233. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -205
  234. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -192
  235. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -192
  236. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -192
  237. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -153
  238. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -101
  239. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -127
  240. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -153
  241. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -153
  242. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -166
  243. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -205
  244. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -127
  245. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -114
  246. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -124
  247. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -153
  248. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -126
  249. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -126
  250. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -114
  251. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -127
  252. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -88
  253. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -101
  254. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -218
  255. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -153
  256. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -140
  257. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -127
  258. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -114
  259. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -127
  260. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -127
  261. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -114
  262. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -127
  263. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -114
  264. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -140
  265. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -152
  266. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -178
  267. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -123
  268. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -192
  269. package/src/views/userRecords/types.ts +66 -66
  270. package/tsconfig.json +39 -39
  271. package/uno.config.ts +82 -82
  272. package/vite.config.ts +118 -118
  273. 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>