vome-core 0.0.1
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.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1 -0
- package/dist/src/auth/define-macro.d.ts +8 -0
- package/dist/src/auth/index.d.ts +2 -0
- package/dist/src/comm/daily-log.d.ts +8 -0
- package/dist/src/comm/env.d.ts +4 -0
- package/dist/src/comm/format-time.d.ts +10 -0
- package/dist/src/comm/merge.d.ts +2 -0
- package/dist/src/comm/scan.d.ts +4 -0
- package/dist/src/comm/startBanner.d.ts +1 -0
- package/dist/src/core/app.d.ts +37 -0
- package/dist/src/core/config.d.ts +2 -0
- package/dist/src/core/context/index.d.ts +22 -0
- package/dist/src/core/host-infra.d.ts +20 -0
- package/dist/src/core/index.d.ts +20 -0
- package/dist/src/core/plugins/async-context.d.ts +3 -0
- package/dist/src/core/plugins/error.d.ts +5 -0
- package/dist/src/core/plugins/logging.d.ts +3 -0
- package/dist/src/core/plugins/openapi.d.ts +3 -0
- package/dist/src/core/vome-config.d.ts +2 -0
- package/dist/src/ext/base-plugin.d.ts +13 -0
- package/dist/src/ext/index.d.ts +15 -0
- package/dist/src/ext/load-plugin.d.ts +12 -0
- package/dist/src/ext/micro-apps.d.ts +60 -0
- package/dist/src/ext/module-gateway.d.ts +10 -0
- package/dist/src/ext/module-registry.d.ts +45 -0
- package/dist/src/ext/path.d.ts +8 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/ioc/container.d.ts +29 -0
- package/dist/src/ioc/decorators.d.ts +35 -0
- package/dist/src/ioc/host.d.ts +2 -0
- package/dist/src/ioc/index.d.ts +6 -0
- package/dist/src/ioc/metadata.d.ts +12 -0
- package/dist/src/ioc/scope.d.ts +9 -0
- package/dist/src/logger/bootstrap.d.ts +2 -0
- package/dist/src/logger/exception.d.ts +22 -0
- package/dist/src/logger/index.d.ts +5 -0
- package/dist/src/logger/logger.d.ts +18 -0
- package/dist/src/logger/pino.d.ts +8 -0
- package/dist/src/orm/base-columns.d.ts +11 -0
- package/dist/src/orm/column-comments.d.ts +25 -0
- package/dist/src/orm/crud-config.d.ts +7 -0
- package/dist/src/orm/crud-register.d.ts +5 -0
- package/dist/src/orm/data-scope.d.ts +24 -0
- package/dist/src/orm/db-store.d.ts +12 -0
- package/dist/src/orm/entity-schema.d.ts +7 -0
- package/dist/src/orm/index.d.ts +22 -0
- package/dist/src/orm/query-builder.d.ts +12 -0
- package/dist/src/orm/query-op.d.ts +27 -0
- package/dist/src/orm/repository.d.ts +74 -0
- package/dist/src/orm/service.d.ts +71 -0
- package/dist/src/orm/tenant.d.ts +24 -0
- package/dist/src/routing/base.d.ts +27 -0
- package/dist/src/routing/context.d.ts +14 -0
- package/dist/src/routing/crud-summary.d.ts +2 -0
- package/dist/src/routing/decorators.d.ts +48 -0
- package/dist/src/routing/eps.d.ts +16 -0
- package/dist/src/routing/index.d.ts +8 -0
- package/dist/src/routing/metadata.d.ts +28 -0
- package/dist/src/routing/openapi-tags.d.ts +23 -0
- package/dist/src/routing/path-utils.d.ts +5 -0
- package/dist/src/routing/perm.d.ts +18 -0
- package/dist/src/routing/register.d.ts +7 -0
- package/dist/src/server/index.d.ts +10 -0
- package/dist/src/shared/index.d.ts +8 -0
- package/dist/src/shared/tree.d.ts +18 -0
- package/dist/typings/comm/crud.d.ts +24 -0
- package/dist/typings/comm/page.d.ts +16 -0
- package/dist/typings/comm/scan.d.ts +6 -0
- package/dist/typings/common.d.ts +6 -0
- package/dist/typings/context/data.d.ts +10 -0
- package/dist/typings/ext/module.d.ts +45 -0
- package/dist/typings/ext/plugin.d.ts +40 -0
- package/dist/typings/ioc/metadata.d.ts +31 -0
- package/dist/typings/logger/config.d.ts +6 -0
- package/dist/typings/routing/crud.d.ts +99 -0
- package/dist/typings/routing/eps.d.ts +53 -0
- package/dist/typings/routing/meta.d.ts +56 -0
- package/dist/typings/routing/register.d.ts +15 -0
- package/dist/typings/routing/scan-context.d.ts +6 -0
- package/package.json +96 -0
- package/src/admin/api/client.ts +184 -0
- package/src/admin/components/vm-aside.vue +227 -0
- package/src/admin/components/vm-auto-perm-dialog.vue +361 -0
- package/src/admin/components/vm-check-tree.vue +338 -0
- package/src/admin/components/vm-dept-tree.vue +549 -0
- package/src/admin/components/vm-empty.vue +62 -0
- package/src/admin/components/vm-eps-perm-picker.vue +114 -0
- package/src/admin/components/vm-group-cascader.vue +563 -0
- package/src/admin/components/vm-icon-picker.vue +616 -0
- package/src/admin/components/vm-markdown.vue +141 -0
- package/src/admin/components/vm-ri-icon.vue +21 -0
- package/src/admin/components/vm-role-picker.vue +314 -0
- package/src/admin/components/vm-view-path-picker.vue +56 -0
- package/src/admin/config/plugin-dev.ts +31 -0
- package/src/admin/crud/components/vm-column-custom.vue +196 -0
- package/src/admin/crud/components/vm-context-menu.vue +99 -0
- package/src/admin/crud/components/vm-date-picker.vue +74 -0
- package/src/admin/crud/components/vm-date-range.vue +291 -0
- package/src/admin/crud/components/vm-date-text.vue +41 -0
- package/src/admin/crud/components/vm-dict-tag.vue +47 -0
- package/src/admin/crud/components/vm-file-icon.vue +54 -0
- package/src/admin/crud/components/vm-multi-select.vue +181 -0
- package/src/admin/crud/components/vm-number-range.vue +200 -0
- package/src/admin/crud/components/vm-radio.vue +87 -0
- package/src/admin/crud/components/vm-select.vue +131 -0
- package/src/admin/crud/components/vm-switch.vue +128 -0
- package/src/admin/crud/components/vm-tree-select.vue +456 -0
- package/src/admin/crud/components/vm-upload-item.vue +215 -0
- package/src/admin/crud/components/vm-upload.vue +323 -0
- package/src/admin/crud/components/vm-user-select.vue +234 -0
- package/src/admin/crud/config.ts +38 -0
- package/src/admin/crud/confirm.ts +135 -0
- package/src/admin/crud/dict.ts +49 -0
- package/src/admin/crud/index.ts +79 -0
- package/src/admin/crud/key.ts +47 -0
- package/src/admin/crud/mitt.ts +27 -0
- package/src/admin/crud/plugins.ts +298 -0
- package/src/admin/crud/registry.ts +45 -0
- package/src/admin/crud/span.ts +48 -0
- package/src/admin/crud/style.ts +112 -0
- package/src/admin/crud/useCrud.ts +81 -0
- package/src/admin/crud/validate.ts +109 -0
- package/src/admin/crud/vm-add-btn.vue +68 -0
- package/src/admin/crud/vm-adv-search.vue +73 -0
- package/src/admin/crud/vm-crud.vue +517 -0
- package/src/admin/crud/vm-dialog.vue +234 -0
- package/src/admin/crud/vm-flex1.vue +14 -0
- package/src/admin/crud/vm-form.vue +239 -0
- package/src/admin/crud/vm-multi-delete-btn.vue +48 -0
- package/src/admin/crud/vm-pagination.vue +125 -0
- package/src/admin/crud/vm-refresh-btn.vue +34 -0
- package/src/admin/crud/vm-row.vue +42 -0
- package/src/admin/crud/vm-search-key.vue +76 -0
- package/src/admin/crud/vm-search.vue +367 -0
- package/src/admin/crud/vm-table.vue +852 -0
- package/src/admin/crud/vm-toolbar.vue +245 -0
- package/src/admin/crud/vm-upsert.vue +530 -0
- package/src/admin/data/remixicon-all.json +1 -0
- package/src/admin/directives/perm.ts +18 -0
- package/src/admin/env.d.ts +5 -0
- package/src/admin/hooks/useBrowser.ts +27 -0
- package/src/admin/hooks/useUpload.ts +82 -0
- package/src/admin/hooks/useVome.ts +13 -0
- package/src/admin/index.ts +59 -0
- package/src/admin/lib/browser.ts +28 -0
- package/src/admin/lib/cn.ts +7 -0
- package/src/admin/lib/dialog-float.ts +14 -0
- package/src/admin/lib/eps.ts +43 -0
- package/src/admin/lib/menu.ts +15 -0
- package/src/admin/lib/module.ts +112 -0
- package/src/admin/lib/tree.ts +2 -0
- package/src/admin/lib/upload.ts +102 -0
- package/src/admin/router/index.ts +61 -0
- package/src/admin/router/menu-routes.ts +126 -0
- package/src/admin/service/base.ts +96 -0
- package/src/admin/service/index.ts +281 -0
- package/src/admin/static/fileicon/demo.css +539 -0
- package/src/admin/static/fileicon/demo_index.html +901 -0
- package/src/admin/static/fileicon/iconfont.css +139 -0
- package/src/admin/static/fileicon/iconfont.js +1 -0
- package/src/admin/static/fileicon/iconfont.json +226 -0
- package/src/admin/static/fileicon/iconfont.ttf +0 -0
- package/src/admin/static/fileicon/iconfont.woff +0 -0
- package/src/admin/static/fileicon/iconfont.woff2 +0 -0
- package/src/admin/static/scarce//344/270/213/350/275/275/345/244/261/350/264/245.svg +1 -0
- package/src/admin/static/scarce//346/224/257/344/273/230/346/210/220/345/212/237.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/344/274/230/346/203/240/345/210/270.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/206/205/345/256/271.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/217/221/347/245/250.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/233/276/347/211/207.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/234/260/345/235/200.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/272/227/351/223/272.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/216/250/351/200/201.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/220/234/347/264/242/347/273/223/346/236/234.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/224/266/350/227/217.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/225/260/346/215/256.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/235/203/351/231/220.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/266/210/346/201/257.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/347/244/274/347/211/251.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/347/247/257/345/210/206.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/347/275/221/347/273/234.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/350/247/206/351/242/221.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/350/256/242/345/215/225.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/350/257/204/350/256/272.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/351/205/215/351/200/201.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/351/223/266/350/241/214/345/215/241.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/351/237/263/344/271/220.svg +1 -0
- package/src/admin/static/scarce//351/241/265/351/235/242/344/270/215/345/255/230/345/234/250.svg +1 -0
- package/src/admin/stores/app.ts +30 -0
- package/src/admin/stores/tags.ts +73 -0
- package/src/admin/stores/user.ts +52 -0
- package/src/admin/styles/base.css +137 -0
- package/src/admin/tsconfig.json +19 -0
- package/typings/admin/base/auth.ts +23 -0
- package/typings/admin/base/permission.ts +19 -0
- package/typings/admin/comm/cascader.ts +7 -0
- package/typings/admin/comm/check-tree.ts +7 -0
- package/typings/admin/comm/crud.ts +294 -0
- package/typings/admin/comm/eps.ts +52 -0
- package/typings/admin/comm/request.ts +12 -0
- package/typings/admin/comm/service.ts +35 -0
- package/typings/admin/comm/upload.ts +39 -0
- package/typings/admin/host.d.ts +61 -0
- package/typings/admin/vome/browser.ts +11 -0
- package/typings/admin/vome/module.ts +13 -0
- package/typings/admin/vome/tags.ts +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["ri-24-hours-fill","ri-24-hours-line","ri-4k-fill","ri-4k-line","ri-a-b","ri-account-box-fill","ri-account-box-line","ri-account-circle-fill","ri-account-circle-line","ri-account-pin-box-fill","ri-account-pin-box-line","ri-account-pin-circle-fill","ri-account-pin-circle-line","ri-add-box-fill","ri-add-box-line","ri-add-circle-fill","ri-add-circle-line","ri-add-fill","ri-add-line","ri-admin-fill","ri-admin-line","ri-advertisement-fill","ri-advertisement-line","ri-airplay-fill","ri-airplay-line","ri-alarm-fill","ri-alarm-line","ri-alarm-warning-fill","ri-alarm-warning-line","ri-album-fill","ri-album-line","ri-alert-fill","ri-alert-line","ri-aliens-fill","ri-aliens-line","ri-align-bottom","ri-align-center","ri-align-justify","ri-align-left","ri-align-right","ri-align-top","ri-align-vertically","ri-alipay-fill","ri-alipay-line","ri-amazon-fill","ri-amazon-line","ri-anchor-fill","ri-anchor-line","ri-ancient-gate-fill","ri-ancient-gate-line","ri-ancient-pavilion-fill","ri-ancient-pavilion-line","ri-android-fill","ri-android-line","ri-angularjs-fill","ri-angularjs-line","ri-anticlockwise-2-fill","ri-anticlockwise-2-line","ri-anticlockwise-fill","ri-anticlockwise-line","ri-app-store-fill","ri-app-store-line","ri-apple-fill","ri-apple-line","ri-apps-2-fill","ri-apps-2-line","ri-apps-fill","ri-apps-line","ri-archive-drawer-fill","ri-archive-drawer-line","ri-archive-fill","ri-archive-line","ri-arrow-down-circle-fill","ri-arrow-down-circle-line","ri-arrow-down-fill","ri-arrow-down-line","ri-arrow-down-s-fill","ri-arrow-down-s-line","ri-arrow-drop-down-fill","ri-arrow-drop-down-line","ri-arrow-drop-left-fill","ri-arrow-drop-left-line","ri-arrow-drop-right-fill","ri-arrow-drop-right-line","ri-arrow-drop-up-fill","ri-arrow-drop-up-line","ri-arrow-go-back-fill","ri-arrow-go-back-line","ri-arrow-go-forward-fill","ri-arrow-go-forward-line","ri-arrow-left-circle-fill","ri-arrow-left-circle-line","ri-arrow-left-down-fill","ri-arrow-left-down-line","ri-arrow-left-fill","ri-arrow-left-line","ri-arrow-left-right-fill","ri-arrow-left-right-line","ri-arrow-left-s-fill","ri-arrow-left-s-line","ri-arrow-left-up-fill","ri-arrow-left-up-line","ri-arrow-right-circle-fill","ri-arrow-right-circle-line","ri-arrow-right-down-fill","ri-arrow-right-down-line","ri-arrow-right-fill","ri-arrow-right-line","ri-arrow-right-s-fill","ri-arrow-right-s-line","ri-arrow-right-up-fill","ri-arrow-right-up-line","ri-arrow-up-circle-fill","ri-arrow-up-circle-line","ri-arrow-up-down-fill","ri-arrow-up-down-line","ri-arrow-up-fill","ri-arrow-up-line","ri-arrow-up-s-fill","ri-arrow-up-s-line","ri-artboard-2-fill","ri-artboard-2-line","ri-artboard-fill","ri-artboard-line","ri-article-fill","ri-article-line","ri-aspect-ratio-fill","ri-aspect-ratio-line","ri-asterisk","ri-at-fill","ri-at-line","ri-attachment-2","ri-attachment-fill","ri-attachment-line","ri-auction-fill","ri-auction-line","ri-award-fill","ri-award-line","ri-baidu-fill","ri-baidu-line","ri-ball-pen-fill","ri-ball-pen-line","ri-bank-card-2-fill","ri-bank-card-2-line","ri-bank-card-fill","ri-bank-card-line","ri-bank-fill","ri-bank-line","ri-bar-chart-2-fill","ri-bar-chart-2-line","ri-bar-chart-box-fill","ri-bar-chart-box-line","ri-bar-chart-fill","ri-bar-chart-grouped-fill","ri-bar-chart-grouped-line","ri-bar-chart-horizontal-fill","ri-bar-chart-horizontal-line","ri-bar-chart-line","ri-barcode-box-fill","ri-barcode-box-line","ri-barcode-fill","ri-barcode-line","ri-barricade-fill","ri-barricade-line","ri-base-station-fill","ri-base-station-line","ri-basketball-fill","ri-basketball-line","ri-battery-2-charge-fill","ri-battery-2-charge-line","ri-battery-2-fill","ri-battery-2-line","ri-battery-charge-fill","ri-battery-charge-line","ri-battery-fill","ri-battery-line","ri-battery-low-fill","ri-battery-low-line","ri-battery-saver-fill","ri-battery-saver-line","ri-battery-share-fill","ri-battery-share-line","ri-bear-smile-fill","ri-bear-smile-line","ri-behance-fill","ri-behance-line","ri-bell-fill","ri-bell-line","ri-bike-fill","ri-bike-line","ri-bilibili-fill","ri-bilibili-line","ri-bill-fill","ri-bill-line","ri-billiards-fill","ri-billiards-line","ri-bit-coin-fill","ri-bit-coin-line","ri-blaze-fill","ri-blaze-line","ri-bluetooth-connect-fill","ri-bluetooth-connect-line","ri-bluetooth-fill","ri-bluetooth-line","ri-blur-off-fill","ri-blur-off-line","ri-body-scan-fill","ri-body-scan-line","ri-bold","ri-book-2-fill","ri-book-2-line","ri-book-3-fill","ri-book-3-line","ri-book-fill","ri-book-line","ri-book-marked-fill","ri-book-marked-line","ri-book-open-fill","ri-book-open-line","ri-book-read-fill","ri-book-read-line","ri-booklet-fill","ri-booklet-line","ri-bookmark-2-fill","ri-bookmark-2-line","ri-bookmark-3-fill","ri-bookmark-3-line","ri-bookmark-fill","ri-bookmark-line","ri-boxing-fill","ri-boxing-line","ri-braces-fill","ri-braces-line","ri-brackets-fill","ri-brackets-line","ri-briefcase-2-fill","ri-briefcase-2-line","ri-briefcase-3-fill","ri-briefcase-3-line","ri-briefcase-4-fill","ri-briefcase-4-line","ri-briefcase-5-fill","ri-briefcase-5-line","ri-briefcase-fill","ri-briefcase-line","ri-bring-forward","ri-bring-to-front","ri-broadcast-fill","ri-broadcast-line","ri-brush-2-fill","ri-brush-2-line","ri-brush-3-fill","ri-brush-3-line","ri-brush-4-fill","ri-brush-4-line","ri-brush-fill","ri-brush-line","ri-bubble-chart-fill","ri-bubble-chart-line","ri-bug-2-fill","ri-bug-2-line","ri-bug-fill","ri-bug-line","ri-building-2-fill","ri-building-2-line","ri-building-3-fill","ri-building-3-line","ri-building-4-fill","ri-building-4-line","ri-building-fill","ri-building-line","ri-bus-2-fill","ri-bus-2-line","ri-bus-fill","ri-bus-line","ri-bus-wifi-fill","ri-bus-wifi-line","ri-cactus-fill","ri-cactus-line","ri-cake-2-fill","ri-cake-2-line","ri-cake-3-fill","ri-cake-3-line","ri-cake-fill","ri-cake-line","ri-calculator-fill","ri-calculator-line","ri-calendar-2-fill","ri-calendar-2-line","ri-calendar-check-fill","ri-calendar-check-line","ri-calendar-event-fill","ri-calendar-event-line","ri-calendar-fill","ri-calendar-line","ri-calendar-todo-fill","ri-calendar-todo-line","ri-camera-2-fill","ri-camera-2-line","ri-camera-3-fill","ri-camera-3-line","ri-camera-fill","ri-camera-lens-fill","ri-camera-lens-line","ri-camera-line","ri-camera-off-fill","ri-camera-off-line","ri-camera-switch-fill","ri-camera-switch-line","ri-capsule-fill","ri-capsule-line","ri-car-fill","ri-car-line","ri-car-washing-fill","ri-car-washing-line","ri-caravan-fill","ri-caravan-line","ri-cast-fill","ri-cast-line","ri-cellphone-fill","ri-cellphone-line","ri-celsius-fill","ri-celsius-line","ri-centos-fill","ri-centos-line","ri-character-recognition-fill","ri-character-recognition-line","ri-charging-pile-2-fill","ri-charging-pile-2-line","ri-charging-pile-fill","ri-charging-pile-line","ri-chat-1-fill","ri-chat-1-line","ri-chat-2-fill","ri-chat-2-line","ri-chat-3-fill","ri-chat-3-line","ri-chat-4-fill","ri-chat-4-line","ri-chat-check-fill","ri-chat-check-line","ri-chat-delete-fill","ri-chat-delete-line","ri-chat-download-fill","ri-chat-download-line","ri-chat-follow-up-fill","ri-chat-follow-up-line","ri-chat-forward-fill","ri-chat-forward-line","ri-chat-heart-fill","ri-chat-heart-line","ri-chat-history-fill","ri-chat-history-line","ri-chat-new-fill","ri-chat-new-line","ri-chat-off-fill","ri-chat-off-line","ri-chat-poll-fill","ri-chat-poll-line","ri-chat-private-fill","ri-chat-private-line","ri-chat-quote-fill","ri-chat-quote-line","ri-chat-settings-fill","ri-chat-settings-line","ri-chat-smile-2-fill","ri-chat-smile-2-line","ri-chat-smile-3-fill","ri-chat-smile-3-line","ri-chat-smile-fill","ri-chat-smile-line","ri-chat-upload-fill","ri-chat-upload-line","ri-chat-voice-fill","ri-chat-voice-line","ri-check-double-fill","ri-check-double-line","ri-check-fill","ri-check-line","ri-checkbox-blank-circle-fill","ri-checkbox-blank-circle-line","ri-checkbox-blank-fill","ri-checkbox-blank-line","ri-checkbox-circle-fill","ri-checkbox-circle-line","ri-checkbox-fill","ri-checkbox-indeterminate-fill","ri-checkbox-indeterminate-line","ri-checkbox-line","ri-checkbox-multiple-blank-fill","ri-checkbox-multiple-blank-line","ri-checkbox-multiple-fill","ri-checkbox-multiple-line","ri-china-railway-fill","ri-china-railway-line","ri-chrome-fill","ri-chrome-line","ri-clapperboard-fill","ri-clapperboard-line","ri-clipboard-fill","ri-clipboard-line","ri-clockwise-2-fill","ri-clockwise-2-line","ri-clockwise-fill","ri-clockwise-line","ri-close-circle-fill","ri-close-circle-line","ri-close-fill","ri-close-line","ri-closed-captioning-fill","ri-closed-captioning-line","ri-cloud-fill","ri-cloud-line","ri-cloud-off-fill","ri-cloud-off-line","ri-cloud-windy-fill","ri-cloud-windy-line","ri-cloudy-2-fill","ri-cloudy-2-line","ri-cloudy-fill","ri-cloudy-line","ri-code-box-fill","ri-code-box-line","ri-code-fill","ri-code-line","ri-code-s-fill","ri-code-s-line","ri-code-s-slash-fill","ri-code-s-slash-line","ri-code-view","ri-codepen-fill","ri-codepen-line","ri-coin-fill","ri-coin-line","ri-coins-fill","ri-coins-line","ri-collage-fill","ri-collage-line","ri-command-fill","ri-command-line","ri-community-fill","ri-community-line","ri-compass-2-fill","ri-compass-2-line","ri-compass-3-fill","ri-compass-3-line","ri-compass-4-fill","ri-compass-4-line","ri-compass-discover-fill","ri-compass-discover-line","ri-compass-fill","ri-compass-line","ri-compasses-2-fill","ri-compasses-2-line","ri-compasses-fill","ri-compasses-line","ri-computer-fill","ri-computer-line","ri-contacts-book-2-fill","ri-contacts-book-2-line","ri-contacts-book-fill","ri-contacts-book-line","ri-contacts-book-upload-fill","ri-contacts-book-upload-line","ri-contacts-fill","ri-contacts-line","ri-contrast-2-fill","ri-contrast-2-line","ri-contrast-drop-2-fill","ri-contrast-drop-2-line","ri-contrast-drop-fill","ri-contrast-drop-line","ri-contrast-fill","ri-contrast-line","ri-copper-coin-fill","ri-copper-coin-line","ri-copper-diamond-fill","ri-copper-diamond-line","ri-copyleft-fill","ri-copyleft-line","ri-copyright-fill","ri-copyright-line","ri-coreos-fill","ri-coreos-line","ri-coupon-2-fill","ri-coupon-2-line","ri-coupon-3-fill","ri-coupon-3-line","ri-coupon-4-fill","ri-coupon-4-line","ri-coupon-5-fill","ri-coupon-5-line","ri-coupon-fill","ri-coupon-line","ri-cpu-fill","ri-cpu-line","ri-creative-commons-by-fill","ri-creative-commons-by-line","ri-creative-commons-fill","ri-creative-commons-line","ri-creative-commons-nc-fill","ri-creative-commons-nc-line","ri-creative-commons-nd-fill","ri-creative-commons-nd-line","ri-creative-commons-sa-fill","ri-creative-commons-sa-line","ri-creative-commons-zero-fill","ri-creative-commons-zero-line","ri-criminal-fill","ri-criminal-line","ri-crop-2-fill","ri-crop-2-line","ri-crop-fill","ri-crop-line","ri-css3-fill","ri-css3-line","ri-cup-fill","ri-cup-line","ri-currency-fill","ri-currency-line","ri-cursor-fill","ri-cursor-line","ri-customer-service-2-fill","ri-customer-service-2-line","ri-customer-service-fill","ri-customer-service-line","ri-dashboard-2-fill","ri-dashboard-2-line","ri-dashboard-3-fill","ri-dashboard-3-line","ri-dashboard-fill","ri-dashboard-line","ri-database-2-fill","ri-database-2-line","ri-database-fill","ri-database-line","ri-delete-back-2-fill","ri-delete-back-2-line","ri-delete-back-fill","ri-delete-back-line","ri-delete-bin-2-fill","ri-delete-bin-2-line","ri-delete-bin-3-fill","ri-delete-bin-3-line","ri-delete-bin-4-fill","ri-delete-bin-4-line","ri-delete-bin-5-fill","ri-delete-bin-5-line","ri-delete-bin-6-fill","ri-delete-bin-6-line","ri-delete-bin-7-fill","ri-delete-bin-7-line","ri-delete-bin-fill","ri-delete-bin-line","ri-delete-column","ri-delete-row","ri-device-fill","ri-device-line","ri-device-recover-fill","ri-device-recover-line","ri-dingding-fill","ri-dingding-line","ri-direction-fill","ri-direction-line","ri-disc-fill","ri-disc-line","ri-discord-fill","ri-discord-line","ri-discuss-fill","ri-discuss-line","ri-dislike-fill","ri-dislike-line","ri-disqus-fill","ri-disqus-line","ri-divide-fill","ri-divide-line","ri-donut-chart-fill","ri-donut-chart-line","ri-door-closed-fill","ri-door-closed-line","ri-door-fill","ri-door-line","ri-door-lock-box-fill","ri-door-lock-box-line","ri-door-lock-fill","ri-door-lock-line","ri-door-open-fill","ri-door-open-line","ri-dossier-fill","ri-dossier-line","ri-douban-fill","ri-douban-line","ri-double-quotes-l","ri-double-quotes-r","ri-download-2-fill","ri-download-2-line","ri-download-cloud-2-fill","ri-download-cloud-2-line","ri-download-cloud-fill","ri-download-cloud-line","ri-download-fill","ri-download-line","ri-draft-fill","ri-draft-line","ri-drag-drop-fill","ri-drag-drop-line","ri-drag-move-2-fill","ri-drag-move-2-line","ri-drag-move-fill","ri-drag-move-line","ri-dribbble-fill","ri-dribbble-line","ri-drive-fill","ri-drive-line","ri-drizzle-fill","ri-drizzle-line","ri-drop-fill","ri-drop-line","ri-dropbox-fill","ri-dropbox-line","ri-dual-sim-1-fill","ri-dual-sim-1-line","ri-dual-sim-2-fill","ri-dual-sim-2-line","ri-dv-fill","ri-dv-line","ri-dvd-fill","ri-dvd-line","ri-e-bike-2-fill","ri-e-bike-2-line","ri-e-bike-fill","ri-e-bike-line","ri-earth-fill","ri-earth-line","ri-earthquake-fill","ri-earthquake-line","ri-edge-fill","ri-edge-line","ri-edit-2-fill","ri-edit-2-line","ri-edit-box-fill","ri-edit-box-line","ri-edit-circle-fill","ri-edit-circle-line","ri-edit-fill","ri-edit-line","ri-eject-fill","ri-eject-line","ri-emotion-2-fill","ri-emotion-2-line","ri-emotion-fill","ri-emotion-happy-fill","ri-emotion-happy-line","ri-emotion-laugh-fill","ri-emotion-laugh-line","ri-emotion-line","ri-emotion-normal-fill","ri-emotion-normal-line","ri-emotion-sad-fill","ri-emotion-sad-line","ri-emotion-unhappy-fill","ri-emotion-unhappy-line","ri-empathize-fill","ri-empathize-line","ri-emphasis-cn","ri-emphasis","ri-english-input","ri-equalizer-fill","ri-equalizer-line","ri-eraser-fill","ri-eraser-line","ri-error-warning-fill","ri-error-warning-line","ri-evernote-fill","ri-evernote-line","ri-exchange-box-fill","ri-exchange-box-line","ri-exchange-cny-fill","ri-exchange-cny-line","ri-exchange-dollar-fill","ri-exchange-dollar-line","ri-exchange-fill","ri-exchange-funds-fill","ri-exchange-funds-line","ri-exchange-line","ri-external-link-fill","ri-external-link-line","ri-eye-2-fill","ri-eye-2-line","ri-eye-close-fill","ri-eye-close-line","ri-eye-fill","ri-eye-line","ri-eye-off-fill","ri-eye-off-line","ri-facebook-box-fill","ri-facebook-box-line","ri-facebook-circle-fill","ri-facebook-circle-line","ri-facebook-fill","ri-facebook-line","ri-fahrenheit-fill","ri-fahrenheit-line","ri-feedback-fill","ri-feedback-line","ri-file-2-fill","ri-file-2-line","ri-file-3-fill","ri-file-3-line","ri-file-4-fill","ri-file-4-line","ri-file-add-fill","ri-file-add-line","ri-file-chart-2-fill","ri-file-chart-2-line","ri-file-chart-fill","ri-file-chart-line","ri-file-cloud-fill","ri-file-cloud-line","ri-file-code-fill","ri-file-code-line","ri-file-copy-2-fill","ri-file-copy-2-line","ri-file-copy-fill","ri-file-copy-line","ri-file-damage-fill","ri-file-damage-line","ri-file-download-fill","ri-file-download-line","ri-file-edit-fill","ri-file-edit-line","ri-file-excel-2-fill","ri-file-excel-2-line","ri-file-excel-fill","ri-file-excel-line","ri-file-fill","ri-file-forbid-fill","ri-file-forbid-line","ri-file-gif-fill","ri-file-gif-line","ri-file-history-fill","ri-file-history-line","ri-file-hwp-fill","ri-file-hwp-line","ri-file-info-fill","ri-file-info-line","ri-file-line","ri-file-list-2-fill","ri-file-list-2-line","ri-file-list-3-fill","ri-file-list-3-line","ri-file-list-fill","ri-file-list-line","ri-file-lock-fill","ri-file-lock-line","ri-file-marked-fill","ri-file-marked-line","ri-file-music-fill","ri-file-music-line","ri-file-paper-2-fill","ri-file-paper-2-line","ri-file-paper-fill","ri-file-paper-line","ri-file-pdf-fill","ri-file-pdf-line","ri-file-ppt-2-fill","ri-file-ppt-2-line","ri-file-ppt-fill","ri-file-ppt-line","ri-file-reduce-fill","ri-file-reduce-line","ri-file-search-fill","ri-file-search-line","ri-file-settings-fill","ri-file-settings-line","ri-file-shield-2-fill","ri-file-shield-2-line","ri-file-shield-fill","ri-file-shield-line","ri-file-shred-fill","ri-file-shred-line","ri-file-text-fill","ri-file-text-line","ri-file-transfer-fill","ri-file-transfer-line","ri-file-unknow-fill","ri-file-unknow-line","ri-file-upload-fill","ri-file-upload-line","ri-file-user-fill","ri-file-user-line","ri-file-warning-fill","ri-file-warning-line","ri-file-word-2-fill","ri-file-word-2-line","ri-file-word-fill","ri-file-word-line","ri-file-zip-fill","ri-file-zip-line","ri-film-fill","ri-film-line","ri-filter-2-fill","ri-filter-2-line","ri-filter-3-fill","ri-filter-3-line","ri-filter-fill","ri-filter-line","ri-filter-off-fill","ri-filter-off-line","ri-find-replace-fill","ri-find-replace-line","ri-finder-fill","ri-finder-line","ri-fingerprint-2-fill","ri-fingerprint-2-line","ri-fingerprint-fill","ri-fingerprint-line","ri-fire-fill","ri-fire-line","ri-firefox-fill","ri-firefox-line","ri-first-aid-kit-fill","ri-first-aid-kit-line","ri-flag-2-fill","ri-flag-2-line","ri-flag-fill","ri-flag-line","ri-flashlight-fill","ri-flashlight-line","ri-flask-fill","ri-flask-line","ri-flight-land-fill","ri-flight-land-line","ri-flight-takeoff-fill","ri-flight-takeoff-line","ri-flood-fill","ri-flood-line","ri-flow-chart","ri-flutter-fill","ri-flutter-line","ri-focus-2-fill","ri-focus-2-line","ri-focus-3-fill","ri-focus-3-line","ri-focus-fill","ri-focus-line","ri-foggy-fill","ri-foggy-line","ri-folder-2-fill","ri-folder-2-line","ri-folder-3-fill","ri-folder-3-line","ri-folder-4-fill","ri-folder-4-line","ri-folder-5-fill","ri-folder-5-line","ri-folder-add-fill","ri-folder-add-line","ri-folder-chart-2-fill","ri-folder-chart-2-line","ri-folder-chart-fill","ri-folder-chart-line","ri-folder-download-fill","ri-folder-download-line","ri-folder-fill","ri-folder-forbid-fill","ri-folder-forbid-line","ri-folder-history-fill","ri-folder-history-line","ri-folder-info-fill","ri-folder-info-line","ri-folder-keyhole-fill","ri-folder-keyhole-line","ri-folder-line","ri-folder-lock-fill","ri-folder-lock-line","ri-folder-music-fill","ri-folder-music-line","ri-folder-open-fill","ri-folder-open-line","ri-folder-received-fill","ri-folder-received-line","ri-folder-reduce-fill","ri-folder-reduce-line","ri-folder-settings-fill","ri-folder-settings-line","ri-folder-shared-fill","ri-folder-shared-line","ri-folder-shield-2-fill","ri-folder-shield-2-line","ri-folder-shield-fill","ri-folder-shield-line","ri-folder-transfer-fill","ri-folder-transfer-line","ri-folder-unknow-fill","ri-folder-unknow-line","ri-folder-upload-fill","ri-folder-upload-line","ri-folder-user-fill","ri-folder-user-line","ri-folder-warning-fill","ri-folder-warning-line","ri-folder-zip-fill","ri-folder-zip-line","ri-folders-fill","ri-folders-line","ri-font-color","ri-font-size-2","ri-font-size","ri-football-fill","ri-football-line","ri-footprint-fill","ri-footprint-line","ri-forbid-2-fill","ri-forbid-2-line","ri-forbid-fill","ri-forbid-line","ri-format-clear","ri-fridge-fill","ri-fridge-line","ri-fullscreen-exit-fill","ri-fullscreen-exit-line","ri-fullscreen-fill","ri-fullscreen-line","ri-function-fill","ri-function-line","ri-functions","ri-funds-box-fill","ri-funds-box-line","ri-funds-fill","ri-funds-line","ri-gallery-fill","ri-gallery-line","ri-gallery-upload-fill","ri-gallery-upload-line","ri-game-fill","ri-game-line","ri-gamepad-fill","ri-gamepad-line","ri-gas-station-fill","ri-gas-station-line","ri-gatsby-fill","ri-gatsby-line","ri-genderless-fill","ri-genderless-line","ri-ghost-2-fill","ri-ghost-2-line","ri-ghost-fill","ri-ghost-line","ri-ghost-smile-fill","ri-ghost-smile-line","ri-gift-2-fill","ri-gift-2-line","ri-gift-fill","ri-gift-line","ri-git-branch-fill","ri-git-branch-line","ri-git-commit-fill","ri-git-commit-line","ri-git-merge-fill","ri-git-merge-line","ri-git-pull-request-fill","ri-git-pull-request-line","ri-git-repository-commits-fill","ri-git-repository-commits-line","ri-git-repository-fill","ri-git-repository-line","ri-git-repository-private-fill","ri-git-repository-private-line","ri-github-fill","ri-github-line","ri-gitlab-fill","ri-gitlab-line","ri-global-fill","ri-global-line","ri-globe-fill","ri-globe-line","ri-goblet-fill","ri-goblet-line","ri-google-fill","ri-google-line","ri-google-play-fill","ri-google-play-line","ri-government-fill","ri-government-line","ri-gps-fill","ri-gps-line","ri-gradienter-fill","ri-gradienter-line","ri-grid-fill","ri-grid-line","ri-group-2-fill","ri-group-2-line","ri-group-fill","ri-group-line","ri-guide-fill","ri-guide-line","ri-h-1","ri-h-2","ri-h-3","ri-h-4","ri-h-5","ri-h-6","ri-hail-fill","ri-hail-line","ri-hammer-fill","ri-hammer-line","ri-hand-coin-fill","ri-hand-coin-line","ri-hand-heart-fill","ri-hand-heart-line","ri-hand-sanitizer-fill","ri-hand-sanitizer-line","ri-handbag-fill","ri-handbag-line","ri-hard-drive-2-fill","ri-hard-drive-2-line","ri-hard-drive-fill","ri-hard-drive-line","ri-hashtag","ri-haze-2-fill","ri-haze-2-line","ri-haze-fill","ri-haze-line","ri-hd-fill","ri-hd-line","ri-heading","ri-headphone-fill","ri-headphone-line","ri-health-book-fill","ri-health-book-line","ri-heart-2-fill","ri-heart-2-line","ri-heart-3-fill","ri-heart-3-line","ri-heart-add-fill","ri-heart-add-line","ri-heart-fill","ri-heart-line","ri-heart-pulse-fill","ri-heart-pulse-line","ri-hearts-fill","ri-hearts-line","ri-heavy-showers-fill","ri-heavy-showers-line","ri-history-fill","ri-history-line","ri-home-2-fill","ri-home-2-line","ri-home-3-fill","ri-home-3-line","ri-home-4-fill","ri-home-4-line","ri-home-5-fill","ri-home-5-line","ri-home-6-fill","ri-home-6-line","ri-home-7-fill","ri-home-7-line","ri-home-8-fill","ri-home-8-line","ri-home-fill","ri-home-gear-fill","ri-home-gear-line","ri-home-heart-fill","ri-home-heart-line","ri-home-line","ri-home-smile-2-fill","ri-home-smile-2-line","ri-home-smile-fill","ri-home-smile-line","ri-home-wifi-fill","ri-home-wifi-line","ri-honor-of-kings-fill","ri-honor-of-kings-line","ri-honour-fill","ri-honour-line","ri-hospital-fill","ri-hospital-line","ri-hotel-bed-fill","ri-hotel-bed-line","ri-hotel-fill","ri-hotel-line","ri-hotspot-fill","ri-hotspot-line","ri-hq-fill","ri-hq-line","ri-html5-fill","ri-html5-line","ri-ie-fill","ri-ie-line","ri-image-2-fill","ri-image-2-line","ri-image-add-fill","ri-image-add-line","ri-image-edit-fill","ri-image-edit-line","ri-image-fill","ri-image-line","ri-inbox-archive-fill","ri-inbox-archive-line","ri-inbox-fill","ri-inbox-line","ri-inbox-unarchive-fill","ri-inbox-unarchive-line","ri-increase-decrease-fill","ri-increase-decrease-line","ri-indent-decrease","ri-indent-increase","ri-indeterminate-circle-fill","ri-indeterminate-circle-line","ri-information-fill","ri-information-line","ri-infrared-thermometer-fill","ri-infrared-thermometer-line","ri-ink-bottle-fill","ri-ink-bottle-line","ri-input-cursor-move","ri-input-method-fill","ri-input-method-line","ri-insert-column-left","ri-insert-column-right","ri-insert-row-bottom","ri-insert-row-top","ri-instagram-fill","ri-instagram-line","ri-install-fill","ri-install-line","ri-invision-fill","ri-invision-line","ri-italic","ri-kakao-talk-fill","ri-kakao-talk-line","ri-key-2-fill","ri-key-2-line","ri-key-fill","ri-key-line","ri-keyboard-box-fill","ri-keyboard-box-line","ri-keyboard-fill","ri-keyboard-line","ri-keynote-fill","ri-keynote-line","ri-knife-blood-fill","ri-knife-blood-line","ri-knife-fill","ri-knife-line","ri-landscape-fill","ri-landscape-line","ri-layout-2-fill","ri-layout-2-line","ri-layout-3-fill","ri-layout-3-line","ri-layout-4-fill","ri-layout-4-line","ri-layout-5-fill","ri-layout-5-line","ri-layout-6-fill","ri-layout-6-line","ri-layout-bottom-2-fill","ri-layout-bottom-2-line","ri-layout-bottom-fill","ri-layout-bottom-line","ri-layout-column-fill","ri-layout-column-line","ri-layout-fill","ri-layout-grid-fill","ri-layout-grid-line","ri-layout-left-2-fill","ri-layout-left-2-line","ri-layout-left-fill","ri-layout-left-line","ri-layout-line","ri-layout-masonry-fill","ri-layout-masonry-line","ri-layout-right-2-fill","ri-layout-right-2-line","ri-layout-right-fill","ri-layout-right-line","ri-layout-row-fill","ri-layout-row-line","ri-layout-top-2-fill","ri-layout-top-2-line","ri-layout-top-fill","ri-layout-top-line","ri-leaf-fill","ri-leaf-line","ri-lifebuoy-fill","ri-lifebuoy-line","ri-lightbulb-fill","ri-lightbulb-flash-fill","ri-lightbulb-flash-line","ri-lightbulb-line","ri-line-chart-fill","ri-line-chart-line","ri-line-fill","ri-line-height","ri-line-line","ri-link-m","ri-link-unlink-m","ri-link-unlink","ri-link","ri-linkedin-box-fill","ri-linkedin-box-line","ri-linkedin-fill","ri-linkedin-line","ri-links-fill","ri-links-line","ri-list-check-2","ri-list-check","ri-list-ordered","ri-list-settings-fill","ri-list-settings-line","ri-list-unordered","ri-live-fill","ri-live-line","ri-loader-2-fill","ri-loader-2-line","ri-loader-3-fill","ri-loader-3-line","ri-loader-4-fill","ri-loader-4-line","ri-loader-5-fill","ri-loader-5-line","ri-loader-fill","ri-loader-line","ri-lock-2-fill","ri-lock-2-line","ri-lock-fill","ri-lock-line","ri-lock-password-fill","ri-lock-password-line","ri-lock-unlock-fill","ri-lock-unlock-line","ri-login-box-fill","ri-login-box-line","ri-login-circle-fill","ri-login-circle-line","ri-logout-box-fill","ri-logout-box-line","ri-logout-box-r-fill","ri-logout-box-r-line","ri-logout-circle-fill","ri-logout-circle-line","ri-logout-circle-r-fill","ri-logout-circle-r-line","ri-luggage-cart-fill","ri-luggage-cart-line","ri-luggage-deposit-fill","ri-luggage-deposit-line","ri-lungs-fill","ri-lungs-line","ri-mac-fill","ri-mac-line","ri-macbook-fill","ri-macbook-line","ri-magic-fill","ri-magic-line","ri-mail-add-fill","ri-mail-add-line","ri-mail-check-fill","ri-mail-check-line","ri-mail-close-fill","ri-mail-close-line","ri-mail-download-fill","ri-mail-download-line","ri-mail-fill","ri-mail-forbid-fill","ri-mail-forbid-line","ri-mail-line","ri-mail-lock-fill","ri-mail-lock-line","ri-mail-open-fill","ri-mail-open-line","ri-mail-send-fill","ri-mail-send-line","ri-mail-settings-fill","ri-mail-settings-line","ri-mail-star-fill","ri-mail-star-line","ri-mail-unread-fill","ri-mail-unread-line","ri-mail-volume-fill","ri-mail-volume-line","ri-map-2-fill","ri-map-2-line","ri-map-fill","ri-map-line","ri-map-pin-2-fill","ri-map-pin-2-line","ri-map-pin-3-fill","ri-map-pin-3-line","ri-map-pin-4-fill","ri-map-pin-4-line","ri-map-pin-5-fill","ri-map-pin-5-line","ri-map-pin-add-fill","ri-map-pin-add-line","ri-map-pin-fill","ri-map-pin-line","ri-map-pin-range-fill","ri-map-pin-range-line","ri-map-pin-time-fill","ri-map-pin-time-line","ri-map-pin-user-fill","ri-map-pin-user-line","ri-mark-pen-fill","ri-mark-pen-line","ri-markdown-fill","ri-markdown-line","ri-markup-fill","ri-markup-line","ri-mastercard-fill","ri-mastercard-line","ri-mastodon-fill","ri-mastodon-line","ri-medal-2-fill","ri-medal-2-line","ri-medal-fill","ri-medal-line","ri-medicine-bottle-fill","ri-medicine-bottle-line","ri-medium-fill","ri-medium-line","ri-men-fill","ri-men-line","ri-mental-health-fill","ri-mental-health-line","ri-menu-2-fill","ri-menu-2-line","ri-menu-3-fill","ri-menu-3-line","ri-menu-4-fill","ri-menu-4-line","ri-menu-5-fill","ri-menu-5-line","ri-menu-add-fill","ri-menu-add-line","ri-menu-fill","ri-menu-fold-fill","ri-menu-fold-line","ri-menu-line","ri-menu-unfold-fill","ri-menu-unfold-line","ri-merge-cells-horizontal","ri-merge-cells-vertical","ri-message-2-fill","ri-message-2-line","ri-message-3-fill","ri-message-3-line","ri-message-fill","ri-message-line","ri-messenger-fill","ri-messenger-line","ri-meteor-fill","ri-meteor-line","ri-mic-2-fill","ri-mic-2-line","ri-mic-fill","ri-mic-line","ri-mic-off-fill","ri-mic-off-line","ri-mickey-fill","ri-mickey-line","ri-microscope-fill","ri-microscope-line","ri-microsoft-fill","ri-microsoft-line","ri-mind-map","ri-mini-program-fill","ri-mini-program-line","ri-mist-fill","ri-mist-line","ri-money-cny-box-fill","ri-money-cny-box-line","ri-money-cny-circle-fill","ri-money-cny-circle-line","ri-money-dollar-box-fill","ri-money-dollar-box-line","ri-money-dollar-circle-fill","ri-money-dollar-circle-line","ri-money-euro-box-fill","ri-money-euro-box-line","ri-money-euro-circle-fill","ri-money-euro-circle-line","ri-money-pound-box-fill","ri-money-pound-box-line","ri-money-pound-circle-fill","ri-money-pound-circle-line","ri-moon-clear-fill","ri-moon-clear-line","ri-moon-cloudy-fill","ri-moon-cloudy-line","ri-moon-fill","ri-moon-foggy-fill","ri-moon-foggy-line","ri-moon-line","ri-more-2-fill","ri-more-2-line","ri-more-fill","ri-more-line","ri-motorbike-fill","ri-motorbike-line","ri-mouse-fill","ri-mouse-line","ri-movie-2-fill","ri-movie-2-line","ri-movie-fill","ri-movie-line","ri-music-2-fill","ri-music-2-line","ri-music-fill","ri-music-line","ri-mv-fill","ri-mv-line","ri-navigation-fill","ri-navigation-line","ri-netease-cloud-music-fill","ri-netease-cloud-music-line","ri-netflix-fill","ri-netflix-line","ri-newspaper-fill","ri-newspaper-line","ri-node-tree","ri-notification-2-fill","ri-notification-2-line","ri-notification-3-fill","ri-notification-3-line","ri-notification-4-fill","ri-notification-4-line","ri-notification-badge-fill","ri-notification-badge-line","ri-notification-fill","ri-notification-line","ri-notification-off-fill","ri-notification-off-line","ri-npmjs-fill","ri-npmjs-line","ri-number-0","ri-number-1","ri-number-2","ri-number-3","ri-number-4","ri-number-5","ri-number-6","ri-number-7","ri-number-8","ri-number-9","ri-numbers-fill","ri-numbers-line","ri-nurse-fill","ri-nurse-line","ri-oil-fill","ri-oil-line","ri-omega","ri-open-arm-fill","ri-open-arm-line","ri-open-source-fill","ri-open-source-line","ri-opera-fill","ri-opera-line","ri-order-play-fill","ri-order-play-line","ri-organization-chart","ri-outlet-2-fill","ri-outlet-2-line","ri-outlet-fill","ri-outlet-line","ri-page-separator","ri-pages-fill","ri-pages-line","ri-paint-brush-fill","ri-paint-brush-line","ri-paint-fill","ri-paint-line","ri-palette-fill","ri-palette-line","ri-pantone-fill","ri-pantone-line","ri-paragraph","ri-parent-fill","ri-parent-line","ri-parentheses-fill","ri-parentheses-line","ri-parking-box-fill","ri-parking-box-line","ri-parking-fill","ri-parking-line","ri-passport-fill","ri-passport-line","ri-patreon-fill","ri-patreon-line","ri-pause-circle-fill","ri-pause-circle-line","ri-pause-fill","ri-pause-line","ri-pause-mini-fill","ri-pause-mini-line","ri-paypal-fill","ri-paypal-line","ri-pen-nib-fill","ri-pen-nib-line","ri-pencil-fill","ri-pencil-line","ri-pencil-ruler-2-fill","ri-pencil-ruler-2-line","ri-pencil-ruler-fill","ri-pencil-ruler-line","ri-percent-fill","ri-percent-line","ri-phone-camera-fill","ri-phone-camera-line","ri-phone-fill","ri-phone-find-fill","ri-phone-find-line","ri-phone-line","ri-phone-lock-fill","ri-phone-lock-line","ri-picture-in-picture-2-fill","ri-picture-in-picture-2-line","ri-picture-in-picture-exit-fill","ri-picture-in-picture-exit-line","ri-picture-in-picture-fill","ri-picture-in-picture-line","ri-pie-chart-2-fill","ri-pie-chart-2-line","ri-pie-chart-box-fill","ri-pie-chart-box-line","ri-pie-chart-fill","ri-pie-chart-line","ri-pin-distance-fill","ri-pin-distance-line","ri-ping-pong-fill","ri-ping-pong-line","ri-pinterest-fill","ri-pinterest-line","ri-pinyin-input","ri-pixelfed-fill","ri-pixelfed-line","ri-plane-fill","ri-plane-line","ri-plant-fill","ri-plant-line","ri-play-circle-fill","ri-play-circle-line","ri-play-fill","ri-play-line","ri-play-list-2-fill","ri-play-list-2-line","ri-play-list-add-fill","ri-play-list-add-line","ri-play-list-fill","ri-play-list-line","ri-play-mini-fill","ri-play-mini-line","ri-playstation-fill","ri-playstation-line","ri-plug-2-fill","ri-plug-2-line","ri-plug-fill","ri-plug-line","ri-polaroid-2-fill","ri-polaroid-2-line","ri-polaroid-fill","ri-polaroid-line","ri-police-car-fill","ri-police-car-line","ri-price-tag-2-fill","ri-price-tag-2-line","ri-price-tag-3-fill","ri-price-tag-3-line","ri-price-tag-fill","ri-price-tag-line","ri-printer-cloud-fill","ri-printer-cloud-line","ri-printer-fill","ri-printer-line","ri-product-hunt-fill","ri-product-hunt-line","ri-profile-fill","ri-profile-line","ri-projector-2-fill","ri-projector-2-line","ri-projector-fill","ri-projector-line","ri-psychotherapy-fill","ri-psychotherapy-line","ri-pulse-fill","ri-pulse-line","ri-pushpin-2-fill","ri-pushpin-2-line","ri-pushpin-fill","ri-pushpin-line","ri-qq-fill","ri-qq-line","ri-qr-code-fill","ri-qr-code-line","ri-qr-scan-2-fill","ri-qr-scan-2-line","ri-qr-scan-fill","ri-qr-scan-line","ri-question-answer-fill","ri-question-answer-line","ri-question-fill","ri-question-line","ri-question-mark","ri-questionnaire-fill","ri-questionnaire-line","ri-quill-pen-fill","ri-quill-pen-line","ri-radar-fill","ri-radar-line","ri-radio-2-fill","ri-radio-2-line","ri-radio-button-fill","ri-radio-button-line","ri-radio-fill","ri-radio-line","ri-rainbow-fill","ri-rainbow-line","ri-rainy-fill","ri-rainy-line","ri-reactjs-fill","ri-reactjs-line","ri-record-circle-fill","ri-record-circle-line","ri-record-mail-fill","ri-record-mail-line","ri-recycle-fill","ri-recycle-line","ri-red-packet-fill","ri-red-packet-line","ri-reddit-fill","ri-reddit-line","ri-refresh-fill","ri-refresh-line","ri-refund-2-fill","ri-refund-2-line","ri-refund-fill","ri-refund-line","ri-registered-fill","ri-registered-line","ri-remixicon-fill","ri-remixicon-line","ri-remote-control-2-fill","ri-remote-control-2-line","ri-remote-control-fill","ri-remote-control-line","ri-repeat-2-fill","ri-repeat-2-line","ri-repeat-fill","ri-repeat-line","ri-repeat-one-fill","ri-repeat-one-line","ri-reply-all-fill","ri-reply-all-line","ri-reply-fill","ri-reply-line","ri-reserved-fill","ri-reserved-line","ri-rest-time-fill","ri-rest-time-line","ri-restart-fill","ri-restart-line","ri-restaurant-2-fill","ri-restaurant-2-line","ri-restaurant-fill","ri-restaurant-line","ri-rewind-fill","ri-rewind-line","ri-rewind-mini-fill","ri-rewind-mini-line","ri-rhythm-fill","ri-rhythm-line","ri-riding-fill","ri-riding-line","ri-road-map-fill","ri-road-map-line","ri-roadster-fill","ri-roadster-line","ri-robot-fill","ri-robot-line","ri-rocket-2-fill","ri-rocket-2-line","ri-rocket-fill","ri-rocket-line","ri-rotate-lock-fill","ri-rotate-lock-line","ri-rounded-corner","ri-route-fill","ri-route-line","ri-router-fill","ri-router-line","ri-rss-fill","ri-rss-line","ri-ruler-2-fill","ri-ruler-2-line","ri-ruler-fill","ri-ruler-line","ri-run-fill","ri-run-line","ri-safari-fill","ri-safari-line","ri-safe-2-fill","ri-safe-2-line","ri-safe-fill","ri-safe-line","ri-sailboat-fill","ri-sailboat-line","ri-save-2-fill","ri-save-2-line","ri-save-3-fill","ri-save-3-line","ri-save-fill","ri-save-line","ri-scales-2-fill","ri-scales-2-line","ri-scales-3-fill","ri-scales-3-line","ri-scales-fill","ri-scales-line","ri-scan-2-fill","ri-scan-2-line","ri-scan-fill","ri-scan-line","ri-scissors-2-fill","ri-scissors-2-line","ri-scissors-cut-fill","ri-scissors-cut-line","ri-scissors-fill","ri-scissors-line","ri-screenshot-2-fill","ri-screenshot-2-line","ri-screenshot-fill","ri-screenshot-line","ri-sd-card-fill","ri-sd-card-line","ri-sd-card-mini-fill","ri-sd-card-mini-line","ri-search-2-fill","ri-search-2-line","ri-search-eye-fill","ri-search-eye-line","ri-search-fill","ri-search-line","ri-secure-payment-fill","ri-secure-payment-line","ri-seedling-fill","ri-seedling-line","ri-send-backward","ri-send-plane-2-fill","ri-send-plane-2-line","ri-send-plane-fill","ri-send-plane-line","ri-send-to-back","ri-sensor-fill","ri-sensor-line","ri-separator","ri-server-fill","ri-server-line","ri-service-fill","ri-service-line","ri-settings-2-fill","ri-settings-2-line","ri-settings-3-fill","ri-settings-3-line","ri-settings-4-fill","ri-settings-4-line","ri-settings-5-fill","ri-settings-5-line","ri-settings-6-fill","ri-settings-6-line","ri-settings-fill","ri-settings-line","ri-shape-2-fill","ri-shape-2-line","ri-shape-fill","ri-shape-line","ri-share-box-fill","ri-share-box-line","ri-share-circle-fill","ri-share-circle-line","ri-share-fill","ri-share-forward-2-fill","ri-share-forward-2-line","ri-share-forward-box-fill","ri-share-forward-box-line","ri-share-forward-fill","ri-share-forward-line","ri-share-line","ri-shield-check-fill","ri-shield-check-line","ri-shield-cross-fill","ri-shield-cross-line","ri-shield-fill","ri-shield-flash-fill","ri-shield-flash-line","ri-shield-keyhole-fill","ri-shield-keyhole-line","ri-shield-line","ri-shield-star-fill","ri-shield-star-line","ri-shield-user-fill","ri-shield-user-line","ri-ship-2-fill","ri-ship-2-line","ri-ship-fill","ri-ship-line","ri-shirt-fill","ri-shirt-line","ri-shopping-bag-2-fill","ri-shopping-bag-2-line","ri-shopping-bag-3-fill","ri-shopping-bag-3-line","ri-shopping-bag-fill","ri-shopping-bag-line","ri-shopping-basket-2-fill","ri-shopping-basket-2-line","ri-shopping-basket-fill","ri-shopping-basket-line","ri-shopping-cart-2-fill","ri-shopping-cart-2-line","ri-shopping-cart-fill","ri-shopping-cart-line","ri-showers-fill","ri-showers-line","ri-shuffle-fill","ri-shuffle-line","ri-shut-down-fill","ri-shut-down-line","ri-side-bar-fill","ri-side-bar-line","ri-signal-tower-fill","ri-signal-tower-line","ri-signal-wifi-1-fill","ri-signal-wifi-1-line","ri-signal-wifi-2-fill","ri-signal-wifi-2-line","ri-signal-wifi-3-fill","ri-signal-wifi-3-line","ri-signal-wifi-error-fill","ri-signal-wifi-error-line","ri-signal-wifi-fill","ri-signal-wifi-line","ri-signal-wifi-off-fill","ri-signal-wifi-off-line","ri-sim-card-2-fill","ri-sim-card-2-line","ri-sim-card-fill","ri-sim-card-line","ri-single-quotes-l","ri-single-quotes-r","ri-sip-fill","ri-sip-line","ri-skip-back-fill","ri-skip-back-line","ri-skip-back-mini-fill","ri-skip-back-mini-line","ri-skip-forward-fill","ri-skip-forward-line","ri-skip-forward-mini-fill","ri-skip-forward-mini-line","ri-skull-2-fill","ri-skull-2-line","ri-skull-fill","ri-skull-line","ri-skype-fill","ri-skype-line","ri-slack-fill","ri-slack-line","ri-slice-fill","ri-slice-line","ri-slideshow-2-fill","ri-slideshow-2-line","ri-slideshow-3-fill","ri-slideshow-3-line","ri-slideshow-4-fill","ri-slideshow-4-line","ri-slideshow-fill","ri-slideshow-line","ri-smartphone-fill","ri-smartphone-line","ri-snapchat-fill","ri-snapchat-line","ri-snowy-fill","ri-snowy-line","ri-sort-asc","ri-sort-desc","ri-sound-module-fill","ri-sound-module-line","ri-soundcloud-fill","ri-soundcloud-line","ri-space-ship-fill","ri-space-ship-line","ri-space","ri-spam-2-fill","ri-spam-2-line","ri-spam-3-fill","ri-spam-3-line","ri-spam-fill","ri-spam-line","ri-speaker-2-fill","ri-speaker-2-line","ri-speaker-3-fill","ri-speaker-3-line","ri-speaker-fill","ri-speaker-line","ri-spectrum-fill","ri-spectrum-line","ri-speed-fill","ri-speed-line","ri-speed-mini-fill","ri-speed-mini-line","ri-split-cells-horizontal","ri-split-cells-vertical","ri-spotify-fill","ri-spotify-line","ri-spy-fill","ri-spy-line","ri-stack-fill","ri-stack-line","ri-stack-overflow-fill","ri-stack-overflow-line","ri-stackshare-fill","ri-stackshare-line","ri-star-fill","ri-star-half-fill","ri-star-half-line","ri-star-half-s-fill","ri-star-half-s-line","ri-star-line","ri-star-s-fill","ri-star-s-line","ri-star-smile-fill","ri-star-smile-line","ri-steam-fill","ri-steam-line","ri-steering-2-fill","ri-steering-2-line","ri-steering-fill","ri-steering-line","ri-stethoscope-fill","ri-stethoscope-line","ri-sticky-note-2-fill","ri-sticky-note-2-line","ri-sticky-note-fill","ri-sticky-note-line","ri-stock-fill","ri-stock-line","ri-stop-circle-fill","ri-stop-circle-line","ri-stop-fill","ri-stop-line","ri-stop-mini-fill","ri-stop-mini-line","ri-store-2-fill","ri-store-2-line","ri-store-3-fill","ri-store-3-line","ri-store-fill","ri-store-line","ri-strikethrough-2","ri-strikethrough","ri-subscript-2","ri-subscript","ri-subtract-fill","ri-subtract-line","ri-subway-fill","ri-subway-line","ri-subway-wifi-fill","ri-subway-wifi-line","ri-suitcase-2-fill","ri-suitcase-2-line","ri-suitcase-3-fill","ri-suitcase-3-line","ri-suitcase-fill","ri-suitcase-line","ri-sun-cloudy-fill","ri-sun-cloudy-line","ri-sun-fill","ri-sun-foggy-fill","ri-sun-foggy-line","ri-sun-line","ri-superscript-2","ri-superscript","ri-surgical-mask-fill","ri-surgical-mask-line","ri-surround-sound-fill","ri-surround-sound-line","ri-survey-fill","ri-survey-line","ri-swap-box-fill","ri-swap-box-line","ri-swap-fill","ri-swap-line","ri-switch-fill","ri-switch-line","ri-sword-fill","ri-sword-line","ri-syringe-fill","ri-syringe-line","ri-t-box-fill","ri-t-box-line","ri-t-shirt-2-fill","ri-t-shirt-2-line","ri-t-shirt-air-fill","ri-t-shirt-air-line","ri-t-shirt-fill","ri-t-shirt-line","ri-table-2","ri-table-alt-fill","ri-table-alt-line","ri-table-fill","ri-table-line","ri-tablet-fill","ri-tablet-line","ri-takeaway-fill","ri-takeaway-line","ri-taobao-fill","ri-taobao-line","ri-tape-fill","ri-tape-line","ri-task-fill","ri-task-line","ri-taxi-fill","ri-taxi-line","ri-taxi-wifi-fill","ri-taxi-wifi-line","ri-team-fill","ri-team-line","ri-telegram-fill","ri-telegram-line","ri-temp-cold-fill","ri-temp-cold-line","ri-temp-hot-fill","ri-temp-hot-line","ri-terminal-box-fill","ri-terminal-box-line","ri-terminal-fill","ri-terminal-line","ri-terminal-window-fill","ri-terminal-window-line","ri-test-tube-fill","ri-test-tube-line","ri-text-direction-l","ri-text-direction-r","ri-text-spacing","ri-text-wrap","ri-text","ri-thermometer-fill","ri-thermometer-line","ri-thumb-down-fill","ri-thumb-down-line","ri-thumb-up-fill","ri-thumb-up-line","ri-thunderstorms-fill","ri-thunderstorms-line","ri-ticket-2-fill","ri-ticket-2-line","ri-ticket-fill","ri-ticket-line","ri-time-fill","ri-time-line","ri-timer-2-fill","ri-timer-2-line","ri-timer-fill","ri-timer-flash-fill","ri-timer-flash-line","ri-timer-line","ri-todo-fill","ri-todo-line","ri-toggle-fill","ri-toggle-line","ri-tools-fill","ri-tools-line","ri-tornado-fill","ri-tornado-line","ri-trademark-fill","ri-trademark-line","ri-traffic-light-fill","ri-traffic-light-line","ri-train-fill","ri-train-line","ri-train-wifi-fill","ri-train-wifi-line","ri-translate-2","ri-translate","ri-travesti-fill","ri-travesti-line","ri-treasure-map-fill","ri-treasure-map-line","ri-trello-fill","ri-trello-line","ri-trophy-fill","ri-trophy-line","ri-truck-fill","ri-truck-line","ri-tumblr-fill","ri-tumblr-line","ri-tv-2-fill","ri-tv-2-line","ri-tv-fill","ri-tv-line","ri-twitch-fill","ri-twitch-line","ri-twitter-fill","ri-twitter-line","ri-typhoon-fill","ri-typhoon-line","ri-u-disk-fill","ri-u-disk-line","ri-ubuntu-fill","ri-ubuntu-line","ri-umbrella-fill","ri-umbrella-line","ri-underline","ri-uninstall-fill","ri-uninstall-line","ri-unsplash-fill","ri-unsplash-line","ri-upload-2-fill","ri-upload-2-line","ri-upload-cloud-2-fill","ri-upload-cloud-2-line","ri-upload-cloud-fill","ri-upload-cloud-line","ri-upload-fill","ri-upload-line","ri-usb-fill","ri-usb-line","ri-user-2-fill","ri-user-2-line","ri-user-3-fill","ri-user-3-line","ri-user-4-fill","ri-user-4-line","ri-user-5-fill","ri-user-5-line","ri-user-6-fill","ri-user-6-line","ri-user-add-fill","ri-user-add-line","ri-user-fill","ri-user-follow-fill","ri-user-follow-line","ri-user-heart-fill","ri-user-heart-line","ri-user-line","ri-user-location-fill","ri-user-location-line","ri-user-received-2-fill","ri-user-received-2-line","ri-user-received-fill","ri-user-received-line","ri-user-search-fill","ri-user-search-line","ri-user-settings-fill","ri-user-settings-line","ri-user-shared-2-fill","ri-user-shared-2-line","ri-user-shared-fill","ri-user-shared-line","ri-user-smile-fill","ri-user-smile-line","ri-user-star-fill","ri-user-star-line","ri-user-unfollow-fill","ri-user-unfollow-line","ri-user-voice-fill","ri-user-voice-line","ri-video-add-fill","ri-video-add-line","ri-video-chat-fill","ri-video-chat-line","ri-video-download-fill","ri-video-download-line","ri-video-fill","ri-video-line","ri-video-upload-fill","ri-video-upload-line","ri-vidicon-2-fill","ri-vidicon-2-line","ri-vidicon-fill","ri-vidicon-line","ri-vimeo-fill","ri-vimeo-line","ri-vip-crown-2-fill","ri-vip-crown-2-line","ri-vip-crown-fill","ri-vip-crown-line","ri-vip-diamond-fill","ri-vip-diamond-line","ri-vip-fill","ri-vip-line","ri-virus-fill","ri-virus-line","ri-visa-fill","ri-visa-line","ri-voice-recognition-fill","ri-voice-recognition-line","ri-voiceprint-fill","ri-voiceprint-line","ri-volume-down-fill","ri-volume-down-line","ri-volume-mute-fill","ri-volume-mute-line","ri-volume-off-vibrate-fill","ri-volume-off-vibrate-line","ri-volume-up-fill","ri-volume-up-line","ri-volume-vibrate-fill","ri-volume-vibrate-line","ri-vuejs-fill","ri-vuejs-line","ri-walk-fill","ri-walk-line","ri-wallet-2-fill","ri-wallet-2-line","ri-wallet-3-fill","ri-wallet-3-line","ri-wallet-fill","ri-wallet-line","ri-water-flash-fill","ri-water-flash-line","ri-webcam-fill","ri-webcam-line","ri-wechat-2-fill","ri-wechat-2-line","ri-wechat-fill","ri-wechat-line","ri-wechat-pay-fill","ri-wechat-pay-line","ri-weibo-fill","ri-weibo-line","ri-whatsapp-fill","ri-whatsapp-line","ri-wheelchair-fill","ri-wheelchair-line","ri-wifi-fill","ri-wifi-line","ri-wifi-off-fill","ri-wifi-off-line","ri-window-2-fill","ri-window-2-line","ri-window-fill","ri-window-line","ri-windows-fill","ri-windows-line","ri-windy-fill","ri-windy-line","ri-wireless-charging-fill","ri-wireless-charging-line","ri-women-fill","ri-women-line","ri-wubi-input","ri-xbox-fill","ri-xbox-line","ri-xing-fill","ri-xing-line","ri-youtube-fill","ri-youtube-line","ri-zcool-fill","ri-zcool-line","ri-zhihu-fill","ri-zhihu-line","ri-zoom-in-fill","ri-zoom-in-line","ri-zoom-out-fill","ri-zoom-out-line","ri-zzz-fill","ri-zzz-line","ri-arrow-down-double-fill","ri-arrow-down-double-line","ri-arrow-left-double-fill","ri-arrow-left-double-line","ri-arrow-right-double-fill","ri-arrow-right-double-line","ri-arrow-turn-back-fill","ri-arrow-turn-back-line","ri-arrow-turn-forward-fill","ri-arrow-turn-forward-line","ri-arrow-up-double-fill","ri-arrow-up-double-line","ri-bard-fill","ri-bard-line","ri-bootstrap-fill","ri-bootstrap-line","ri-box-1-fill","ri-box-1-line","ri-box-2-fill","ri-box-2-line","ri-box-3-fill","ri-box-3-line","ri-brain-fill","ri-brain-line","ri-candle-fill","ri-candle-line","ri-cash-fill","ri-cash-line","ri-contract-left-fill","ri-contract-left-line","ri-contract-left-right-fill","ri-contract-left-right-line","ri-contract-right-fill","ri-contract-right-line","ri-contract-up-down-fill","ri-contract-up-down-line","ri-copilot-fill","ri-copilot-line","ri-corner-down-left-fill","ri-corner-down-left-line","ri-corner-down-right-fill","ri-corner-down-right-line","ri-corner-left-down-fill","ri-corner-left-down-line","ri-corner-left-up-fill","ri-corner-left-up-line","ri-corner-right-down-fill","ri-corner-right-down-line","ri-corner-right-up-fill","ri-corner-right-up-line","ri-corner-up-left-double-fill","ri-corner-up-left-double-line","ri-corner-up-left-fill","ri-corner-up-left-line","ri-corner-up-right-double-fill","ri-corner-up-right-double-line","ri-corner-up-right-fill","ri-corner-up-right-line","ri-cross-fill","ri-cross-line","ri-edge-new-fill","ri-edge-new-line","ri-equal-fill","ri-equal-line","ri-expand-left-fill","ri-expand-left-line","ri-expand-left-right-fill","ri-expand-left-right-line","ri-expand-right-fill","ri-expand-right-line","ri-expand-up-down-fill","ri-expand-up-down-line","ri-flickr-fill","ri-flickr-line","ri-forward-10-fill","ri-forward-10-line","ri-forward-15-fill","ri-forward-15-line","ri-forward-30-fill","ri-forward-30-line","ri-forward-5-fill","ri-forward-5-line","ri-graduation-cap-fill","ri-graduation-cap-line","ri-home-office-fill","ri-home-office-line","ri-hourglass-2-fill","ri-hourglass-2-line","ri-hourglass-fill","ri-hourglass-line","ri-javascript-fill","ri-javascript-line","ri-loop-left-fill","ri-loop-left-line","ri-loop-right-fill","ri-loop-right-line","ri-memories-fill","ri-memories-line","ri-meta-fill","ri-meta-line","ri-microsoft-loop-fill","ri-microsoft-loop-line","ri-nft-fill","ri-nft-line","ri-notion-fill","ri-notion-line","ri-openai-fill","ri-openai-line","ri-overline","ri-p2p-fill","ri-p2p-line","ri-presentation-fill","ri-presentation-line","ri-replay-10-fill","ri-replay-10-line","ri-replay-15-fill","ri-replay-15-line","ri-replay-30-fill","ri-replay-30-line","ri-replay-5-fill","ri-replay-5-line","ri-school-fill","ri-school-line","ri-shining-2-fill","ri-shining-2-line","ri-shining-fill","ri-shining-line","ri-sketching","ri-skip-down-fill","ri-skip-down-line","ri-skip-left-fill","ri-skip-left-line","ri-skip-right-fill","ri-skip-right-line","ri-skip-up-fill","ri-skip-up-line","ri-slow-down-fill","ri-slow-down-line","ri-sparkling-2-fill","ri-sparkling-2-line","ri-sparkling-fill","ri-sparkling-line","ri-speak-fill","ri-speak-line","ri-speed-up-fill","ri-speed-up-line","ri-tiktok-fill","ri-tiktok-line","ri-token-swap-fill","ri-token-swap-line","ri-unpin-fill","ri-unpin-line","ri-wechat-channels-fill","ri-wechat-channels-line","ri-wordpress-fill","ri-wordpress-line","ri-blender-fill","ri-blender-line","ri-emoji-sticker-fill","ri-emoji-sticker-line","ri-git-close-pull-request-fill","ri-git-close-pull-request-line","ri-instance-fill","ri-instance-line","ri-megaphone-fill","ri-megaphone-line","ri-pass-expired-fill","ri-pass-expired-line","ri-pass-pending-fill","ri-pass-pending-line","ri-pass-valid-fill","ri-pass-valid-line","ri-ai-generate","ri-calendar-close-fill","ri-calendar-close-line","ri-draggable","ri-font-family","ri-font-mono","ri-font-sans-serif","ri-hard-drive-3-fill","ri-hard-drive-3-line","ri-kick-fill","ri-kick-line","ri-list-check-3","ri-list-indefinite","ri-list-ordered-2","ri-list-radio","ri-openbase-fill","ri-openbase-line","ri-planet-fill","ri-planet-line","ri-prohibited-fill","ri-prohibited-line","ri-quote-text","ri-seo-fill","ri-seo-line","ri-slash-commands","ri-archive-2-fill","ri-archive-2-line","ri-inbox-2-fill","ri-inbox-2-line","ri-shake-hands-fill","ri-shake-hands-line","ri-supabase-fill","ri-supabase-line","ri-water-percent-fill","ri-water-percent-line","ri-yuque-fill","ri-yuque-line","ri-crosshair-2-fill","ri-crosshair-2-line","ri-crosshair-fill","ri-crosshair-line","ri-file-close-fill","ri-file-close-line","ri-infinity-fill","ri-infinity-line","ri-rfid-fill","ri-rfid-line","ri-slash-commands-2","ri-user-forbid-fill","ri-user-forbid-line","ri-beer-fill","ri-beer-line","ri-circle-fill","ri-circle-line","ri-dropdown-list","ri-file-image-fill","ri-file-image-line","ri-file-pdf-2-fill","ri-file-pdf-2-line","ri-file-video-fill","ri-file-video-line","ri-folder-image-fill","ri-folder-image-line","ri-folder-video-fill","ri-folder-video-line","ri-hexagon-fill","ri-hexagon-line","ri-menu-search-fill","ri-menu-search-line","ri-octagon-fill","ri-octagon-line","ri-pentagon-fill","ri-pentagon-line","ri-rectangle-fill","ri-rectangle-line","ri-robot-2-fill","ri-robot-2-line","ri-shapes-fill","ri-shapes-line","ri-square-fill","ri-square-line","ri-tent-fill","ri-tent-line","ri-threads-fill","ri-threads-line","ri-tree-fill","ri-tree-line","ri-triangle-fill","ri-triangle-line","ri-twitter-x-fill","ri-twitter-x-line","ri-verified-badge-fill","ri-verified-badge-line","ri-armchair-fill","ri-armchair-line","ri-bnb-fill","ri-bnb-line","ri-bread-fill","ri-bread-line","ri-btc-fill","ri-btc-line","ri-calendar-schedule-fill","ri-calendar-schedule-line","ri-dice-1-fill","ri-dice-1-line","ri-dice-2-fill","ri-dice-2-line","ri-dice-3-fill","ri-dice-3-line","ri-dice-4-fill","ri-dice-4-line","ri-dice-5-fill","ri-dice-5-line","ri-dice-6-fill","ri-dice-6-line","ri-dice-fill","ri-dice-line","ri-drinks-fill","ri-drinks-line","ri-equalizer-2-fill","ri-equalizer-2-line","ri-equalizer-3-fill","ri-equalizer-3-line","ri-eth-fill","ri-eth-line","ri-flower-fill","ri-flower-line","ri-glasses-2-fill","ri-glasses-2-line","ri-glasses-fill","ri-glasses-line","ri-goggles-fill","ri-goggles-line","ri-image-circle-fill","ri-image-circle-line","ri-info-i","ri-money-rupee-circle-fill","ri-money-rupee-circle-line","ri-news-fill","ri-news-line","ri-robot-3-fill","ri-robot-3-line","ri-share-2-fill","ri-share-2-line","ri-sofa-fill","ri-sofa-line","ri-svelte-fill","ri-svelte-line","ri-vk-fill","ri-vk-line","ri-xrp-fill","ri-xrp-line","ri-xtz-fill","ri-xtz-line","ri-archive-stack-fill","ri-archive-stack-line","ri-bowl-fill","ri-bowl-line","ri-calendar-view","ri-carousel-view","ri-code-block","ri-color-filter-fill","ri-color-filter-line","ri-contacts-book-3-fill","ri-contacts-book-3-line","ri-contract-fill","ri-contract-line","ri-drinks-2-fill","ri-drinks-2-line","ri-export-fill","ri-export-line","ri-file-check-fill","ri-file-check-line","ri-focus-mode","ri-folder-6-fill","ri-folder-6-line","ri-folder-check-fill","ri-folder-check-line","ri-folder-close-fill","ri-folder-close-line","ri-folder-cloud-fill","ri-folder-cloud-line","ri-gallery-view-2","ri-gallery-view","ri-hand","ri-import-fill","ri-import-line","ri-information-2-fill","ri-information-2-line","ri-kanban-view-2","ri-kanban-view","ri-list-view","ri-lock-star-fill","ri-lock-star-line","ri-puzzle-2-fill","ri-puzzle-2-line","ri-puzzle-fill","ri-puzzle-line","ri-ram-2-fill","ri-ram-2-line","ri-ram-fill","ri-ram-line","ri-receipt-fill","ri-receipt-line","ri-shadow-fill","ri-shadow-line","ri-sidebar-fold-fill","ri-sidebar-fold-line","ri-sidebar-unfold-fill","ri-sidebar-unfold-line","ri-slideshow-view","ri-sort-alphabet-asc","ri-sort-alphabet-desc","ri-sort-number-asc","ri-sort-number-desc","ri-stacked-view","ri-sticky-note-add-fill","ri-sticky-note-add-line","ri-swap-2-fill","ri-swap-2-line","ri-swap-3-fill","ri-swap-3-line","ri-table-3","ri-table-view","ri-text-block","ri-text-snippet","ri-timeline-view","ri-blogger-fill","ri-blogger-line","ri-chat-thread-fill","ri-chat-thread-line","ri-discount-percent-fill","ri-discount-percent-line","ri-exchange-2-fill","ri-exchange-2-line","ri-git-fork-fill","ri-git-fork-line","ri-input-field","ri-progress-1-fill","ri-progress-1-line","ri-progress-2-fill","ri-progress-2-line","ri-progress-3-fill","ri-progress-3-line","ri-progress-4-fill","ri-progress-4-line","ri-progress-5-fill","ri-progress-5-line","ri-progress-6-fill","ri-progress-6-line","ri-progress-7-fill","ri-progress-7-line","ri-progress-8-fill","ri-progress-8-line","ri-remix-run-fill","ri-remix-run-line","ri-signpost-fill","ri-signpost-line","ri-time-zone-fill","ri-time-zone-line","ri-arrow-down-wide-fill","ri-arrow-down-wide-line","ri-arrow-left-wide-fill","ri-arrow-left-wide-line","ri-arrow-right-wide-fill","ri-arrow-right-wide-line","ri-arrow-up-wide-fill","ri-arrow-up-wide-line","ri-bluesky-fill","ri-bluesky-line","ri-expand-height-fill","ri-expand-height-line","ri-expand-width-fill","ri-expand-width-line","ri-forward-end-fill","ri-forward-end-line","ri-forward-end-mini-fill","ri-forward-end-mini-line","ri-friendica-fill","ri-friendica-line","ri-git-pr-draft-fill","ri-git-pr-draft-line","ri-play-reverse-fill","ri-play-reverse-line","ri-play-reverse-mini-fill","ri-play-reverse-mini-line","ri-rewind-start-fill","ri-rewind-start-line","ri-rewind-start-mini-fill","ri-rewind-start-mini-line","ri-scroll-to-bottom-fill","ri-scroll-to-bottom-line","ri-add-large-fill","ri-add-large-line","ri-aed-electrodes-fill","ri-aed-electrodes-line","ri-aed-fill","ri-aed-line","ri-alibaba-cloud-fill","ri-alibaba-cloud-line","ri-align-item-bottom-fill","ri-align-item-bottom-line","ri-align-item-horizontal-center-fill","ri-align-item-horizontal-center-line","ri-align-item-left-fill","ri-align-item-left-line","ri-align-item-right-fill","ri-align-item-right-line","ri-align-item-top-fill","ri-align-item-top-line","ri-align-item-vertical-center-fill","ri-align-item-vertical-center-line","ri-apps-2-add-fill","ri-apps-2-add-line","ri-close-large-fill","ri-close-large-line","ri-collapse-diagonal-2-fill","ri-collapse-diagonal-2-line","ri-collapse-diagonal-fill","ri-collapse-diagonal-line","ri-dashboard-horizontal-fill","ri-dashboard-horizontal-line","ri-expand-diagonal-2-fill","ri-expand-diagonal-2-line","ri-expand-diagonal-fill","ri-expand-diagonal-line","ri-firebase-fill","ri-firebase-line","ri-flip-horizontal-2-fill","ri-flip-horizontal-2-line","ri-flip-horizontal-fill","ri-flip-horizontal-line","ri-flip-vertical-2-fill","ri-flip-vertical-2-line","ri-flip-vertical-fill","ri-flip-vertical-line","ri-formula","ri-function-add-fill","ri-function-add-line","ri-goblet-2-fill","ri-goblet-2-line","ri-golf-ball-fill","ri-golf-ball-line","ri-group-3-fill","ri-group-3-line","ri-heart-add-2-fill","ri-heart-add-2-line","ri-id-card-fill","ri-id-card-line","ri-information-off-fill","ri-information-off-line","ri-java-fill","ri-java-line","ri-layout-grid-2-fill","ri-layout-grid-2-line","ri-layout-horizontal-fill","ri-layout-horizontal-line","ri-layout-vertical-fill","ri-layout-vertical-line","ri-menu-fold-2-fill","ri-menu-fold-2-line","ri-menu-fold-3-fill","ri-menu-fold-3-line","ri-menu-fold-4-fill","ri-menu-fold-4-line","ri-menu-unfold-2-fill","ri-menu-unfold-2-line","ri-menu-unfold-3-fill","ri-menu-unfold-3-line","ri-menu-unfold-4-fill","ri-menu-unfold-4-line","ri-mobile-download-fill","ri-mobile-download-line","ri-nextjs-fill","ri-nextjs-line","ri-nodejs-fill","ri-nodejs-line","ri-pause-large-fill","ri-pause-large-line","ri-play-large-fill","ri-play-large-line","ri-play-reverse-large-fill","ri-play-reverse-large-line","ri-police-badge-fill","ri-police-badge-line","ri-prohibited-2-fill","ri-prohibited-2-line","ri-shopping-bag-4-fill","ri-shopping-bag-4-line","ri-snowflake-fill","ri-snowflake-line","ri-square-root","ri-stop-large-fill","ri-stop-large-line","ri-tailwind-css-fill","ri-tailwind-css-line","ri-tooth-fill","ri-tooth-line","ri-video-off-fill","ri-video-off-line","ri-video-on-fill","ri-video-on-line","ri-webhook-fill","ri-webhook-line","ri-weight-fill","ri-weight-line","ri-book-shelf-fill","ri-book-shelf-line","ri-brain-2-fill","ri-brain-2-line","ri-chat-search-fill","ri-chat-search-line","ri-chat-unread-fill","ri-chat-unread-line","ri-collapse-horizontal-fill","ri-collapse-horizontal-line","ri-collapse-vertical-fill","ri-collapse-vertical-line","ri-dna-fill","ri-dna-line","ri-dropper-fill","ri-dropper-line","ri-expand-diagonal-s-2-fill","ri-expand-diagonal-s-2-line","ri-expand-diagonal-s-fill","ri-expand-diagonal-s-line","ri-expand-horizontal-fill","ri-expand-horizontal-line","ri-expand-horizontal-s-fill","ri-expand-horizontal-s-line","ri-expand-vertical-fill","ri-expand-vertical-line","ri-expand-vertical-s-fill","ri-expand-vertical-s-line","ri-gemini-fill","ri-gemini-line","ri-reset-left-fill","ri-reset-left-line","ri-reset-right-fill","ri-reset-right-line","ri-stairs-fill","ri-stairs-line","ri-telegram-2-fill","ri-telegram-2-line","ri-triangular-flag-fill","ri-triangular-flag-line","ri-user-minus-fill","ri-user-minus-line","ri-account-box-2-fill","ri-account-box-2-line","ri-account-circle-2-fill","ri-account-circle-2-line","ri-alarm-snooze-fill","ri-alarm-snooze-line","ri-arrow-down-box-fill","ri-arrow-down-box-line","ri-arrow-left-box-fill","ri-arrow-left-box-line","ri-arrow-left-down-box-fill","ri-arrow-left-down-box-line","ri-arrow-left-up-box-fill","ri-arrow-left-up-box-line","ri-arrow-right-box-fill","ri-arrow-right-box-line","ri-arrow-right-down-box-fill","ri-arrow-right-down-box-line","ri-arrow-right-up-box-fill","ri-arrow-right-up-box-line","ri-arrow-up-box-fill","ri-arrow-up-box-line","ri-bar-chart-box-ai-fill","ri-bar-chart-box-ai-line","ri-brush-ai-fill","ri-brush-ai-line","ri-camera-ai-fill","ri-camera-ai-line","ri-chat-ai-fill","ri-chat-ai-line","ri-chat-smile-ai-fill","ri-chat-smile-ai-line","ri-chat-voice-ai-fill","ri-chat-voice-ai-line","ri-code-ai-fill","ri-code-ai-line","ri-color-filter-ai-fill","ri-color-filter-ai-line","ri-custom-size","ri-fediverse-fill","ri-fediverse-line","ri-flag-off-fill","ri-flag-off-line","ri-home-9-fill","ri-home-9-line","ri-image-ai-fill","ri-image-ai-line","ri-image-circle-ai-fill","ri-image-circle-ai-line","ri-info-card-fill","ri-info-card-line","ri-landscape-ai-fill","ri-landscape-ai-line","ri-letter-spacing-2","ri-line-height-2","ri-mail-ai-fill","ri-mail-ai-line","ri-mic-2-ai-fill","ri-mic-2-ai-line","ri-mic-ai-fill","ri-mic-ai-line","ri-movie-ai-fill","ri-movie-ai-line","ri-music-ai-fill","ri-music-ai-line","ri-notification-snooze-fill","ri-notification-snooze-line","ri-php-fill","ri-php-line","ri-pix-fill","ri-pix-line","ri-pulse-ai-fill","ri-pulse-ai-line","ri-quill-pen-ai-fill","ri-quill-pen-ai-line","ri-speak-ai-fill","ri-speak-ai-line","ri-star-off-fill","ri-star-off-line","ri-translate-ai-2","ri-translate-ai","ri-user-community-fill","ri-user-community-line","ri-vercel-fill","ri-vercel-line","ri-video-ai-fill","ri-video-ai-line","ri-video-on-ai-fill","ri-video-on-ai-line","ri-voice-ai-fill","ri-voice-ai-line","ri-ai-generate-2","ri-ai-generate-text","ri-anthropic-fill","ri-anthropic-line","ri-apps-2-ai-fill","ri-apps-2-ai-line","ri-camera-lens-ai-fill","ri-camera-lens-ai-line","ri-clapperboard-ai-fill","ri-clapperboard-ai-line","ri-claude-fill","ri-claude-line","ri-closed-captioning-ai-fill","ri-closed-captioning-ai-line","ri-dvd-ai-fill","ri-dvd-ai-line","ri-film-ai-fill","ri-film-ai-line","ri-font-size-ai","ri-mixtral-fill","ri-mixtral-line","ri-movie-2-ai-fill","ri-movie-2-ai-line","ri-mv-ai-fill","ri-mv-ai-line","ri-perplexity-fill","ri-perplexity-line","ri-poker-clubs-fill","ri-poker-clubs-line","ri-poker-diamonds-fill","ri-poker-diamonds-line","ri-poker-hearts-fill","ri-poker-hearts-line","ri-poker-spades-fill","ri-poker-spades-line","ri-safe-3-fill","ri-safe-3-line","ri-accessibility-fill","ri-accessibility-line","ri-alarm-add-fill","ri-alarm-add-line","ri-arrow-down-long-fill","ri-arrow-down-long-line","ri-arrow-left-down-long-fill","ri-arrow-left-down-long-line","ri-arrow-left-long-fill","ri-arrow-left-long-line","ri-arrow-left-up-long-fill","ri-arrow-left-up-long-line","ri-arrow-right-down-long-fill","ri-arrow-right-down-long-line","ri-arrow-right-long-fill","ri-arrow-right-long-line","ri-arrow-right-up-long-fill","ri-arrow-right-up-long-line","ri-arrow-up-long-fill","ri-arrow-up-long-line","ri-chess-fill","ri-chess-line","ri-diamond-fill","ri-diamond-line","ri-diamond-ring-fill","ri-diamond-ring-line","ri-figma-fill","ri-figma-line","ri-firefox-browser-fill","ri-firefox-browser-line","ri-jewelry-fill","ri-jewelry-line","ri-multi-image-fill","ri-multi-image-line","ri-no-credit-card-fill","ri-no-credit-card-line","ri-service-bell-fill","ri-service-bell-line","ri-ai-agent-fill","ri-ai-agent-line","ri-ai-generate-2-fill","ri-ai-generate-2-line","ri-ai-generate-3d-fill","ri-ai-generate-3d-line","ri-ai","ri-apps-ai-fill","ri-apps-ai-line","ri-atom-fill","ri-atom-line","ri-book-ai-fill","ri-book-ai-line","ri-brain-3-fill","ri-brain-3-line","ri-brain-ai-3-fill","ri-brain-ai-3-line","ri-brush-ai-3-fill","ri-brush-ai-3-line","ri-camera-4-fill","ri-camera-4-line","ri-camera-ai-2-fill","ri-camera-ai-2-line","ri-chat-ai-2-fill","ri-chat-ai-2-line","ri-chat-ai-3-fill","ri-chat-ai-3-line","ri-chat-ai-4-fill","ri-chat-ai-4-line","ri-chat-smile-ai-3-fill","ri-chat-smile-ai-3-line","ri-deepseek-fill","ri-deepseek-line","ri-file-ai-2-fill","ri-file-ai-2-line","ri-file-ai-fill","ri-file-ai-line","ri-function-ai-fill","ri-function-ai-line","ri-game-2-fill","ri-game-2-line","ri-goblet-broken-fill","ri-goblet-broken-line","ri-lightbulb-ai-fill","ri-lightbulb-ai-line","ri-loop-left-ai-fill","ri-loop-left-ai-line","ri-loop-right-ai-fill","ri-loop-right-ai-line","ri-message-ai-3-fill","ri-message-ai-3-line","ri-painting-ai-fill","ri-painting-ai-line","ri-painting-fill","ri-painting-line","ri-pencil-ai-2-fill","ri-pencil-ai-2-line","ri-pencil-ai-fill","ri-pencil-ai-line","ri-remix-fill","ri-remix-line","ri-search-ai-2-fill","ri-search-ai-2-line","ri-search-ai-3-fill","ri-search-ai-3-line","ri-search-ai-4-fill","ri-search-ai-4-line","ri-search-ai-fill","ri-search-ai-line","ri-speech-to-text-fill","ri-speech-to-text-line","ri-target-fill","ri-target-line","ri-text-to-speech-fill","ri-text-to-speech-line","ri-wrench-fill","ri-wrench-line","ri-area-chart-fill","ri-area-chart-line","ri-baseball-fill","ri-baseball-line","ri-binoculars-fill","ri-binoculars-line","ri-cursor-hand","ri-emotion-add-fill","ri-emotion-add-line","ri-file-scan-fill","ri-file-scan-line","ri-fiverr-fill","ri-fiverr-line","ri-font-serif","ri-ghost-3-fill","ri-ghost-3-line","ri-gitee-fill","ri-gitee-line","ri-global-off-fill","ri-global-off-line","ri-image-download-fill","ri-image-download-line","ri-image-upload-fill","ri-image-upload-line","ri-issues-fill","ri-issues-line","ri-issues-reopen-fill","ri-issues-reopen-line","ri-network-error-fill","ri-network-error-line","ri-network-fill","ri-network-line","ri-network-off-fill","ri-network-off-line","ri-piano-fill","ri-piano-grand-fill","ri-piano-grand-line","ri-piano-line","ri-plug-3-fill","ri-plug-3-line","ri-send-ins-fill","ri-send-ins-line","ri-signal-cellular-1-fill","ri-signal-cellular-1-line","ri-signal-cellular-2-fill","ri-signal-cellular-2-line","ri-signal-cellular-3-fill","ri-signal-cellular-3-line","ri-signal-cellular-off-fill","ri-signal-cellular-off-line","ri-stacked-chart-fill","ri-stacked-chart-line","ri-upwork-fill","ri-upwork-line","ri-brain-4-fill","ri-brain-4-line","ri-certificate-2-fill","ri-certificate-2-line","ri-certificate-fill","ri-certificate-line","ri-cookie-fill","ri-cookie-line","ri-cursor-ai-fill","ri-cursor-ai-line","ri-draw-fill","ri-draw-line","ri-ghost-4-fill","ri-ghost-4-line","ri-gitbook-fill","ri-gitbook-line","ri-grok-ai-fill","ri-grok-ai-line","ri-hand-2","ri-megaphone-2-fill","ri-megaphone-2-line","ri-microsoft-copilot-fill","ri-microsoft-copilot-line","ri-mosaic-fill","ri-mosaic-line","ri-qr-scan-ai-fill","ri-qr-scan-ai-line","ri-qwen-ai-fill","ri-qwen-ai-line","ri-reddit-2-fill","ri-reddit-2-line","ri-sim-card-warning-fill","ri-sim-card-warning-line","ri-space-ship-2-fill","ri-space-ship-2-line","ri-subreddit-fill","ri-subreddit-line","ri-zhipu-ai-fill","ri-zhipu-ai-line","ri-connector-fill","ri-connector-line"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Directive } from 'vue'
|
|
2
|
+
import { useUserStore } from '../stores/user'
|
|
3
|
+
|
|
4
|
+
/** v-perm="'base:user:add'" 或 v-perm="['a','b']"(满足其一) */
|
|
5
|
+
export const vPerm: Directive<HTMLElement, string | string[]> = {
|
|
6
|
+
mounted(el, binding) {
|
|
7
|
+
apply(el, binding.value)
|
|
8
|
+
},
|
|
9
|
+
updated(el, binding) {
|
|
10
|
+
apply(el, binding.value)
|
|
11
|
+
},
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function apply(el: HTMLElement, value: string | string[]) {
|
|
15
|
+
const user = useUserStore()
|
|
16
|
+
const ok = user.hasPerm(value)
|
|
17
|
+
el.style.display = ok ? '' : 'none'
|
|
18
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
|
2
|
+
/// <reference path="../../../../admin/typings/auto-imports.d.ts" />
|
|
3
|
+
/// <reference path="../../../../admin/typings/global.d.ts" />
|
|
4
|
+
/// <reference path="../../../../admin/typings/components.d.ts" />
|
|
5
|
+
/// <reference path="../../../typings/admin/host.d.ts" />
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useEventListener } from '@vueuse/core'
|
|
2
|
+
import { reactive, watch } from 'vue'
|
|
3
|
+
import { getBrowser } from '../lib/browser'
|
|
4
|
+
const browser = reactive(getBrowser()) as BrowserInfo
|
|
5
|
+
const events: Array<() => void> = []
|
|
6
|
+
|
|
7
|
+
watch(
|
|
8
|
+
() => browser.screen,
|
|
9
|
+
() => {
|
|
10
|
+
events.forEach((ev) => ev())
|
|
11
|
+
},
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
useEventListener(window, 'resize', () => {
|
|
15
|
+
Object.assign(browser, getBrowser())
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
/** 响应式浏览器信息 + 断点变化回调 */
|
|
19
|
+
export function useBrowser() {
|
|
20
|
+
return {
|
|
21
|
+
browser,
|
|
22
|
+
onScreenChange(ev: () => void, immediate = true) {
|
|
23
|
+
events.push(ev)
|
|
24
|
+
if (immediate) ev()
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { toast } from 'vue-sonner'
|
|
2
|
+
import { request } from '../api/client'
|
|
3
|
+
import { extname, filename, pathJoin, uploadUid } from '../lib/upload'
|
|
4
|
+
import type { UploadOptions, UploadResult } from '../../../typings/admin/comm/upload'
|
|
5
|
+
|
|
6
|
+
const UPLOAD_PATH = '/admin/base/comm/upload'
|
|
7
|
+
|
|
8
|
+
type SignPayload = Record<string, unknown>
|
|
9
|
+
|
|
10
|
+
const SIGN_SKIP = new Set([
|
|
11
|
+
'url',
|
|
12
|
+
'host',
|
|
13
|
+
'uploadUrl',
|
|
14
|
+
'publicDomain',
|
|
15
|
+
'previewUrl',
|
|
16
|
+
'preview',
|
|
17
|
+
])
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 云端直传:向服务端取签名 → 直传对象存储
|
|
21
|
+
* 需已安装 hook=upload 插件;配置错误由插件/接口直接抛错
|
|
22
|
+
*/
|
|
23
|
+
export function useUpload() {
|
|
24
|
+
async function toUpload(file: File, opts: UploadOptions = {}): Promise<UploadResult> {
|
|
25
|
+
const { prefixPath = 'app/base', onProgress } = opts
|
|
26
|
+
const fileId = uploadUid()
|
|
27
|
+
const ext = extname(file.name)
|
|
28
|
+
const name = `${filename(file.name)}_${fileId}${ext ? `.${ext}` : ''}`
|
|
29
|
+
const key = pathJoin(prefixPath, name)
|
|
30
|
+
|
|
31
|
+
const sign = await request<SignPayload>(UPLOAD_PATH, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
body: JSON.stringify({}),
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
const host = String(sign.host || sign.url || sign.uploadUrl || '')
|
|
37
|
+
if (!host) throw new Error('上传地址无效')
|
|
38
|
+
|
|
39
|
+
const fd = new FormData()
|
|
40
|
+
fd.append('key', key)
|
|
41
|
+
for (const [k, v] of Object.entries(sign)) {
|
|
42
|
+
if (SIGN_SKIP.has(k) || v == null || fd.has(k)) continue
|
|
43
|
+
fd.append(k, String(v))
|
|
44
|
+
}
|
|
45
|
+
// OSS 要求 file 为最后一个字段
|
|
46
|
+
fd.append('file', file)
|
|
47
|
+
|
|
48
|
+
await xhrUpload(host, fd, onProgress)
|
|
49
|
+
|
|
50
|
+
const preview = String(sign.publicDomain || sign.previewUrl || host)
|
|
51
|
+
return { url: pathJoin(preview, key), key, fileId }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return { toUpload }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function xhrUpload(
|
|
58
|
+
url: string,
|
|
59
|
+
body: FormData,
|
|
60
|
+
onProgress?: (n: number) => void,
|
|
61
|
+
): Promise<void> {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
const xhr = new XMLHttpRequest()
|
|
64
|
+
xhr.open('POST', url)
|
|
65
|
+
xhr.upload.onprogress = (e) => {
|
|
66
|
+
if (!e.lengthComputable) return
|
|
67
|
+
onProgress?.(Math.min(100, Math.floor((e.loaded / e.total) * 100)))
|
|
68
|
+
}
|
|
69
|
+
xhr.onload = () => {
|
|
70
|
+
if (xhr.status < 200 || xhr.status >= 300) {
|
|
71
|
+
const msg = xhr.responseText || `上传失败 (${xhr.status})`
|
|
72
|
+
toast.error(msg.slice(0, 200))
|
|
73
|
+
reject(new Error(msg))
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
onProgress?.(100)
|
|
77
|
+
resolve()
|
|
78
|
+
}
|
|
79
|
+
xhr.onerror = () => reject(new Error('上传网络错误'))
|
|
80
|
+
xhr.send(body)
|
|
81
|
+
})
|
|
82
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useRoute, useRouter } from 'vue-router'
|
|
2
|
+
import { service } from '../service'
|
|
3
|
+
import { useBrowser } from './useBrowser'
|
|
4
|
+
|
|
5
|
+
/** service + router + browser */
|
|
6
|
+
export function useVome() {
|
|
7
|
+
return {
|
|
8
|
+
service,
|
|
9
|
+
route: useRoute(),
|
|
10
|
+
router: useRouter(),
|
|
11
|
+
...useBrowser(),
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export {
|
|
2
|
+
resolveView,
|
|
3
|
+
listViews,
|
|
4
|
+
listViewsTree,
|
|
5
|
+
viewPathToName,
|
|
6
|
+
registerViews,
|
|
7
|
+
VIEWS_RESCAN_EVENT,
|
|
8
|
+
} from './lib/module'
|
|
9
|
+
export type { ViewsTreeNode } from '../../typings/admin/vome/module'
|
|
10
|
+
export { getBrowser } from './lib/browser'
|
|
11
|
+
export type { BrowserInfo, BrowserScreen } from '../../typings/admin/vome/browser'
|
|
12
|
+
export { useBrowser } from './hooks/useBrowser'
|
|
13
|
+
/** CRUD 组件走自动引入;此处只再导出 composable / 工具,避免桶导入拖入全部 SFC */
|
|
14
|
+
export {
|
|
15
|
+
useCrud,
|
|
16
|
+
useTable,
|
|
17
|
+
useUpsert,
|
|
18
|
+
useSearch,
|
|
19
|
+
useCore,
|
|
20
|
+
CRUD_KEY,
|
|
21
|
+
} from './crud/useCrud'
|
|
22
|
+
export {
|
|
23
|
+
Plugins,
|
|
24
|
+
toTree,
|
|
25
|
+
setFocus,
|
|
26
|
+
setRules,
|
|
27
|
+
setAuto,
|
|
28
|
+
buildAutoSearchItems,
|
|
29
|
+
} from './crud/plugins'
|
|
30
|
+
export {
|
|
31
|
+
setCrudConfig,
|
|
32
|
+
getCrudConfig,
|
|
33
|
+
getCrudStyle,
|
|
34
|
+
} from './crud/style'
|
|
35
|
+
export { resolveCrudComponent, registerCrudComponent } from './crud/registry'
|
|
36
|
+
export { vmConfirm } from './crud/confirm'
|
|
37
|
+
export { deepTree, flattenTree } from './lib/tree'
|
|
38
|
+
export { config } from '#vome-host/config'
|
|
39
|
+
export { pluginDev } from './config/plugin-dev'
|
|
40
|
+
export type { PluginDevConfig, PluginScaffoldKey } from './config/plugin-dev'
|
|
41
|
+
export { router, resetMenuRoutesFlag } from './router'
|
|
42
|
+
export { useAppStore } from './stores/app'
|
|
43
|
+
export { useUserStore } from './stores/user'
|
|
44
|
+
export { useTagsStore } from './stores/tags'
|
|
45
|
+
export { loadEps, loadAllEps, getEps, findEpsEntity } from './lib/eps'
|
|
46
|
+
export type { EpsSide } from './lib/eps'
|
|
47
|
+
export { api, request, apiUrl } from './api/client'
|
|
48
|
+
export {
|
|
49
|
+
service,
|
|
50
|
+
createEps,
|
|
51
|
+
setServicePerms,
|
|
52
|
+
resolveService,
|
|
53
|
+
serviceOf,
|
|
54
|
+
createEpsService,
|
|
55
|
+
BaseService,
|
|
56
|
+
} from './service'
|
|
57
|
+
export { useVome } from './hooks/useVome'
|
|
58
|
+
export { vPerm } from './directives/perm'
|
|
59
|
+
export { cn } from './lib/cn'
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type { BrowserInfo, BrowserScreen } from '../../../typings/admin/vome/browser'
|
|
2
|
+
|
|
3
|
+
/** 根据视口计算断点与 isMini */
|
|
4
|
+
export function getBrowser(): BrowserInfo {
|
|
5
|
+
const { clientHeight: height, clientWidth: width } = document.documentElement
|
|
6
|
+
const ua = navigator.userAgent.toLowerCase()
|
|
7
|
+
|
|
8
|
+
let type = (ua.match(/firefox|chrome|safari|opera/g) || ['other'])[0]
|
|
9
|
+
if ((ua.match(/msie|trident/g) || [])[0]) type = 'msie'
|
|
10
|
+
|
|
11
|
+
let screen: BrowserScreen = 'full'
|
|
12
|
+
if (width < 768) screen = 'xs'
|
|
13
|
+
else if (width < 992) screen = 'sm'
|
|
14
|
+
else if (width < 1200) screen = 'md'
|
|
15
|
+
else if (width < 1920) screen = 'xl'
|
|
16
|
+
|
|
17
|
+
const isPC = !/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(
|
|
18
|
+
ua,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
height,
|
|
23
|
+
width,
|
|
24
|
+
type,
|
|
25
|
+
screen,
|
|
26
|
+
isMini: screen === 'xs' || !isPC,
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Dialog 内 Teleport 浮层统一标记:点浮层时勿关闭宿主 Dialog */
|
|
2
|
+
export const DIALOG_FLOAT_CLASS = 'vm-dialog-float'
|
|
3
|
+
|
|
4
|
+
/** 判断 pointer/focus/interact-outside 是否落在 Dialog 浮层上 */
|
|
5
|
+
export function isDialogFloatTarget(event: Event): boolean {
|
|
6
|
+
const detail = (event as CustomEvent).detail as
|
|
7
|
+
| { originalEvent?: Event }
|
|
8
|
+
| undefined
|
|
9
|
+
const t = (detail?.originalEvent?.target ?? event.target) as Node | null
|
|
10
|
+
if (!t) return false
|
|
11
|
+
// 点击文字节点时 target 不是 Element,需回退到 parentElement
|
|
12
|
+
const el = t instanceof Element ? t : t.parentElement
|
|
13
|
+
return Boolean(el?.closest(`.${DIALOG_FLOAT_CLASS}`))
|
|
14
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { request } from '../api/client'
|
|
2
|
+
|
|
3
|
+
export type EpsSide = 'admin' | 'app'
|
|
4
|
+
|
|
5
|
+
const EPS_URL: Record<EpsSide, string> = {
|
|
6
|
+
admin: '/admin/base/open/eps',
|
|
7
|
+
app: '/app/base/open/eps',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const cache: Record<EpsSide, EpsModuleMap | null> = {
|
|
11
|
+
admin: null,
|
|
12
|
+
app: null,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** 拉取 EPS(默认 admin) */
|
|
16
|
+
export async function loadEps(force = false, side: EpsSide = 'admin') {
|
|
17
|
+
if (cache[side] && !force) return cache[side]
|
|
18
|
+
cache[side] = (await request<EpsModuleMap>(EPS_URL[side])) || {}
|
|
19
|
+
return cache[side]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** 并行拉取 admin + app */
|
|
23
|
+
export async function loadAllEps(force = false) {
|
|
24
|
+
await Promise.all([loadEps(force, 'admin'), loadEps(force, 'app')])
|
|
25
|
+
return { admin: cache.admin, app: cache.app }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function getEps(side: EpsSide = 'admin') {
|
|
29
|
+
return cache[side]
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** 按 prefix 找实体描述,如 /admin/base/user */
|
|
33
|
+
export function findEpsEntity(prefix: string, side: EpsSide = 'admin') {
|
|
34
|
+
const map = cache[side]
|
|
35
|
+
if (!map) return undefined
|
|
36
|
+
for (const list of Object.values(map)) {
|
|
37
|
+
const hit = list.find(
|
|
38
|
+
(e) => e.prefix === prefix || e.prefix === prefix.replace(/\/$/, ''),
|
|
39
|
+
)
|
|
40
|
+
if (hit) return hit
|
|
41
|
+
}
|
|
42
|
+
return undefined
|
|
43
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** 侧栏可见菜单(过滤隐藏节点) */
|
|
2
|
+
export function filterShowMenus(nodes: MenuTreeNode[]): MenuTreeNode[] {
|
|
3
|
+
return nodes
|
|
4
|
+
.filter((n) => n.isShow)
|
|
5
|
+
.map((n) => ({
|
|
6
|
+
...n,
|
|
7
|
+
children: n.children?.length ? filterShowMenus(n.children) : undefined,
|
|
8
|
+
}))
|
|
9
|
+
.filter(
|
|
10
|
+
(n) =>
|
|
11
|
+
n.type === 0 ||
|
|
12
|
+
(n.type === 1 && n.router) ||
|
|
13
|
+
(n.children?.length ?? 0) > 0,
|
|
14
|
+
)
|
|
15
|
+
}
|