Browse Source

feat(icon-picker): add icon-picker component

Vben 4 years ago
parent
commit
b6cea4a950

+ 3 - 0
CHANGELOG.zh_CN.md

@@ -7,6 +7,9 @@
 ### ✨ Features
 
 - axios 支持 form-data 格式请求
+- 新增图标选择器组件
+- 新增修改密码界面
+- 新增部门管理示例界面
 
 ### ⚡ Performance Improvements
 

+ 56 - 0
build/gen/generateIconJson.ts

@@ -0,0 +1,56 @@
+import path from 'path';
+import fs from 'fs-extra';
+import inquirer from 'inquirer';
+import chalk from 'chalk';
+import pkg from '../../package.json';
+
+async function generateIcon() {
+  const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json');
+
+  const raw = await fs.readJSON(path.join(dir, 'collections.json'));
+
+  const collections = Object.entries(raw).map(([id, v]) => ({
+    ...(v as any),
+    id,
+  }));
+
+  const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name }));
+
+  inquirer
+    .prompt([
+      {
+        type: 'checkbox',
+        name: 'iconSet',
+        choices: choices,
+        message: 'Select the icon set that needs to be generated?',
+        default: true,
+      },
+      {
+        type: 'input',
+        name: 'output',
+        message: 'Select the icon set that needs to be generated?',
+        default: 'src/components/Icon/json',
+      },
+    ])
+    .then(async (answers) => {
+      const { iconSet, output } = answers;
+      const outputDir = path.resolve(process.cwd(), output);
+      fs.ensureDir(outputDir);
+      const genCollections = collections.filter((item) => iconSet.includes(item.id));
+      const prefixSet: string[] = [];
+      for (const info of genCollections) {
+        const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`));
+        if (data) {
+          const { prefix } = data;
+          const icons = Object.keys(data.icons).map((item) => `${prefix}:${item}`);
+          await fs.writeJSON(path.join(output, `${prefix}-info.json`), icons);
+          prefixSet.push(prefix);
+        }
+      }
+      console.log(
+        `✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`
+      );
+    });
+}
+
+generateIcon();

+ 6 - 2
package.json

@@ -22,7 +22,9 @@
     "test:gzip": "http-server dist --cors --gzip -c-1",
     "test:br": "http-server dist --cors --brotli -c-1",
     "reinstall": "rimraf yarn.lock && rimraf package.lock.json && rimraf node_modules && npm run bootstrap",
-    "postinstall": "is-ci || husky install"
+    "install:husky": "is-ci || husky install",
+    "gen:icon": "esno ./build/gen/generateIconJson.ts",
+    "postinstall": "npm run install:husky"
   },
   "dependencies": {
     "@iconify/iconify": "^2.0.0-rc.6",
@@ -55,8 +57,9 @@
     "@ls-lint/ls-lint": "^1.9.2",
     "@purge-icons/generated": "^0.7.0",
     "@types/crypto-js": "^4.0.1",
-    "@types/fs-extra": "^9.0.7",
+    "@types/fs-extra": "^9.0.8",
     "@types/http-proxy": "^1.17.5",
+    "@types/inquirer": "^7.3.1",
     "@types/lodash-es": "^4.17.4",
     "@types/mockjs": "^1.0.3",
     "@types/nprogress": "^0.2.0",
@@ -84,6 +87,7 @@
     "fs-extra": "^9.1.0",
     "http-server": "^0.12.3",
     "husky": "^5.1.2",
+    "inquirer": "^8.0.0",
     "is-ci": "^3.0.0",
     "less": "^4.1.1",
     "lint-staged": "^10.5.4",

+ 3 - 1
src/components/Icon/index.ts

@@ -1,4 +1,6 @@
 import Icon from './src/index.vue';
+import IconPicker from './src/IconPicker.vue';
+
+export { Icon, IconPicker };
 
-export { Icon };
 export default Icon;

+ 2338 - 0
src/components/Icon/json/ion-info.json

@@ -0,0 +1,2338 @@
+[
+  "ion:accessibility",
+  "ion:accessibility-outline",
+  "ion:accessibility-sharp",
+  "ion:add",
+  "ion:add-circle",
+  "ion:add-circle-outline",
+  "ion:add-circle-sharp",
+  "ion:add-outline",
+  "ion:add-sharp",
+  "ion:airplane",
+  "ion:airplane-outline",
+  "ion:airplane-sharp",
+  "ion:alarm",
+  "ion:alarm-outline",
+  "ion:alarm-sharp",
+  "ion:albums",
+  "ion:albums-outline",
+  "ion:albums-sharp",
+  "ion:alert",
+  "ion:alert-circle",
+  "ion:alert-circle-outline",
+  "ion:alert-circle-sharp",
+  "ion:alert-circled",
+  "ion:alert-outline",
+  "ion:alert-sharp",
+  "ion:american-football",
+  "ion:american-football-outline",
+  "ion:american-football-sharp",
+  "ion:analytics",
+  "ion:analytics-outline",
+  "ion:analytics-sharp",
+  "ion:android-bulb",
+  "ion:android-checkbox-outline-blank",
+  "ion:android-contact",
+  "ion:android-favorite-outline",
+  "ion:android-hangout",
+  "ion:android-more-horizontal",
+  "ion:android-plane",
+  "ion:android-sunny",
+  "ion:android-time",
+  "ion:android-train",
+  "ion:aperture",
+  "ion:aperture-outline",
+  "ion:aperture-sharp",
+  "ion:apps",
+  "ion:apps-outline",
+  "ion:apps-sharp",
+  "ion:archive",
+  "ion:archive-outline",
+  "ion:archive-sharp",
+  "ion:arrow-back",
+  "ion:arrow-back-circle",
+  "ion:arrow-back-circle-outline",
+  "ion:arrow-back-circle-sharp",
+  "ion:arrow-back-outline",
+  "ion:arrow-back-sharp",
+  "ion:arrow-down",
+  "ion:arrow-down-a",
+  "ion:arrow-down-b",
+  "ion:arrow-down-c",
+  "ion:arrow-down-circle",
+  "ion:arrow-down-circle-outline",
+  "ion:arrow-down-circle-sharp",
+  "ion:arrow-down-outline",
+  "ion:arrow-down-sharp",
+  "ion:arrow-expand",
+  "ion:arrow-forward",
+  "ion:arrow-forward-circle",
+  "ion:arrow-forward-circle-outline",
+  "ion:arrow-forward-circle-sharp",
+  "ion:arrow-forward-outline",
+  "ion:arrow-forward-sharp",
+  "ion:arrow-graph-down-left",
+  "ion:arrow-graph-down-right",
+  "ion:arrow-graph-up-left",
+  "ion:arrow-graph-up-right",
+  "ion:arrow-left-a",
+  "ion:arrow-left-b",
+  "ion:arrow-left-c",
+  "ion:arrow-move",
+  "ion:arrow-redo",
+  "ion:arrow-redo-circle",
+  "ion:arrow-redo-circle-outline",
+  "ion:arrow-redo-circle-sharp",
+  "ion:arrow-redo-outline",
+  "ion:arrow-redo-sharp",
+  "ion:arrow-resize",
+  "ion:arrow-return-left",
+  "ion:arrow-return-right",
+  "ion:arrow-right-a",
+  "ion:arrow-right-b",
+  "ion:arrow-right-c",
+  "ion:arrow-shrink",
+  "ion:arrow-swap",
+  "ion:arrow-undo",
+  "ion:arrow-undo-circle",
+  "ion:arrow-undo-circle-outline",
+  "ion:arrow-undo-circle-sharp",
+  "ion:arrow-undo-outline",
+  "ion:arrow-undo-sharp",
+  "ion:arrow-up",
+  "ion:arrow-up-a",
+  "ion:arrow-up-b",
+  "ion:arrow-up-c",
+  "ion:arrow-up-circle",
+  "ion:arrow-up-circle-outline",
+  "ion:arrow-up-circle-sharp",
+  "ion:arrow-up-outline",
+  "ion:arrow-up-sharp",
+  "ion:asterisk",
+  "ion:at",
+  "ion:at-circle",
+  "ion:at-circle-outline",
+  "ion:at-circle-sharp",
+  "ion:at-outline",
+  "ion:at-sharp",
+  "ion:attach",
+  "ion:attach-outline",
+  "ion:attach-sharp",
+  "ion:backspace",
+  "ion:backspace-outline",
+  "ion:backspace-sharp",
+  "ion:bag",
+  "ion:bag-add",
+  "ion:bag-add-outline",
+  "ion:bag-add-sharp",
+  "ion:bag-check",
+  "ion:bag-check-outline",
+  "ion:bag-check-sharp",
+  "ion:bag-handle",
+  "ion:bag-handle-outline",
+  "ion:bag-handle-sharp",
+  "ion:bag-outline",
+  "ion:bag-remove",
+  "ion:bag-remove-outline",
+  "ion:bag-remove-sharp",
+  "ion:bag-sharp",
+  "ion:balloon",
+  "ion:balloon-outline",
+  "ion:balloon-sharp",
+  "ion:ban",
+  "ion:ban-outline",
+  "ion:ban-sharp",
+  "ion:bandage",
+  "ion:bandage-outline",
+  "ion:bandage-sharp",
+  "ion:bar-chart",
+  "ion:bar-chart-outline",
+  "ion:bar-chart-sharp",
+  "ion:barbell",
+  "ion:barbell-outline",
+  "ion:barbell-sharp",
+  "ion:barcode",
+  "ion:barcode-outline",
+  "ion:barcode-sharp",
+  "ion:baseball",
+  "ion:baseball-outline",
+  "ion:baseball-sharp",
+  "ion:basket",
+  "ion:basket-outline",
+  "ion:basket-sharp",
+  "ion:basketball",
+  "ion:basketball-outline",
+  "ion:basketball-sharp",
+  "ion:battery-charging",
+  "ion:battery-charging-outline",
+  "ion:battery-charging-sharp",
+  "ion:battery-dead",
+  "ion:battery-dead-outline",
+  "ion:battery-dead-sharp",
+  "ion:battery-empty",
+  "ion:battery-full",
+  "ion:battery-full-outline",
+  "ion:battery-full-sharp",
+  "ion:battery-half",
+  "ion:battery-half-outline",
+  "ion:battery-half-sharp",
+  "ion:battery-low",
+  "ion:beaker",
+  "ion:beaker-outline",
+  "ion:beaker-sharp",
+  "ion:bed",
+  "ion:bed-outline",
+  "ion:bed-sharp",
+  "ion:beer",
+  "ion:beer-outline",
+  "ion:beer-sharp",
+  "ion:bicycle",
+  "ion:bicycle-outline",
+  "ion:bicycle-sharp",
+  "ion:bluetooth",
+  "ion:bluetooth-outline",
+  "ion:bluetooth-sharp",
+  "ion:boat",
+  "ion:boat-outline",
+  "ion:boat-sharp",
+  "ion:body",
+  "ion:body-outline",
+  "ion:body-sharp",
+  "ion:bonfire",
+  "ion:bonfire-outline",
+  "ion:bonfire-sharp",
+  "ion:book",
+  "ion:book-outline",
+  "ion:book-sharp",
+  "ion:bookmark",
+  "ion:bookmark-outline",
+  "ion:bookmark-sharp",
+  "ion:bookmarks",
+  "ion:bookmarks-outline",
+  "ion:bookmarks-sharp",
+  "ion:bowling-ball",
+  "ion:bowling-ball-outline",
+  "ion:bowling-ball-sharp",
+  "ion:bowtie",
+  "ion:briefcase",
+  "ion:briefcase-outline",
+  "ion:briefcase-sharp",
+  "ion:browsers",
+  "ion:browsers-outline",
+  "ion:browsers-sharp",
+  "ion:brush",
+  "ion:brush-outline",
+  "ion:brush-sharp",
+  "ion:bug",
+  "ion:bug-outline",
+  "ion:bug-sharp",
+  "ion:build",
+  "ion:build-outline",
+  "ion:build-sharp",
+  "ion:bulb",
+  "ion:bulb-outline",
+  "ion:bulb-sharp",
+  "ion:bus",
+  "ion:bus-outline",
+  "ion:bus-sharp",
+  "ion:business",
+  "ion:business-outline",
+  "ion:business-sharp",
+  "ion:cafe",
+  "ion:cafe-outline",
+  "ion:cafe-sharp",
+  "ion:calculator",
+  "ion:calculator-outline",
+  "ion:calculator-sharp",
+  "ion:calendar",
+  "ion:calendar-clear",
+  "ion:calendar-clear-outline",
+  "ion:calendar-clear-sharp",
+  "ion:calendar-number",
+  "ion:calendar-number-outline",
+  "ion:calendar-number-sharp",
+  "ion:calendar-outline",
+  "ion:calendar-sharp",
+  "ion:call",
+  "ion:call-outline",
+  "ion:call-sharp",
+  "ion:camera",
+  "ion:camera-outline",
+  "ion:camera-reverse",
+  "ion:camera-reverse-outline",
+  "ion:camera-reverse-sharp",
+  "ion:camera-sharp",
+  "ion:car",
+  "ion:car-outline",
+  "ion:car-sharp",
+  "ion:car-sport",
+  "ion:car-sport-outline",
+  "ion:car-sport-sharp",
+  "ion:card",
+  "ion:card-outline",
+  "ion:card-sharp",
+  "ion:caret-back",
+  "ion:caret-back-circle",
+  "ion:caret-back-circle-outline",
+  "ion:caret-back-circle-sharp",
+  "ion:caret-back-outline",
+  "ion:caret-back-sharp",
+  "ion:caret-down",
+  "ion:caret-down-circle",
+  "ion:caret-down-circle-outline",
+  "ion:caret-down-circle-sharp",
+  "ion:caret-down-outline",
+  "ion:caret-down-sharp",
+  "ion:caret-forward",
+  "ion:caret-forward-circle",
+  "ion:caret-forward-circle-outline",
+  "ion:caret-forward-circle-sharp",
+  "ion:caret-forward-outline",
+  "ion:caret-forward-sharp",
+  "ion:caret-up",
+  "ion:caret-up-circle",
+  "ion:caret-up-circle-outline",
+  "ion:caret-up-circle-sharp",
+  "ion:caret-up-outline",
+  "ion:caret-up-sharp",
+  "ion:cart",
+  "ion:cart-outline",
+  "ion:cart-sharp",
+  "ion:cash",
+  "ion:cash-outline",
+  "ion:cash-sharp",
+  "ion:cellular",
+  "ion:cellular-outline",
+  "ion:cellular-sharp",
+  "ion:chatbox",
+  "ion:chatbox-ellipses",
+  "ion:chatbox-ellipses-outline",
+  "ion:chatbox-ellipses-sharp",
+  "ion:chatbox-outline",
+  "ion:chatbox-sharp",
+  "ion:chatbox-working",
+  "ion:chatboxes",
+  "ion:chatbubble",
+  "ion:chatbubble-ellipses",
+  "ion:chatbubble-ellipses-outline",
+  "ion:chatbubble-ellipses-sharp",
+  "ion:chatbubble-outline",
+  "ion:chatbubble-sharp",
+  "ion:chatbubble-working",
+  "ion:chatbubbles",
+  "ion:chatbubbles-outline",
+  "ion:chatbubbles-sharp",
+  "ion:checkbox",
+  "ion:checkbox-outline",
+  "ion:checkbox-sharp",
+  "ion:checkmark",
+  "ion:checkmark-circle",
+  "ion:checkmark-circle-outline",
+  "ion:checkmark-circle-sharp",
+  "ion:checkmark-circled",
+  "ion:checkmark-done",
+  "ion:checkmark-done-circle",
+  "ion:checkmark-done-circle-outline",
+  "ion:checkmark-done-circle-sharp",
+  "ion:checkmark-done-outline",
+  "ion:checkmark-done-sharp",
+  "ion:checkmark-outline",
+  "ion:checkmark-round",
+  "ion:checkmark-sharp",
+  "ion:chevron-back",
+  "ion:chevron-back-circle",
+  "ion:chevron-back-circle-outline",
+  "ion:chevron-back-circle-sharp",
+  "ion:chevron-back-outline",
+  "ion:chevron-back-sharp",
+  "ion:chevron-down",
+  "ion:chevron-down-circle",
+  "ion:chevron-down-circle-outline",
+  "ion:chevron-down-circle-sharp",
+  "ion:chevron-down-outline",
+  "ion:chevron-down-sharp",
+  "ion:chevron-forward",
+  "ion:chevron-forward-circle",
+  "ion:chevron-forward-circle-outline",
+  "ion:chevron-forward-circle-sharp",
+  "ion:chevron-forward-outline",
+  "ion:chevron-forward-sharp",
+  "ion:chevron-left",
+  "ion:chevron-right",
+  "ion:chevron-up",
+  "ion:chevron-up-circle",
+  "ion:chevron-up-circle-outline",
+  "ion:chevron-up-circle-sharp",
+  "ion:chevron-up-outline",
+  "ion:chevron-up-sharp",
+  "ion:clipboard",
+  "ion:clipboard-outline",
+  "ion:clipboard-sharp",
+  "ion:clock",
+  "ion:close",
+  "ion:close-circle",
+  "ion:close-circle-outline",
+  "ion:close-circle-sharp",
+  "ion:close-circled",
+  "ion:close-outline",
+  "ion:close-round",
+  "ion:close-sharp",
+  "ion:closed-captioning",
+  "ion:cloud",
+  "ion:cloud-circle",
+  "ion:cloud-circle-outline",
+  "ion:cloud-circle-sharp",
+  "ion:cloud-done",
+  "ion:cloud-done-outline",
+  "ion:cloud-done-sharp",
+  "ion:cloud-download",
+  "ion:cloud-download-outline",
+  "ion:cloud-download-sharp",
+  "ion:cloud-offline",
+  "ion:cloud-offline-outline",
+  "ion:cloud-offline-sharp",
+  "ion:cloud-outline",
+  "ion:cloud-sharp",
+  "ion:cloud-upload",
+  "ion:cloud-upload-outline",
+  "ion:cloud-upload-sharp",
+  "ion:cloudy",
+  "ion:cloudy-night",
+  "ion:cloudy-night-outline",
+  "ion:cloudy-night-sharp",
+  "ion:cloudy-outline",
+  "ion:cloudy-sharp",
+  "ion:code",
+  "ion:code-download",
+  "ion:code-download-outline",
+  "ion:code-download-sharp",
+  "ion:code-outline",
+  "ion:code-sharp",
+  "ion:code-slash",
+  "ion:code-slash-outline",
+  "ion:code-slash-sharp",
+  "ion:code-working",
+  "ion:code-working-outline",
+  "ion:code-working-sharp",
+  "ion:coffee",
+  "ion:cog",
+  "ion:cog-outline",
+  "ion:cog-sharp",
+  "ion:color-fill",
+  "ion:color-fill-outline",
+  "ion:color-fill-sharp",
+  "ion:color-filter",
+  "ion:color-filter-outline",
+  "ion:color-filter-sharp",
+  "ion:color-palette",
+  "ion:color-palette-outline",
+  "ion:color-palette-sharp",
+  "ion:color-wand",
+  "ion:color-wand-outline",
+  "ion:color-wand-sharp",
+  "ion:compass",
+  "ion:compass-outline",
+  "ion:compass-sharp",
+  "ion:compose",
+  "ion:connection-bars",
+  "ion:construct",
+  "ion:construct-outline",
+  "ion:construct-sharp",
+  "ion:contract",
+  "ion:contract-outline",
+  "ion:contract-sharp",
+  "ion:contrast",
+  "ion:contrast-outline",
+  "ion:contrast-sharp",
+  "ion:copy",
+  "ion:copy-outline",
+  "ion:copy-sharp",
+  "ion:create",
+  "ion:create-outline",
+  "ion:create-sharp",
+  "ion:crop",
+  "ion:crop-outline",
+  "ion:crop-sharp",
+  "ion:cube",
+  "ion:cube-outline",
+  "ion:cube-sharp",
+  "ion:cut",
+  "ion:cut-outline",
+  "ion:cut-sharp",
+  "ion:desktop",
+  "ion:desktop-outline",
+  "ion:desktop-sharp",
+  "ion:diamond",
+  "ion:diamond-outline",
+  "ion:diamond-sharp",
+  "ion:dice",
+  "ion:dice-outline",
+  "ion:dice-sharp",
+  "ion:disc",
+  "ion:disc-outline",
+  "ion:disc-sharp",
+  "ion:document",
+  "ion:document-attach",
+  "ion:document-attach-outline",
+  "ion:document-attach-sharp",
+  "ion:document-lock",
+  "ion:document-lock-outline",
+  "ion:document-lock-sharp",
+  "ion:document-outline",
+  "ion:document-sharp",
+  "ion:document-text",
+  "ion:document-text-outline",
+  "ion:document-text-sharp",
+  "ion:documents",
+  "ion:documents-outline",
+  "ion:documents-sharp",
+  "ion:download",
+  "ion:download-outline",
+  "ion:download-sharp",
+  "ion:drag",
+  "ion:duplicate",
+  "ion:duplicate-outline",
+  "ion:duplicate-sharp",
+  "ion:ear",
+  "ion:ear-outline",
+  "ion:ear-sharp",
+  "ion:earth",
+  "ion:earth-outline",
+  "ion:earth-sharp",
+  "ion:easel",
+  "ion:easel-outline",
+  "ion:easel-sharp",
+  "ion:edit",
+  "ion:egg",
+  "ion:egg-outline",
+  "ion:egg-sharp",
+  "ion:eject",
+  "ion:ellipse",
+  "ion:ellipse-outline",
+  "ion:ellipse-sharp",
+  "ion:ellipsis-horizontal",
+  "ion:ellipsis-horizontal-circle",
+  "ion:ellipsis-horizontal-circle-outline",
+  "ion:ellipsis-horizontal-circle-sharp",
+  "ion:ellipsis-horizontal-outline",
+  "ion:ellipsis-horizontal-sharp",
+  "ion:ellipsis-vertical",
+  "ion:ellipsis-vertical-circle",
+  "ion:ellipsis-vertical-circle-outline",
+  "ion:ellipsis-vertical-circle-sharp",
+  "ion:ellipsis-vertical-outline",
+  "ion:ellipsis-vertical-sharp",
+  "ion:email",
+  "ion:email-unread",
+  "ion:enter",
+  "ion:enter-outline",
+  "ion:enter-sharp",
+  "ion:erlenmeyer-flask",
+  "ion:erlenmeyer-flask-bubbles",
+  "ion:exit",
+  "ion:exit-outline",
+  "ion:exit-sharp",
+  "ion:expand",
+  "ion:expand-outline",
+  "ion:expand-sharp",
+  "ion:extension-puzzle",
+  "ion:extension-puzzle-outline",
+  "ion:extension-puzzle-sharp",
+  "ion:eye",
+  "ion:eye-disabled",
+  "ion:eye-off",
+  "ion:eye-off-outline",
+  "ion:eye-off-sharp",
+  "ion:eye-outline",
+  "ion:eye-sharp",
+  "ion:eyedrop",
+  "ion:eyedrop-outline",
+  "ion:eyedrop-sharp",
+  "ion:fast-food",
+  "ion:fast-food-outline",
+  "ion:fast-food-sharp",
+  "ion:female",
+  "ion:female-outline",
+  "ion:female-sharp",
+  "ion:file-tray",
+  "ion:file-tray-full",
+  "ion:file-tray-full-outline",
+  "ion:file-tray-full-sharp",
+  "ion:file-tray-outline",
+  "ion:file-tray-sharp",
+  "ion:file-tray-stacked",
+  "ion:file-tray-stacked-outline",
+  "ion:file-tray-stacked-sharp",
+  "ion:filing",
+  "ion:film",
+  "ion:film-marker",
+  "ion:film-outline",
+  "ion:film-sharp",
+  "ion:filter",
+  "ion:filter-circle",
+  "ion:filter-circle-outline",
+  "ion:filter-circle-sharp",
+  "ion:filter-outline",
+  "ion:filter-sharp",
+  "ion:finger-print",
+  "ion:finger-print-outline",
+  "ion:finger-print-sharp",
+  "ion:fireball",
+  "ion:fish",
+  "ion:fish-outline",
+  "ion:fish-sharp",
+  "ion:fitness",
+  "ion:fitness-outline",
+  "ion:fitness-sharp",
+  "ion:flag",
+  "ion:flag-outline",
+  "ion:flag-sharp",
+  "ion:flame",
+  "ion:flame-outline",
+  "ion:flame-sharp",
+  "ion:flash",
+  "ion:flash-off",
+  "ion:flash-off-outline",
+  "ion:flash-off-sharp",
+  "ion:flash-outline",
+  "ion:flash-sharp",
+  "ion:flashlight",
+  "ion:flashlight-outline",
+  "ion:flashlight-sharp",
+  "ion:flask",
+  "ion:flask-outline",
+  "ion:flask-sharp",
+  "ion:flower",
+  "ion:flower-outline",
+  "ion:flower-sharp",
+  "ion:folder",
+  "ion:folder-open",
+  "ion:folder-open-outline",
+  "ion:folder-open-sharp",
+  "ion:folder-outline",
+  "ion:folder-sharp",
+  "ion:football",
+  "ion:football-outline",
+  "ion:football-sharp",
+  "ion:footsteps",
+  "ion:footsteps-outline",
+  "ion:footsteps-sharp",
+  "ion:fork",
+  "ion:fork-repo",
+  "ion:forward",
+  "ion:funnel",
+  "ion:funnel-outline",
+  "ion:funnel-sharp",
+  "ion:game-controller",
+  "ion:game-controller-outline",
+  "ion:game-controller-sharp",
+  "ion:gear-a",
+  "ion:gear-b",
+  "ion:gift",
+  "ion:gift-outline",
+  "ion:gift-sharp",
+  "ion:git-branch",
+  "ion:git-branch-outline",
+  "ion:git-branch-sharp",
+  "ion:git-commit",
+  "ion:git-commit-outline",
+  "ion:git-commit-sharp",
+  "ion:git-compare",
+  "ion:git-compare-outline",
+  "ion:git-compare-sharp",
+  "ion:git-merge",
+  "ion:git-merge-outline",
+  "ion:git-merge-sharp",
+  "ion:git-network",
+  "ion:git-network-outline",
+  "ion:git-network-sharp",
+  "ion:git-pull-request",
+  "ion:git-pull-request-outline",
+  "ion:git-pull-request-sharp",
+  "ion:glasses",
+  "ion:glasses-outline",
+  "ion:glasses-sharp",
+  "ion:globe",
+  "ion:globe-outline",
+  "ion:globe-sharp",
+  "ion:golf",
+  "ion:golf-outline",
+  "ion:golf-sharp",
+  "ion:grid",
+  "ion:grid-outline",
+  "ion:grid-sharp",
+  "ion:hammer",
+  "ion:hammer-outline",
+  "ion:hammer-sharp",
+  "ion:hand-left",
+  "ion:hand-left-outline",
+  "ion:hand-left-sharp",
+  "ion:hand-right",
+  "ion:hand-right-outline",
+  "ion:hand-right-sharp",
+  "ion:happy",
+  "ion:happy-outline",
+  "ion:happy-sharp",
+  "ion:hardware-chip",
+  "ion:hardware-chip-outline",
+  "ion:hardware-chip-sharp",
+  "ion:headphone",
+  "ion:headset",
+  "ion:headset-outline",
+  "ion:headset-sharp",
+  "ion:heart",
+  "ion:heart-broken",
+  "ion:heart-circle",
+  "ion:heart-circle-outline",
+  "ion:heart-circle-sharp",
+  "ion:heart-dislike",
+  "ion:heart-dislike-circle",
+  "ion:heart-dislike-circle-outline",
+  "ion:heart-dislike-circle-sharp",
+  "ion:heart-dislike-outline",
+  "ion:heart-dislike-sharp",
+  "ion:heart-half",
+  "ion:heart-half-outline",
+  "ion:heart-half-sharp",
+  "ion:heart-outline",
+  "ion:heart-sharp",
+  "ion:help",
+  "ion:help-buoy",
+  "ion:help-buoy-outline",
+  "ion:help-buoy-sharp",
+  "ion:help-circle",
+  "ion:help-circle-outline",
+  "ion:help-circle-sharp",
+  "ion:help-circled",
+  "ion:help-outline",
+  "ion:help-sharp",
+  "ion:home",
+  "ion:home-outline",
+  "ion:home-sharp",
+  "ion:hourglass",
+  "ion:hourglass-outline",
+  "ion:hourglass-sharp",
+  "ion:ice-cream",
+  "ion:ice-cream-outline",
+  "ion:ice-cream-sharp",
+  "ion:icecream",
+  "ion:id-card",
+  "ion:id-card-outline",
+  "ion:id-card-sharp",
+  "ion:image",
+  "ion:image-outline",
+  "ion:image-sharp",
+  "ion:images",
+  "ion:images-outline",
+  "ion:images-sharp",
+  "ion:infinite",
+  "ion:infinite-outline",
+  "ion:infinite-sharp",
+  "ion:information",
+  "ion:information-circle",
+  "ion:information-circle-outline",
+  "ion:information-circle-sharp",
+  "ion:information-circled",
+  "ion:information-outline",
+  "ion:information-sharp",
+  "ion:invert-mode",
+  "ion:invert-mode-outline",
+  "ion:invert-mode-sharp",
+  "ion:ionic",
+  "ion:ios-add",
+  "ion:ios-add-circle",
+  "ion:ios-add-circle-outline",
+  "ion:ios-airplane",
+  "ion:ios-alarm",
+  "ion:ios-alarm-outline",
+  "ion:ios-albums",
+  "ion:ios-albums-outline",
+  "ion:ios-alert",
+  "ion:ios-american-football",
+  "ion:ios-americanfootball",
+  "ion:ios-americanfootball-outline",
+  "ion:ios-analytics",
+  "ion:ios-analytics-outline",
+  "ion:ios-aperture",
+  "ion:ios-apps",
+  "ion:ios-appstore",
+  "ion:ios-archive",
+  "ion:ios-arrow-back",
+  "ion:ios-arrow-down",
+  "ion:ios-arrow-dropdown",
+  "ion:ios-arrow-dropdown-circle",
+  "ion:ios-arrow-dropleft",
+  "ion:ios-arrow-dropleft-circle",
+  "ion:ios-arrow-dropright",
+  "ion:ios-arrow-dropright-circle",
+  "ion:ios-arrow-dropup",
+  "ion:ios-arrow-dropup-circle",
+  "ion:ios-arrow-forward",
+  "ion:ios-arrow-left",
+  "ion:ios-arrow-right",
+  "ion:ios-arrow-round-back",
+  "ion:ios-arrow-round-down",
+  "ion:ios-arrow-round-forward",
+  "ion:ios-arrow-round-up",
+  "ion:ios-arrow-thin-down",
+  "ion:ios-arrow-thin-left",
+  "ion:ios-arrow-thin-right",
+  "ion:ios-arrow-thin-up",
+  "ion:ios-arrow-up",
+  "ion:ios-at",
+  "ion:ios-at-outline",
+  "ion:ios-attach",
+  "ion:ios-backspace",
+  "ion:ios-barcode",
+  "ion:ios-barcode-outline",
+  "ion:ios-baseball",
+  "ion:ios-baseball-outline",
+  "ion:ios-basket",
+  "ion:ios-basketball",
+  "ion:ios-basketball-outline",
+  "ion:ios-battery-charging",
+  "ion:ios-battery-dead",
+  "ion:ios-battery-full",
+  "ion:ios-beaker",
+  "ion:ios-bed",
+  "ion:ios-beer",
+  "ion:ios-bell",
+  "ion:ios-bell-outline",
+  "ion:ios-bicycle",
+  "ion:ios-bluetooth",
+  "ion:ios-boat",
+  "ion:ios-body",
+  "ion:ios-body-outline",
+  "ion:ios-bolt",
+  "ion:ios-bolt-outline",
+  "ion:ios-bonfire",
+  "ion:ios-book",
+  "ion:ios-book-outline",
+  "ion:ios-bookmark",
+  "ion:ios-bookmarks",
+  "ion:ios-bookmarks-outline",
+  "ion:ios-bowtie",
+  "ion:ios-box",
+  "ion:ios-box-outline",
+  "ion:ios-briefcase",
+  "ion:ios-briefcase-outline",
+  "ion:ios-browsers",
+  "ion:ios-browsers-outline",
+  "ion:ios-brush",
+  "ion:ios-bug",
+  "ion:ios-build",
+  "ion:ios-bulb",
+  "ion:ios-bus",
+  "ion:ios-business",
+  "ion:ios-cafe",
+  "ion:ios-calculator",
+  "ion:ios-calculator-outline",
+  "ion:ios-calendar",
+  "ion:ios-calendar-outline",
+  "ion:ios-call",
+  "ion:ios-camera",
+  "ion:ios-camera-outline",
+  "ion:ios-car",
+  "ion:ios-card",
+  "ion:ios-cart",
+  "ion:ios-cart-outline",
+  "ion:ios-cash",
+  "ion:ios-cellular",
+  "ion:ios-chatboxes",
+  "ion:ios-chatboxes-outline",
+  "ion:ios-chatbubble",
+  "ion:ios-chatbubble-outline",
+  "ion:ios-chatbubbles",
+  "ion:ios-checkbox",
+  "ion:ios-checkbox-outline",
+  "ion:ios-checkmark",
+  "ion:ios-checkmark-circle",
+  "ion:ios-checkmark-circle-outline",
+  "ion:ios-checkmark-empty",
+  "ion:ios-checkmark-outline",
+  "ion:ios-circle-filled",
+  "ion:ios-circle-outline",
+  "ion:ios-clipboard",
+  "ion:ios-clock",
+  "ion:ios-clock-outline",
+  "ion:ios-close",
+  "ion:ios-close-circle",
+  "ion:ios-close-circle-outline",
+  "ion:ios-close-empty",
+  "ion:ios-close-outline",
+  "ion:ios-cloud",
+  "ion:ios-cloud-circle",
+  "ion:ios-cloud-done",
+  "ion:ios-cloud-download",
+  "ion:ios-cloud-download-outline",
+  "ion:ios-cloud-outline",
+  "ion:ios-cloud-upload",
+  "ion:ios-cloud-upload-outline",
+  "ion:ios-cloudy",
+  "ion:ios-cloudy-night",
+  "ion:ios-cloudy-night-outline",
+  "ion:ios-cloudy-outline",
+  "ion:ios-code",
+  "ion:ios-code-download",
+  "ion:ios-code-working",
+  "ion:ios-cog",
+  "ion:ios-cog-outline",
+  "ion:ios-color-fill",
+  "ion:ios-color-filter",
+  "ion:ios-color-filter-outline",
+  "ion:ios-color-palette",
+  "ion:ios-color-wand",
+  "ion:ios-color-wand-outline",
+  "ion:ios-compass",
+  "ion:ios-compose",
+  "ion:ios-compose-outline",
+  "ion:ios-construct",
+  "ion:ios-contact",
+  "ion:ios-contact-outline",
+  "ion:ios-contacts",
+  "ion:ios-contract",
+  "ion:ios-contrast",
+  "ion:ios-copy",
+  "ion:ios-copy-outline",
+  "ion:ios-create",
+  "ion:ios-crop",
+  "ion:ios-crop-strong",
+  "ion:ios-cube",
+  "ion:ios-cut",
+  "ion:ios-desktop",
+  "ion:ios-disc",
+  "ion:ios-document",
+  "ion:ios-done-all",
+  "ion:ios-download",
+  "ion:ios-download-outline",
+  "ion:ios-easel",
+  "ion:ios-egg",
+  "ion:ios-email",
+  "ion:ios-email-outline",
+  "ion:ios-exit",
+  "ion:ios-expand",
+  "ion:ios-eye",
+  "ion:ios-eye-off",
+  "ion:ios-eye-outline",
+  "ion:ios-fastforward",
+  "ion:ios-fastforward-outline",
+  "ion:ios-female",
+  "ion:ios-filing",
+  "ion:ios-filing-outline",
+  "ion:ios-film",
+  "ion:ios-film-outline",
+  "ion:ios-finger-print",
+  "ion:ios-fitness",
+  "ion:ios-flag",
+  "ion:ios-flag-outline",
+  "ion:ios-flame",
+  "ion:ios-flame-outline",
+  "ion:ios-flash",
+  "ion:ios-flash-off",
+  "ion:ios-flashlight",
+  "ion:ios-flask",
+  "ion:ios-flask-outline",
+  "ion:ios-flower",
+  "ion:ios-flower-outline",
+  "ion:ios-folder",
+  "ion:ios-folder-open",
+  "ion:ios-folder-outline",
+  "ion:ios-football",
+  "ion:ios-football-outline",
+  "ion:ios-funnel",
+  "ion:ios-game-controller-a",
+  "ion:ios-game-controller-a-outline",
+  "ion:ios-game-controller-b",
+  "ion:ios-game-controller-b-outline",
+  "ion:ios-gear",
+  "ion:ios-gear-outline",
+  "ion:ios-gift",
+  "ion:ios-git-branch",
+  "ion:ios-git-commit",
+  "ion:ios-git-compare",
+  "ion:ios-git-merge",
+  "ion:ios-git-network",
+  "ion:ios-git-pull-request",
+  "ion:ios-glasses",
+  "ion:ios-glasses-outline",
+  "ion:ios-globe",
+  "ion:ios-grid",
+  "ion:ios-grid-view",
+  "ion:ios-grid-view-outline",
+  "ion:ios-hammer",
+  "ion:ios-hand",
+  "ion:ios-happy",
+  "ion:ios-headset",
+  "ion:ios-heart",
+  "ion:ios-heart-dislike",
+  "ion:ios-heart-empty",
+  "ion:ios-heart-half",
+  "ion:ios-heart-outline",
+  "ion:ios-help",
+  "ion:ios-help-buoy",
+  "ion:ios-help-circle",
+  "ion:ios-help-circle-outline",
+  "ion:ios-help-empty",
+  "ion:ios-help-outline",
+  "ion:ios-home",
+  "ion:ios-home-outline",
+  "ion:ios-hourglass",
+  "ion:ios-ice-cream",
+  "ion:ios-image",
+  "ion:ios-images",
+  "ion:ios-infinite",
+  "ion:ios-infinite-outline",
+  "ion:ios-information",
+  "ion:ios-information-circle",
+  "ion:ios-information-circle-outline",
+  "ion:ios-information-empty",
+  "ion:ios-information-outline",
+  "ion:ios-ionic-outline",
+  "ion:ios-jet",
+  "ion:ios-journal",
+  "ion:ios-key",
+  "ion:ios-keypad",
+  "ion:ios-keypad-outline",
+  "ion:ios-laptop",
+  "ion:ios-leaf",
+  "ion:ios-lightbulb",
+  "ion:ios-lightbulb-outline",
+  "ion:ios-link",
+  "ion:ios-list",
+  "ion:ios-list-box",
+  "ion:ios-list-outline",
+  "ion:ios-locate",
+  "ion:ios-location",
+  "ion:ios-location-outline",
+  "ion:ios-lock",
+  "ion:ios-locked",
+  "ion:ios-locked-outline",
+  "ion:ios-log-in",
+  "ion:ios-log-out",
+  "ion:ios-loop",
+  "ion:ios-loop-strong",
+  "ion:ios-magnet",
+  "ion:ios-mail",
+  "ion:ios-mail-open",
+  "ion:ios-mail-unread",
+  "ion:ios-male",
+  "ion:ios-man",
+  "ion:ios-map",
+  "ion:ios-medal",
+  "ion:ios-medical",
+  "ion:ios-medical-outline",
+  "ion:ios-medkit",
+  "ion:ios-medkit-outline",
+  "ion:ios-megaphone",
+  "ion:ios-menu",
+  "ion:ios-mic",
+  "ion:ios-mic-off",
+  "ion:ios-mic-outline",
+  "ion:ios-microphone",
+  "ion:ios-minus",
+  "ion:ios-minus-empty",
+  "ion:ios-minus-outline",
+  "ion:ios-monitor",
+  "ion:ios-monitor-outline",
+  "ion:ios-moon",
+  "ion:ios-moon-outline",
+  "ion:ios-more",
+  "ion:ios-more-outline",
+  "ion:ios-move",
+  "ion:ios-musical-note",
+  "ion:ios-musical-notes",
+  "ion:ios-navigate",
+  "ion:ios-navigate-outline",
+  "ion:ios-notifications",
+  "ion:ios-notifications-off",
+  "ion:ios-notifications-outline",
+  "ion:ios-nuclear",
+  "ion:ios-nutrition",
+  "ion:ios-nutrition-outline",
+  "ion:ios-open",
+  "ion:ios-options",
+  "ion:ios-outlet",
+  "ion:ios-paper",
+  "ion:ios-paper-outline",
+  "ion:ios-paper-plane",
+  "ion:ios-paperplane",
+  "ion:ios-paperplane-outline",
+  "ion:ios-partly-sunny",
+  "ion:ios-partlysunny",
+  "ion:ios-partlysunny-outline",
+  "ion:ios-pause",
+  "ion:ios-pause-outline",
+  "ion:ios-paw",
+  "ion:ios-paw-outline",
+  "ion:ios-people",
+  "ion:ios-people-outline",
+  "ion:ios-person",
+  "ion:ios-person-add",
+  "ion:ios-person-outline",
+  "ion:ios-personadd",
+  "ion:ios-personadd-outline",
+  "ion:ios-phone-landscape",
+  "ion:ios-phone-portrait",
+  "ion:ios-photos",
+  "ion:ios-photos-outline",
+  "ion:ios-pie",
+  "ion:ios-pie-outline",
+  "ion:ios-pin",
+  "ion:ios-pint",
+  "ion:ios-pint-outline",
+  "ion:ios-pizza",
+  "ion:ios-planet",
+  "ion:ios-play",
+  "ion:ios-play-circle",
+  "ion:ios-play-outline",
+  "ion:ios-plus",
+  "ion:ios-plus-empty",
+  "ion:ios-plus-outline",
+  "ion:ios-podium",
+  "ion:ios-power",
+  "ion:ios-pricetag",
+  "ion:ios-pricetag-outline",
+  "ion:ios-pricetags",
+  "ion:ios-pricetags-outline",
+  "ion:ios-print",
+  "ion:ios-printer",
+  "ion:ios-printer-outline",
+  "ion:ios-pulse",
+  "ion:ios-pulse-strong",
+  "ion:ios-qr-scanner",
+  "ion:ios-quote",
+  "ion:ios-radio",
+  "ion:ios-radio-button-off",
+  "ion:ios-radio-button-on",
+  "ion:ios-rainy",
+  "ion:ios-rainy-outline",
+  "ion:ios-recording",
+  "ion:ios-recording-outline",
+  "ion:ios-redo",
+  "ion:ios-redo-outline",
+  "ion:ios-refresh",
+  "ion:ios-refresh-circle",
+  "ion:ios-refresh-empty",
+  "ion:ios-refresh-outline",
+  "ion:ios-reload",
+  "ion:ios-remove",
+  "ion:ios-remove-circle",
+  "ion:ios-remove-circle-outline",
+  "ion:ios-reorder",
+  "ion:ios-repeat",
+  "ion:ios-resize",
+  "ion:ios-restaurant",
+  "ion:ios-return-left",
+  "ion:ios-return-right",
+  "ion:ios-reverse-camera",
+  "ion:ios-reverse-camera-outline",
+  "ion:ios-rewind",
+  "ion:ios-rewind-outline",
+  "ion:ios-ribbon",
+  "ion:ios-rocket",
+  "ion:ios-rose",
+  "ion:ios-rose-outline",
+  "ion:ios-sad",
+  "ion:ios-save",
+  "ion:ios-school",
+  "ion:ios-search",
+  "ion:ios-search-strong",
+  "ion:ios-send",
+  "ion:ios-settings",
+  "ion:ios-settings-strong",
+  "ion:ios-share",
+  "ion:ios-share-alt",
+  "ion:ios-shirt",
+  "ion:ios-shuffle",
+  "ion:ios-shuffle-strong",
+  "ion:ios-skip-backward",
+  "ion:ios-skip-forward",
+  "ion:ios-skipbackward",
+  "ion:ios-skipbackward-outline",
+  "ion:ios-skipforward",
+  "ion:ios-skipforward-outline",
+  "ion:ios-snow",
+  "ion:ios-snowy",
+  "ion:ios-speedometer",
+  "ion:ios-speedometer-outline",
+  "ion:ios-square",
+  "ion:ios-square-outline",
+  "ion:ios-star",
+  "ion:ios-star-half",
+  "ion:ios-star-outline",
+  "ion:ios-stats",
+  "ion:ios-stopwatch",
+  "ion:ios-stopwatch-outline",
+  "ion:ios-subway",
+  "ion:ios-sunny",
+  "ion:ios-sunny-outline",
+  "ion:ios-swap",
+  "ion:ios-switch",
+  "ion:ios-sync",
+  "ion:ios-tablet-landscape",
+  "ion:ios-tablet-portrait",
+  "ion:ios-telephone",
+  "ion:ios-telephone-outline",
+  "ion:ios-tennisball",
+  "ion:ios-tennisball-outline",
+  "ion:ios-text",
+  "ion:ios-thermometer",
+  "ion:ios-thumbs-down",
+  "ion:ios-thumbs-up",
+  "ion:ios-thunderstorm",
+  "ion:ios-thunderstorm-outline",
+  "ion:ios-time",
+  "ion:ios-time-outline",
+  "ion:ios-timer",
+  "ion:ios-timer-outline",
+  "ion:ios-today",
+  "ion:ios-toggle",
+  "ion:ios-toggle-outline",
+  "ion:ios-train",
+  "ion:ios-transgender",
+  "ion:ios-trash",
+  "ion:ios-trash-outline",
+  "ion:ios-trending-down",
+  "ion:ios-trending-up",
+  "ion:ios-trophy",
+  "ion:ios-tv",
+  "ion:ios-umbrella",
+  "ion:ios-undo",
+  "ion:ios-undo-outline",
+  "ion:ios-unlock",
+  "ion:ios-unlocked",
+  "ion:ios-unlocked-outline",
+  "ion:ios-upload",
+  "ion:ios-upload-outline",
+  "ion:ios-videocam",
+  "ion:ios-videocam-outline",
+  "ion:ios-volume-high",
+  "ion:ios-volume-low",
+  "ion:ios-volume-mute",
+  "ion:ios-volume-off",
+  "ion:ios-walk",
+  "ion:ios-wallet",
+  "ion:ios-warning",
+  "ion:ios-watch",
+  "ion:ios-water",
+  "ion:ios-wifi",
+  "ion:ios-wine",
+  "ion:ios-wineglass",
+  "ion:ios-wineglass-outline",
+  "ion:ios-woman",
+  "ion:ios-world",
+  "ion:ios-world-outline",
+  "ion:ipad",
+  "ion:iphone",
+  "ion:ipod",
+  "ion:jet",
+  "ion:journal",
+  "ion:journal-outline",
+  "ion:journal-sharp",
+  "ion:key",
+  "ion:key-outline",
+  "ion:key-sharp",
+  "ion:keypad",
+  "ion:keypad-outline",
+  "ion:keypad-sharp",
+  "ion:knife",
+  "ion:language",
+  "ion:language-outline",
+  "ion:language-sharp",
+  "ion:laptop",
+  "ion:laptop-outline",
+  "ion:laptop-sharp",
+  "ion:layers",
+  "ion:layers-outline",
+  "ion:layers-sharp",
+  "ion:leaf",
+  "ion:leaf-outline",
+  "ion:leaf-sharp",
+  "ion:levels",
+  "ion:library",
+  "ion:library-outline",
+  "ion:library-sharp",
+  "ion:lightbulb",
+  "ion:link",
+  "ion:link-outline",
+  "ion:link-sharp",
+  "ion:list",
+  "ion:list-circle",
+  "ion:list-circle-outline",
+  "ion:list-circle-sharp",
+  "ion:list-outline",
+  "ion:list-sharp",
+  "ion:load-a",
+  "ion:load-b",
+  "ion:load-c",
+  "ion:load-d",
+  "ion:locate",
+  "ion:locate-outline",
+  "ion:locate-sharp",
+  "ion:location",
+  "ion:location-outline",
+  "ion:location-sharp",
+  "ion:lock-closed",
+  "ion:lock-closed-outline",
+  "ion:lock-closed-sharp",
+  "ion:lock-combination",
+  "ion:lock-open",
+  "ion:lock-open-outline",
+  "ion:lock-open-sharp",
+  "ion:locked",
+  "ion:log-in",
+  "ion:log-in-outline",
+  "ion:log-in-sharp",
+  "ion:log-out",
+  "ion:log-out-outline",
+  "ion:log-out-sharp",
+  "ion:logo-alipay",
+  "ion:logo-amazon",
+  "ion:logo-amplify",
+  "ion:logo-android",
+  "ion:logo-angular",
+  "ion:logo-apple",
+  "ion:logo-apple-appstore",
+  "ion:logo-apple-ar",
+  "ion:logo-behance",
+  "ion:logo-bitbucket",
+  "ion:logo-bitcoin",
+  "ion:logo-buffer",
+  "ion:logo-capacitor",
+  "ion:logo-chrome",
+  "ion:logo-closed-captioning",
+  "ion:logo-codepen",
+  "ion:logo-css3",
+  "ion:logo-designernews",
+  "ion:logo-deviantart",
+  "ion:logo-discord",
+  "ion:logo-docker",
+  "ion:logo-dribbble",
+  "ion:logo-dropbox",
+  "ion:logo-edge",
+  "ion:logo-electron",
+  "ion:logo-euro",
+  "ion:logo-facebook",
+  "ion:logo-figma",
+  "ion:logo-firebase",
+  "ion:logo-firefox",
+  "ion:logo-flickr",
+  "ion:logo-foursquare",
+  "ion:logo-freebsd-devil",
+  "ion:logo-game-controller-a",
+  "ion:logo-game-controller-b",
+  "ion:logo-github",
+  "ion:logo-gitlab",
+  "ion:logo-google",
+  "ion:logo-google-playstore",
+  "ion:logo-googleplus",
+  "ion:logo-hackernews",
+  "ion:logo-html5",
+  "ion:logo-instagram",
+  "ion:logo-ionic",
+  "ion:logo-ionitron",
+  "ion:logo-javascript",
+  "ion:logo-laravel",
+  "ion:logo-linkedin",
+  "ion:logo-markdown",
+  "ion:logo-mastodon",
+  "ion:logo-medium",
+  "ion:logo-microsoft",
+  "ion:logo-model-s",
+  "ion:logo-no-smoking",
+  "ion:logo-nodejs",
+  "ion:logo-npm",
+  "ion:logo-octocat",
+  "ion:logo-paypal",
+  "ion:logo-pinterest",
+  "ion:logo-playstation",
+  "ion:logo-polymer",
+  "ion:logo-pwa",
+  "ion:logo-python",
+  "ion:logo-react",
+  "ion:logo-reddit",
+  "ion:logo-rss",
+  "ion:logo-sass",
+  "ion:logo-skype",
+  "ion:logo-slack",
+  "ion:logo-snapchat",
+  "ion:logo-soundcloud",
+  "ion:logo-stackoverflow",
+  "ion:logo-steam",
+  "ion:logo-stencil",
+  "ion:logo-tableau",
+  "ion:logo-tiktok",
+  "ion:logo-tumblr",
+  "ion:logo-tux",
+  "ion:logo-twitch",
+  "ion:logo-twitter",
+  "ion:logo-usd",
+  "ion:logo-venmo",
+  "ion:logo-vercel",
+  "ion:logo-vimeo",
+  "ion:logo-vk",
+  "ion:logo-vue",
+  "ion:logo-web-component",
+  "ion:logo-wechat",
+  "ion:logo-whatsapp",
+  "ion:logo-windows",
+  "ion:logo-wordpress",
+  "ion:logo-xbox",
+  "ion:logo-xing",
+  "ion:logo-yahoo",
+  "ion:logo-yen",
+  "ion:logo-youtube",
+  "ion:loop",
+  "ion:magnet",
+  "ion:magnet-outline",
+  "ion:magnet-sharp",
+  "ion:mail",
+  "ion:mail-open",
+  "ion:mail-open-outline",
+  "ion:mail-open-sharp",
+  "ion:mail-outline",
+  "ion:mail-sharp",
+  "ion:mail-unread",
+  "ion:mail-unread-outline",
+  "ion:mail-unread-sharp",
+  "ion:male",
+  "ion:male-female",
+  "ion:male-female-outline",
+  "ion:male-female-sharp",
+  "ion:male-outline",
+  "ion:male-sharp",
+  "ion:man",
+  "ion:man-outline",
+  "ion:man-sharp",
+  "ion:map",
+  "ion:map-outline",
+  "ion:map-sharp",
+  "ion:md-add",
+  "ion:md-add-circle",
+  "ion:md-add-circle-outline",
+  "ion:md-airplane",
+  "ion:md-alarm",
+  "ion:md-albums",
+  "ion:md-alert",
+  "ion:md-american-football",
+  "ion:md-analytics",
+  "ion:md-aperture",
+  "ion:md-apps",
+  "ion:md-appstore",
+  "ion:md-archive",
+  "ion:md-arrow-back",
+  "ion:md-arrow-down",
+  "ion:md-arrow-dropdown",
+  "ion:md-arrow-dropdown-circle",
+  "ion:md-arrow-dropleft",
+  "ion:md-arrow-dropleft-circle",
+  "ion:md-arrow-dropright",
+  "ion:md-arrow-dropright-circle",
+  "ion:md-arrow-dropup",
+  "ion:md-arrow-dropup-circle",
+  "ion:md-arrow-forward",
+  "ion:md-arrow-round-back",
+  "ion:md-arrow-round-down",
+  "ion:md-arrow-round-forward",
+  "ion:md-arrow-round-up",
+  "ion:md-arrow-up",
+  "ion:md-at",
+  "ion:md-attach",
+  "ion:md-backspace",
+  "ion:md-barcode",
+  "ion:md-baseball",
+  "ion:md-basket",
+  "ion:md-basketball",
+  "ion:md-battery-charging",
+  "ion:md-battery-dead",
+  "ion:md-battery-full",
+  "ion:md-beaker",
+  "ion:md-bed",
+  "ion:md-beer",
+  "ion:md-bicycle",
+  "ion:md-bluetooth",
+  "ion:md-boat",
+  "ion:md-body",
+  "ion:md-bonfire",
+  "ion:md-book",
+  "ion:md-bookmark",
+  "ion:md-bookmarks",
+  "ion:md-bowtie",
+  "ion:md-briefcase",
+  "ion:md-browsers",
+  "ion:md-brush",
+  "ion:md-bug",
+  "ion:md-build",
+  "ion:md-bulb",
+  "ion:md-bus",
+  "ion:md-business",
+  "ion:md-cafe",
+  "ion:md-calculator",
+  "ion:md-calendar",
+  "ion:md-call",
+  "ion:md-camera",
+  "ion:md-car",
+  "ion:md-card",
+  "ion:md-cart",
+  "ion:md-cash",
+  "ion:md-cellular",
+  "ion:md-chatboxes",
+  "ion:md-chatbubbles",
+  "ion:md-checkbox",
+  "ion:md-checkbox-outline",
+  "ion:md-checkmark",
+  "ion:md-checkmark-circle",
+  "ion:md-checkmark-circle-outline",
+  "ion:md-clipboard",
+  "ion:md-clock",
+  "ion:md-close",
+  "ion:md-close-circle",
+  "ion:md-close-circle-outline",
+  "ion:md-cloud",
+  "ion:md-cloud-circle",
+  "ion:md-cloud-done",
+  "ion:md-cloud-download",
+  "ion:md-cloud-outline",
+  "ion:md-cloud-upload",
+  "ion:md-cloudy",
+  "ion:md-cloudy-night",
+  "ion:md-code",
+  "ion:md-code-download",
+  "ion:md-code-working",
+  "ion:md-cog",
+  "ion:md-color-fill",
+  "ion:md-color-filter",
+  "ion:md-color-palette",
+  "ion:md-color-wand",
+  "ion:md-compass",
+  "ion:md-construct",
+  "ion:md-contact",
+  "ion:md-contacts",
+  "ion:md-contract",
+  "ion:md-contrast",
+  "ion:md-copy",
+  "ion:md-create",
+  "ion:md-crop",
+  "ion:md-cube",
+  "ion:md-cut",
+  "ion:md-desktop",
+  "ion:md-disc",
+  "ion:md-document",
+  "ion:md-done-all",
+  "ion:md-download",
+  "ion:md-easel",
+  "ion:md-egg",
+  "ion:md-exit",
+  "ion:md-expand",
+  "ion:md-eye",
+  "ion:md-eye-off",
+  "ion:md-fastforward",
+  "ion:md-female",
+  "ion:md-filing",
+  "ion:md-film",
+  "ion:md-finger-print",
+  "ion:md-fitness",
+  "ion:md-flag",
+  "ion:md-flame",
+  "ion:md-flash",
+  "ion:md-flash-off",
+  "ion:md-flashlight",
+  "ion:md-flask",
+  "ion:md-flower",
+  "ion:md-folder",
+  "ion:md-folder-open",
+  "ion:md-football",
+  "ion:md-funnel",
+  "ion:md-gift",
+  "ion:md-git-branch",
+  "ion:md-git-commit",
+  "ion:md-git-compare",
+  "ion:md-git-merge",
+  "ion:md-git-network",
+  "ion:md-git-pull-request",
+  "ion:md-glasses",
+  "ion:md-globe",
+  "ion:md-grid",
+  "ion:md-hammer",
+  "ion:md-hand",
+  "ion:md-happy",
+  "ion:md-headset",
+  "ion:md-heart",
+  "ion:md-heart-dislike",
+  "ion:md-heart-empty",
+  "ion:md-heart-half",
+  "ion:md-help",
+  "ion:md-help-buoy",
+  "ion:md-help-circle",
+  "ion:md-help-circle-outline",
+  "ion:md-home",
+  "ion:md-hourglass",
+  "ion:md-ice-cream",
+  "ion:md-image",
+  "ion:md-images",
+  "ion:md-infinite",
+  "ion:md-information",
+  "ion:md-information-circle",
+  "ion:md-information-circle-outline",
+  "ion:md-jet",
+  "ion:md-journal",
+  "ion:md-key",
+  "ion:md-keypad",
+  "ion:md-laptop",
+  "ion:md-leaf",
+  "ion:md-link",
+  "ion:md-list",
+  "ion:md-list-box",
+  "ion:md-locate",
+  "ion:md-lock",
+  "ion:md-log-in",
+  "ion:md-log-out",
+  "ion:md-magnet",
+  "ion:md-mail",
+  "ion:md-mail-open",
+  "ion:md-mail-unread",
+  "ion:md-male",
+  "ion:md-man",
+  "ion:md-map",
+  "ion:md-medal",
+  "ion:md-medical",
+  "ion:md-medkit",
+  "ion:md-megaphone",
+  "ion:md-menu",
+  "ion:md-mic",
+  "ion:md-mic-off",
+  "ion:md-microphone",
+  "ion:md-moon",
+  "ion:md-more",
+  "ion:md-move",
+  "ion:md-musical-note",
+  "ion:md-musical-notes",
+  "ion:md-navigate",
+  "ion:md-notifications",
+  "ion:md-notifications-off",
+  "ion:md-notifications-outline",
+  "ion:md-nuclear",
+  "ion:md-nutrition",
+  "ion:md-open",
+  "ion:md-options",
+  "ion:md-outlet",
+  "ion:md-paper",
+  "ion:md-paper-plane",
+  "ion:md-partly-sunny",
+  "ion:md-pause",
+  "ion:md-paw",
+  "ion:md-people",
+  "ion:md-person",
+  "ion:md-person-add",
+  "ion:md-phone-landscape",
+  "ion:md-phone-portrait",
+  "ion:md-photos",
+  "ion:md-pie",
+  "ion:md-pin",
+  "ion:md-pint",
+  "ion:md-pizza",
+  "ion:md-planet",
+  "ion:md-play",
+  "ion:md-play-circle",
+  "ion:md-podium",
+  "ion:md-power",
+  "ion:md-pricetag",
+  "ion:md-pricetags",
+  "ion:md-print",
+  "ion:md-pulse",
+  "ion:md-qr-scanner",
+  "ion:md-quote",
+  "ion:md-radio",
+  "ion:md-radio-button-off",
+  "ion:md-radio-button-on",
+  "ion:md-rainy",
+  "ion:md-recording",
+  "ion:md-redo",
+  "ion:md-refresh",
+  "ion:md-refresh-circle",
+  "ion:md-remove",
+  "ion:md-remove-circle",
+  "ion:md-remove-circle-outline",
+  "ion:md-reorder",
+  "ion:md-repeat",
+  "ion:md-resize",
+  "ion:md-restaurant",
+  "ion:md-return-left",
+  "ion:md-return-right",
+  "ion:md-reverse-camera",
+  "ion:md-rewind",
+  "ion:md-ribbon",
+  "ion:md-rocket",
+  "ion:md-rose",
+  "ion:md-sad",
+  "ion:md-save",
+  "ion:md-school",
+  "ion:md-search",
+  "ion:md-send",
+  "ion:md-settings",
+  "ion:md-share",
+  "ion:md-share-alt",
+  "ion:md-shirt",
+  "ion:md-shuffle",
+  "ion:md-skip-backward",
+  "ion:md-skip-forward",
+  "ion:md-snow",
+  "ion:md-speedometer",
+  "ion:md-square",
+  "ion:md-square-outline",
+  "ion:md-star",
+  "ion:md-star-half",
+  "ion:md-star-outline",
+  "ion:md-stats",
+  "ion:md-stopwatch",
+  "ion:md-subway",
+  "ion:md-sunny",
+  "ion:md-swap",
+  "ion:md-switch",
+  "ion:md-sync",
+  "ion:md-tablet-landscape",
+  "ion:md-tablet-portrait",
+  "ion:md-tennisball",
+  "ion:md-text",
+  "ion:md-thermometer",
+  "ion:md-thumbs-down",
+  "ion:md-thumbs-up",
+  "ion:md-thunderstorm",
+  "ion:md-time",
+  "ion:md-timer",
+  "ion:md-today",
+  "ion:md-train",
+  "ion:md-transgender",
+  "ion:md-trash",
+  "ion:md-trending-down",
+  "ion:md-trending-up",
+  "ion:md-trophy",
+  "ion:md-tv",
+  "ion:md-umbrella",
+  "ion:md-undo",
+  "ion:md-unlock",
+  "ion:md-videocam",
+  "ion:md-volume-high",
+  "ion:md-volume-low",
+  "ion:md-volume-mute",
+  "ion:md-volume-off",
+  "ion:md-walk",
+  "ion:md-wallet",
+  "ion:md-warning",
+  "ion:md-watch",
+  "ion:md-water",
+  "ion:md-wifi",
+  "ion:md-wine",
+  "ion:md-woman",
+  "ion:medal",
+  "ion:medal-outline",
+  "ion:medal-sharp",
+  "ion:medical",
+  "ion:medical-outline",
+  "ion:medical-sharp",
+  "ion:medkit",
+  "ion:medkit-outline",
+  "ion:medkit-sharp",
+  "ion:megaphone",
+  "ion:megaphone-outline",
+  "ion:megaphone-sharp",
+  "ion:menu",
+  "ion:menu-outline",
+  "ion:menu-sharp",
+  "ion:merge",
+  "ion:mic",
+  "ion:mic-a",
+  "ion:mic-b",
+  "ion:mic-c",
+  "ion:mic-circle",
+  "ion:mic-circle-outline",
+  "ion:mic-circle-sharp",
+  "ion:mic-off",
+  "ion:mic-off-circle",
+  "ion:mic-off-circle-outline",
+  "ion:mic-off-circle-sharp",
+  "ion:mic-off-outline",
+  "ion:mic-off-sharp",
+  "ion:mic-outline",
+  "ion:mic-sharp",
+  "ion:minus",
+  "ion:minus-circled",
+  "ion:minus-round",
+  "ion:model-s",
+  "ion:monitor",
+  "ion:moon",
+  "ion:moon-outline",
+  "ion:moon-sharp",
+  "ion:more",
+  "ion:mouse",
+  "ion:move",
+  "ion:move-outline",
+  "ion:move-sharp",
+  "ion:music-note",
+  "ion:musical-note",
+  "ion:musical-note-outline",
+  "ion:musical-note-sharp",
+  "ion:musical-notes",
+  "ion:musical-notes-outline",
+  "ion:musical-notes-sharp",
+  "ion:navicon",
+  "ion:navicon-round",
+  "ion:navigate",
+  "ion:navigate-circle",
+  "ion:navigate-circle-outline",
+  "ion:navigate-circle-sharp",
+  "ion:navigate-outline",
+  "ion:navigate-sharp",
+  "ion:network",
+  "ion:newspaper",
+  "ion:newspaper-outline",
+  "ion:newspaper-sharp",
+  "ion:no-smoking",
+  "ion:notifications",
+  "ion:notifications-circle",
+  "ion:notifications-circle-outline",
+  "ion:notifications-circle-sharp",
+  "ion:notifications-off",
+  "ion:notifications-off-circle",
+  "ion:notifications-off-circle-outline",
+  "ion:notifications-off-circle-sharp",
+  "ion:notifications-off-outline",
+  "ion:notifications-off-sharp",
+  "ion:notifications-outline",
+  "ion:notifications-sharp",
+  "ion:nuclear",
+  "ion:nuclear-outline",
+  "ion:nuclear-sharp",
+  "ion:nutrition",
+  "ion:nutrition-outline",
+  "ion:nutrition-sharp",
+  "ion:open",
+  "ion:open-outline",
+  "ion:open-sharp",
+  "ion:options",
+  "ion:options-outline",
+  "ion:options-sharp",
+  "ion:outlet",
+  "ion:paintbrush",
+  "ion:paintbucket",
+  "ion:paper-airplane",
+  "ion:paper-plane",
+  "ion:paper-plane-outline",
+  "ion:paper-plane-sharp",
+  "ion:paperclip",
+  "ion:partly-sunny",
+  "ion:partly-sunny-outline",
+  "ion:partly-sunny-sharp",
+  "ion:pause",
+  "ion:pause-circle",
+  "ion:pause-circle-outline",
+  "ion:pause-circle-sharp",
+  "ion:pause-outline",
+  "ion:pause-sharp",
+  "ion:paw",
+  "ion:paw-outline",
+  "ion:paw-sharp",
+  "ion:pencil",
+  "ion:pencil-outline",
+  "ion:pencil-sharp",
+  "ion:people",
+  "ion:people-circle",
+  "ion:people-circle-outline",
+  "ion:people-circle-sharp",
+  "ion:people-outline",
+  "ion:people-sharp",
+  "ion:person",
+  "ion:person-add",
+  "ion:person-add-outline",
+  "ion:person-add-sharp",
+  "ion:person-circle",
+  "ion:person-circle-outline",
+  "ion:person-circle-sharp",
+  "ion:person-outline",
+  "ion:person-remove",
+  "ion:person-remove-outline",
+  "ion:person-remove-sharp",
+  "ion:person-sharp",
+  "ion:person-stalker",
+  "ion:phone-landscape",
+  "ion:phone-landscape-outline",
+  "ion:phone-landscape-sharp",
+  "ion:phone-portrait",
+  "ion:phone-portrait-outline",
+  "ion:phone-portrait-sharp",
+  "ion:pie-chart",
+  "ion:pie-chart-outline",
+  "ion:pie-chart-sharp",
+  "ion:pin",
+  "ion:pin-outline",
+  "ion:pin-sharp",
+  "ion:pinpoint",
+  "ion:pint",
+  "ion:pint-outline",
+  "ion:pint-sharp",
+  "ion:pizza",
+  "ion:pizza-outline",
+  "ion:pizza-sharp",
+  "ion:plane",
+  "ion:planet",
+  "ion:planet-outline",
+  "ion:planet-sharp",
+  "ion:play",
+  "ion:play-back",
+  "ion:play-back-circle",
+  "ion:play-back-circle-outline",
+  "ion:play-back-circle-sharp",
+  "ion:play-back-outline",
+  "ion:play-back-sharp",
+  "ion:play-circle",
+  "ion:play-circle-outline",
+  "ion:play-circle-sharp",
+  "ion:play-forward",
+  "ion:play-forward-circle",
+  "ion:play-forward-circle-outline",
+  "ion:play-forward-circle-sharp",
+  "ion:play-forward-outline",
+  "ion:play-forward-sharp",
+  "ion:play-outline",
+  "ion:play-sharp",
+  "ion:play-skip-back",
+  "ion:play-skip-back-circle",
+  "ion:play-skip-back-circle-outline",
+  "ion:play-skip-back-circle-sharp",
+  "ion:play-skip-back-outline",
+  "ion:play-skip-back-sharp",
+  "ion:play-skip-forward",
+  "ion:play-skip-forward-circle",
+  "ion:play-skip-forward-circle-outline",
+  "ion:play-skip-forward-circle-sharp",
+  "ion:play-skip-forward-outline",
+  "ion:play-skip-forward-sharp",
+  "ion:playstation",
+  "ion:plus",
+  "ion:plus-circled",
+  "ion:plus-round",
+  "ion:podium",
+  "ion:podium-outline",
+  "ion:podium-sharp",
+  "ion:pound",
+  "ion:power",
+  "ion:power-outline",
+  "ion:power-sharp",
+  "ion:pricetag",
+  "ion:pricetag-outline",
+  "ion:pricetag-sharp",
+  "ion:pricetags",
+  "ion:pricetags-outline",
+  "ion:pricetags-sharp",
+  "ion:print",
+  "ion:print-outline",
+  "ion:print-sharp",
+  "ion:printer",
+  "ion:prism",
+  "ion:prism-outline",
+  "ion:prism-sharp",
+  "ion:pull-request",
+  "ion:pulse",
+  "ion:pulse-outline",
+  "ion:pulse-sharp",
+  "ion:push",
+  "ion:push-outline",
+  "ion:push-sharp",
+  "ion:qr-code",
+  "ion:qr-code-outline",
+  "ion:qr-code-sharp",
+  "ion:qr-scanner",
+  "ion:quote",
+  "ion:radio",
+  "ion:radio-button-off",
+  "ion:radio-button-off-outline",
+  "ion:radio-button-off-sharp",
+  "ion:radio-button-on",
+  "ion:radio-button-on-outline",
+  "ion:radio-button-on-sharp",
+  "ion:radio-outline",
+  "ion:radio-sharp",
+  "ion:radio-waves",
+  "ion:rainy",
+  "ion:rainy-outline",
+  "ion:rainy-sharp",
+  "ion:reader",
+  "ion:reader-outline",
+  "ion:reader-sharp",
+  "ion:receipt",
+  "ion:receipt-outline",
+  "ion:receipt-sharp",
+  "ion:record",
+  "ion:recording",
+  "ion:recording-outline",
+  "ion:recording-sharp",
+  "ion:refresh",
+  "ion:refresh-circle",
+  "ion:refresh-circle-outline",
+  "ion:refresh-circle-sharp",
+  "ion:refresh-outline",
+  "ion:refresh-sharp",
+  "ion:reload",
+  "ion:reload-circle",
+  "ion:reload-circle-outline",
+  "ion:reload-circle-sharp",
+  "ion:reload-outline",
+  "ion:reload-sharp",
+  "ion:remove",
+  "ion:remove-circle",
+  "ion:remove-circle-outline",
+  "ion:remove-circle-sharp",
+  "ion:remove-outline",
+  "ion:remove-sharp",
+  "ion:reorder-four",
+  "ion:reorder-four-outline",
+  "ion:reorder-four-sharp",
+  "ion:reorder-three",
+  "ion:reorder-three-outline",
+  "ion:reorder-three-sharp",
+  "ion:reorder-two",
+  "ion:reorder-two-outline",
+  "ion:reorder-two-sharp",
+  "ion:repeat",
+  "ion:repeat-outline",
+  "ion:repeat-sharp",
+  "ion:reply",
+  "ion:reply-all",
+  "ion:resize",
+  "ion:resize-outline",
+  "ion:resize-sharp",
+  "ion:restaurant",
+  "ion:restaurant-outline",
+  "ion:restaurant-sharp",
+  "ion:return-down-back",
+  "ion:return-down-back-outline",
+  "ion:return-down-back-sharp",
+  "ion:return-down-forward",
+  "ion:return-down-forward-outline",
+  "ion:return-down-forward-sharp",
+  "ion:return-up-back",
+  "ion:return-up-back-outline",
+  "ion:return-up-back-sharp",
+  "ion:return-up-forward",
+  "ion:return-up-forward-outline",
+  "ion:return-up-forward-sharp",
+  "ion:ribbon",
+  "ion:ribbon-a",
+  "ion:ribbon-b",
+  "ion:ribbon-outline",
+  "ion:ribbon-sharp",
+  "ion:rocket",
+  "ion:rocket-outline",
+  "ion:rocket-sharp",
+  "ion:rose",
+  "ion:rose-outline",
+  "ion:rose-sharp",
+  "ion:sad",
+  "ion:sad-outline",
+  "ion:sad-sharp",
+  "ion:save",
+  "ion:save-outline",
+  "ion:save-sharp",
+  "ion:scale",
+  "ion:scale-outline",
+  "ion:scale-sharp",
+  "ion:scan",
+  "ion:scan-circle",
+  "ion:scan-circle-outline",
+  "ion:scan-circle-sharp",
+  "ion:scan-outline",
+  "ion:scan-sharp",
+  "ion:school",
+  "ion:school-outline",
+  "ion:school-sharp",
+  "ion:scissors",
+  "ion:search",
+  "ion:search-circle",
+  "ion:search-circle-outline",
+  "ion:search-circle-sharp",
+  "ion:search-outline",
+  "ion:search-sharp",
+  "ion:send",
+  "ion:send-outline",
+  "ion:send-sharp",
+  "ion:server",
+  "ion:server-outline",
+  "ion:server-sharp",
+  "ion:settings",
+  "ion:settings-outline",
+  "ion:settings-sharp",
+  "ion:shapes",
+  "ion:shapes-outline",
+  "ion:shapes-sharp",
+  "ion:share",
+  "ion:share-outline",
+  "ion:share-sharp",
+  "ion:share-social",
+  "ion:share-social-outline",
+  "ion:share-social-sharp",
+  "ion:shield",
+  "ion:shield-checkmark",
+  "ion:shield-checkmark-outline",
+  "ion:shield-checkmark-sharp",
+  "ion:shield-half",
+  "ion:shield-half-outline",
+  "ion:shield-half-sharp",
+  "ion:shield-outline",
+  "ion:shield-sharp",
+  "ion:shirt",
+  "ion:shirt-outline",
+  "ion:shirt-sharp",
+  "ion:shuffle",
+  "ion:shuffle-outline",
+  "ion:shuffle-sharp",
+  "ion:skip-backward",
+  "ion:skip-forward",
+  "ion:skull",
+  "ion:skull-outline",
+  "ion:skull-sharp",
+  "ion:snow",
+  "ion:snow-outline",
+  "ion:snow-sharp",
+  "ion:social-android-outline",
+  "ion:social-angular-outline",
+  "ion:social-apple-outline",
+  "ion:social-bitcoin-outline",
+  "ion:social-buffer-outline",
+  "ion:social-chrome-outline",
+  "ion:social-codepen-outline",
+  "ion:social-css3-outline",
+  "ion:social-designernews-outline",
+  "ion:social-dribbble",
+  "ion:social-dropbox-outline",
+  "ion:social-euro-outline",
+  "ion:social-facebook",
+  "ion:social-facebook-outline",
+  "ion:social-foursquare-outline",
+  "ion:social-github-outline",
+  "ion:social-google",
+  "ion:social-google-outline",
+  "ion:social-googleplus",
+  "ion:social-googleplus-outline",
+  "ion:social-hackernews-outline",
+  "ion:social-html5-outline",
+  "ion:social-instagram",
+  "ion:social-instagram-outline",
+  "ion:social-javascript-outline",
+  "ion:social-linkedin-outline",
+  "ion:social-octocat",
+  "ion:social-pinterest-outline",
+  "ion:social-reddit",
+  "ion:social-rss-outline",
+  "ion:social-skype-outline",
+  "ion:social-snapchat-outline",
+  "ion:social-tumblr-outline",
+  "ion:social-tux",
+  "ion:social-twitch",
+  "ion:social-twitter-outline",
+  "ion:social-usd-outline",
+  "ion:social-vimeo",
+  "ion:social-vimeo-outline",
+  "ion:social-whatsapp-outline",
+  "ion:social-windows-outline",
+  "ion:social-wordpress-outline",
+  "ion:social-yahoo-outline",
+  "ion:social-yen-outline",
+  "ion:social-youtube-outline",
+  "ion:soup-can",
+  "ion:soup-can-outline",
+  "ion:sparkles",
+  "ion:sparkles-outline",
+  "ion:sparkles-sharp",
+  "ion:speakerphone",
+  "ion:speedometer",
+  "ion:speedometer-outline",
+  "ion:speedometer-sharp",
+  "ion:spoon",
+  "ion:square",
+  "ion:square-outline",
+  "ion:square-sharp",
+  "ion:star",
+  "ion:star-half",
+  "ion:star-half-outline",
+  "ion:star-half-sharp",
+  "ion:star-outline",
+  "ion:star-sharp",
+  "ion:stats-bars",
+  "ion:stats-chart",
+  "ion:stats-chart-outline",
+  "ion:stats-chart-sharp",
+  "ion:steam",
+  "ion:stop",
+  "ion:stop-circle",
+  "ion:stop-circle-outline",
+  "ion:stop-circle-sharp",
+  "ion:stop-outline",
+  "ion:stop-sharp",
+  "ion:stopwatch",
+  "ion:stopwatch-outline",
+  "ion:stopwatch-sharp",
+  "ion:storefront",
+  "ion:storefront-outline",
+  "ion:storefront-sharp",
+  "ion:subway",
+  "ion:subway-outline",
+  "ion:subway-sharp",
+  "ion:sunny",
+  "ion:sunny-outline",
+  "ion:sunny-sharp",
+  "ion:swap-horizontal",
+  "ion:swap-horizontal-outline",
+  "ion:swap-horizontal-sharp",
+  "ion:swap-vertical",
+  "ion:swap-vertical-outline",
+  "ion:swap-vertical-sharp",
+  "ion:sync",
+  "ion:sync-circle",
+  "ion:sync-circle-outline",
+  "ion:sync-circle-sharp",
+  "ion:sync-outline",
+  "ion:sync-sharp",
+  "ion:tablet-landscape",
+  "ion:tablet-landscape-outline",
+  "ion:tablet-landscape-sharp",
+  "ion:tablet-portrait",
+  "ion:tablet-portrait-outline",
+  "ion:tablet-portrait-sharp",
+  "ion:telescope",
+  "ion:telescope-outline",
+  "ion:telescope-sharp",
+  "ion:tennisball",
+  "ion:tennisball-outline",
+  "ion:tennisball-sharp",
+  "ion:terminal",
+  "ion:terminal-outline",
+  "ion:terminal-sharp",
+  "ion:text",
+  "ion:text-outline",
+  "ion:text-sharp",
+  "ion:thermometer",
+  "ion:thermometer-outline",
+  "ion:thermometer-sharp",
+  "ion:thumbs-down",
+  "ion:thumbs-down-outline",
+  "ion:thumbs-down-sharp",
+  "ion:thumbs-up",
+  "ion:thumbs-up-outline",
+  "ion:thumbs-up-sharp",
+  "ion:thumbsdown",
+  "ion:thumbsup",
+  "ion:thunderstorm",
+  "ion:thunderstorm-outline",
+  "ion:thunderstorm-sharp",
+  "ion:ticket",
+  "ion:ticket-outline",
+  "ion:ticket-sharp",
+  "ion:time",
+  "ion:time-outline",
+  "ion:time-sharp",
+  "ion:timer",
+  "ion:timer-outline",
+  "ion:timer-sharp",
+  "ion:today",
+  "ion:today-outline",
+  "ion:today-sharp",
+  "ion:toggle",
+  "ion:toggle-filled",
+  "ion:toggle-outline",
+  "ion:toggle-sharp",
+  "ion:trail-sign",
+  "ion:trail-sign-outline",
+  "ion:trail-sign-sharp",
+  "ion:train",
+  "ion:train-outline",
+  "ion:train-sharp",
+  "ion:transgender",
+  "ion:transgender-outline",
+  "ion:transgender-sharp",
+  "ion:trash",
+  "ion:trash-a",
+  "ion:trash-b",
+  "ion:trash-bin",
+  "ion:trash-bin-outline",
+  "ion:trash-bin-sharp",
+  "ion:trash-outline",
+  "ion:trash-sharp",
+  "ion:trending-down",
+  "ion:trending-down-outline",
+  "ion:trending-down-sharp",
+  "ion:trending-up",
+  "ion:trending-up-outline",
+  "ion:trending-up-sharp",
+  "ion:triangle",
+  "ion:triangle-outline",
+  "ion:triangle-sharp",
+  "ion:trophy",
+  "ion:trophy-outline",
+  "ion:trophy-sharp",
+  "ion:tshirt",
+  "ion:tshirt-outline",
+  "ion:tv",
+  "ion:tv-outline",
+  "ion:tv-sharp",
+  "ion:umbrella",
+  "ion:umbrella-outline",
+  "ion:umbrella-sharp",
+  "ion:university",
+  "ion:unlink",
+  "ion:unlink-outline",
+  "ion:unlink-sharp",
+  "ion:unlocked",
+  "ion:upload",
+  "ion:usb",
+  "ion:videocam",
+  "ion:videocam-off",
+  "ion:videocam-off-outline",
+  "ion:videocam-off-sharp",
+  "ion:videocam-outline",
+  "ion:videocam-sharp",
+  "ion:videocamera",
+  "ion:volume-high",
+  "ion:volume-high-outline",
+  "ion:volume-high-sharp",
+  "ion:volume-low",
+  "ion:volume-low-outline",
+  "ion:volume-low-sharp",
+  "ion:volume-medium",
+  "ion:volume-medium-outline",
+  "ion:volume-medium-sharp",
+  "ion:volume-mute",
+  "ion:volume-mute-outline",
+  "ion:volume-mute-sharp",
+  "ion:volume-off",
+  "ion:volume-off-outline",
+  "ion:volume-off-sharp",
+  "ion:walk",
+  "ion:walk-outline",
+  "ion:walk-sharp",
+  "ion:wallet",
+  "ion:wallet-outline",
+  "ion:wallet-sharp",
+  "ion:wand",
+  "ion:warning",
+  "ion:warning-outline",
+  "ion:warning-sharp",
+  "ion:watch",
+  "ion:watch-outline",
+  "ion:watch-sharp",
+  "ion:water",
+  "ion:water-outline",
+  "ion:water-sharp",
+  "ion:waterdrop",
+  "ion:wifi",
+  "ion:wifi-outline",
+  "ion:wifi-sharp",
+  "ion:wine",
+  "ion:wine-outline",
+  "ion:wine-sharp",
+  "ion:wineglass",
+  "ion:woman",
+  "ion:woman-outline",
+  "ion:woman-sharp",
+  "ion:wrench",
+  "ion:xbox"
+]

+ 170 - 0
src/components/Icon/src/IconPicker.vue

@@ -0,0 +1,170 @@
+<template>
+  <a-input
+    disabled
+    :style="{ width }"
+    :placeholder="t('component.icon.placeholder')"
+    v-model:value="currentSelect"
+    :class="prefixCls"
+  >
+    <template #addonAfter>
+      <Popover
+        placement="bottomLeft"
+        trigger="click"
+        v-model="visible"
+        :overlayClassName="`${prefixCls}-popover`"
+      >
+        <template #title>
+          <div class="flex justify-between">
+            <a-input
+              :placeholder="t('component.icon.search')"
+              @change="handleSearchChange"
+              allowClear
+            />
+          </div>
+        </template>
+
+        <template #content>
+          <div v-if="getPaginationList.length">
+            <ScrollContainer class="border border-solid border-t-0">
+              <ul class="flex flex-wrap px-2">
+                <li
+                  v-for="icon in getPaginationList"
+                  :key="icon"
+                  :class="currentSelect === icon ? 'bg-primary text-white' : ''"
+                  class="p-2 w-1/8 cursor-pointer mr-1 mt-1 flex justify-center items-center border border-solid hover:bg-primary hover:text-white"
+                  @click="handleClick(icon)"
+                >
+                  <Icon :icon="icon" />
+                </li>
+              </ul>
+            </ScrollContainer>
+            <div class="flex py-2 items-center justify-center">
+              <Pagination
+                showLessItems
+                size="small"
+                :pageSize="pageSize"
+                :total="getTotal"
+                @change="handlePageChange"
+              />
+            </div>
+          </div>
+          <template v-else
+            ><div class="p-5"> <Empty /></div>
+          </template>
+        </template>
+        <Icon :icon="currentSelect || 'ion:apps-outline'" class="cursor-pointer px-2 py-1" />
+      </Popover>
+    </template>
+  </a-input>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, watchEffect, watch, unref } from 'vue';
+
+  import { useDesign } from '/@/hooks/web/useDesign';
+  import { ScrollContainer } from '/@/components/Container';
+
+  import { Input, Popover, Pagination, Empty } from 'ant-design-vue';
+  import Icon from './index.vue';
+
+  import icons from '../json/ion-info.json';
+  import { propTypes } from '/@/utils/propTypes';
+  import { usePagination } from '/@/hooks/web/usePagination';
+  import { useDebounce } from '/@/hooks/core/useDebounce';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { useMessage } from '/@/hooks/web/useMessage';
+
+  export default defineComponent({
+    name: 'IconPicker',
+    components: { [Input.name]: Input, Icon, Popover, ScrollContainer, Pagination, Empty },
+    props: {
+      value: propTypes.string,
+      width: propTypes.string.def('100%'),
+      pageSize: propTypes.number.def(140),
+      copy: propTypes.bool.def(false),
+    },
+    emits: ['change'],
+    setup(props, { emit }) {
+      const currentSelect = ref('');
+      const visible = ref(false);
+      const currentList = ref(icons);
+
+      const { prefixCls } = useDesign('icon-picker');
+      const { t } = useI18n();
+      const [debounceHandleSearchChange] = useDebounce(handleSearchChange, 100);
+      const { clipboardRef, isSuccessRef } = useCopyToClipboard(props.value);
+      const { createMessage } = useMessage();
+
+      const { getPaginationList, getTotal, setCurrentPage } = usePagination(
+        currentList,
+        props.pageSize
+      );
+
+      watchEffect(() => {
+        currentSelect.value = props.value;
+      });
+
+      watch(
+        () => currentSelect.value,
+        (v) => emit('change', v)
+      );
+
+      function handlePageChange(page: number) {
+        setCurrentPage(page);
+      }
+
+      function handleClick(icon: string) {
+        currentSelect.value = icon;
+        if (props.copy) {
+          clipboardRef.value = icon;
+          if (unref(isSuccessRef)) {
+            createMessage.success(t('component.icon.copy'));
+          }
+        }
+      }
+
+      function handleSearchChange(e: ChangeEvent) {
+        const value = e.target.value;
+        if (!value) {
+          setCurrentPage(1);
+          currentList.value = icons;
+          return;
+        }
+        currentList.value = icons.filter((item) => item.includes(value));
+      }
+
+      return {
+        t,
+        prefixCls,
+        visible,
+        getTotal,
+        getPaginationList,
+        handlePageChange,
+        handleClick,
+        currentSelect,
+        handleSearchChange: debounceHandleSearchChange,
+      };
+    },
+  });
+</script>
+<style lang="less">
+  @prefix-cls: ~'@{namespace}-icon-picker';
+
+  .@{prefix-cls} {
+    .ant-input-group-addon {
+      padding: 0;
+    }
+
+    &-popover {
+      width: 300px;
+
+      .ant-popover-inner-content {
+        padding: 0;
+      }
+
+      .scrollbar {
+        height: 220px;
+      }
+    }
+  }
+</style>

+ 1 - 0
src/components/Icon/src/index.vue

@@ -16,6 +16,7 @@
   import Iconify from '@purge-icons/generated';
   import { isString } from '/@/utils/is';
   import { propTypes } from '/@/utils/propTypes';
+
   export default defineComponent({
     name: 'GIcon',
     props: {

+ 1 - 1
src/components/SimpleMenu/src/index.less

@@ -51,7 +51,7 @@
     }
 
     &--dot {
-      top: calc(50% - 4px);
+      top: calc(50% - 2px);
       width: 6px;
       height: 6px;
       padding: 0;

+ 1 - 1
src/design/ant/index.less

@@ -14,7 +14,7 @@
 }
 
 span.anticon:not(.app-iconify) {
-  vertical-align: 0.125em;
+  vertical-align: 0.135em;
 }
 
 .ant-back-top {

+ 34 - 0
src/hooks/web/usePagination.ts

@@ -0,0 +1,34 @@
+import type { Ref } from 'vue';
+import { ref, unref, computed } from 'vue';
+
+function pagination<T = any>(list: T[], pageNo: number, pageSize: number): T[] {
+  const offset = (pageNo - 1) * Number(pageSize);
+  const ret =
+    offset + Number(pageSize) >= list.length
+      ? list.slice(offset, list.length)
+      : list.slice(offset, offset + Number(pageSize));
+  return ret;
+}
+
+export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
+  const currentPage = ref(1);
+  const pageSizeRef = ref(pageSize);
+
+  const getPaginationList = computed(() => {
+    return pagination(unref(list), unref(currentPage), unref(pageSizeRef));
+  });
+
+  const getTotal = computed(() => {
+    return unref(list).length;
+  });
+
+  function setCurrentPage(page: number) {
+    currentPage.value = page;
+  }
+
+  function setPageSize(pageSize: number) {
+    pageSizeRef.value = pageSize;
+  }
+
+  return { setCurrentPage, getTotal, setPageSize, getPaginationList };
+}

+ 5 - 0
src/locales/lang/en/component/icon.ts

@@ -0,0 +1,5 @@
+export default {
+  placeholder: 'Click the select icon',
+  search: 'Search icon',
+  copy: 'Copy icon successfully!',
+};

+ 5 - 0
src/locales/lang/zh_CN/component/icon.ts

@@ -0,0 +1,5 @@
+export default {
+  placeholder: '点击选择图标',
+  search: '搜索图标',
+  copy: '复制图标成功!',
+};

+ 2 - 12
src/router/menus/modules/demo/comp.ts

@@ -6,9 +6,7 @@ const menu: MenuModule = {
   menu: {
     name: t('routes.demo.comp.comp'),
     path: '/comp',
-    tag: {
-      dot: true,
-    },
+
     children: [
       {
         path: 'basic',
@@ -52,9 +50,7 @@ const menu: MenuModule = {
       {
         path: 'table',
         name: t('routes.demo.table.table'),
-        tag: {
-          dot: true,
-        },
+
         children: [
           {
             path: 'basic',
@@ -111,16 +107,10 @@ const menu: MenuModule = {
           {
             path: 'editCellTable',
             name: t('routes.demo.table.editCellTable'),
-            tag: {
-              dot: true,
-            },
           },
           {
             path: 'editRowTable',
             name: t('routes.demo.table.editRowTable'),
-            tag: {
-              dot: true,
-            },
           },
         ],
       },

+ 4 - 6
src/router/menus/modules/demo/feat.ts

@@ -14,6 +14,9 @@ const menu: MenuModule = {
       {
         path: 'icon',
         name: t('routes.demo.feat.icon'),
+        tag: {
+          content: 'new',
+        },
       },
       {
         path: 'tabs',
@@ -51,9 +54,6 @@ const menu: MenuModule = {
       {
         path: 'ripple',
         name: t('routes.demo.feat.ripple'),
-        tag: {
-          content: 'new',
-        },
       },
       {
         path: 'full-screen',
@@ -89,9 +89,7 @@ const menu: MenuModule = {
       {
         name: t('routes.demo.feat.breadcrumb'),
         path: 'breadcrumb',
-        tag: {
-          content: 'new',
-        },
+
         children: [
           {
             path: 'flat',

+ 13 - 0
src/router/menus/modules/demo/system.ts

@@ -6,20 +6,33 @@ const menu: MenuModule = {
   menu: {
     name: t('routes.demo.system.moduleName'),
     path: '/system',
+    tag: {
+      dot: true,
+    },
     children: [
       {
         path: 'account',
         name: t('routes.demo.system.account'),
+        tag: {
+          dot: true,
+          type: 'warn',
+        },
       },
 
       {
         path: 'dept',
         name: t('routes.demo.system.dept'),
+        tag: {
+          content: 'new',
+        },
       },
 
       {
         path: 'changePassword',
         name: t('routes.demo.system.password'),
+        tag: {
+          content: 'new',
+        },
       },
     ],
   },

+ 1 - 1
src/settings/projectSetting.ts

@@ -19,7 +19,7 @@ const setting: ProjectConfig = {
   settingButtonPosition: SettingButtonPositionEnum.AUTO,
 
   // Permission mode
-  permissionMode: PermissionModeEnum.BACK,
+  permissionMode: PermissionModeEnum.ROLE,
 
   // Permission-related cache is stored in sessionStorage or localStorage
   permissionCacheType: CacheTypeEnum.SESSION,

+ 13 - 6
src/views/demo/feat/icon/index.vue

@@ -14,17 +14,23 @@
 
     <CollapseContainer title="IconIfy 组件使用" class="my-5">
       <div class="flex justify-around flex-wrap">
-        <Icon icon="fa-solid:address-book" :size="30" />
-        <Icon icon="mdi-light:bank" :size="30" />
-        <Icon icon="jam:alien-f" :size="30" />
-        <Icon icon="jam:android" :size="30" />
+        <Icon icon="ion:layers-outline" :size="30" />
+        <Icon icon="ion:bar-chart-outline" :size="30" />
+        <Icon icon="ion:tv-outline" :size="30" />
+        <Icon icon="ion:settings-outline" :size="30" />
+      </div>
+    </CollapseContainer>
+
+    <CollapseContainer title="图标选择器" class="my-5">
+      <div class="flex justify-around flex-wrap">
+        <IconPicker />
       </div>
     </CollapseContainer>
 
     <Alert
       show-icon
       message="推荐使用Iconify组件"
-      description="Icon组件基本包含所有的图标,在下面网址内你可以查询到你想要的任何图标。并且打包只会打包所用到的图标。唯一不足的可能就是需要连接外网进行使用。"
+      description="Icon组件基本包含所有的图标,在下面网址内你可以查询到你想要的任何图标。并且打包只会打包所用到的图标。"
     />
     <a-button type="link" @click="toIconify"> Iconify 图标大全 </a-button>
   </PageWrapper>
@@ -43,7 +49,7 @@
     CodepenCircleFilled,
   } from '@ant-design/icons-vue';
 
-  import Icon from '/@/components/Icon/index';
+  import { Icon, IconPicker } from '/@/components/Icon/index';
 
   import { openWindow } from '/@/utils';
   import { PageWrapper } from '/@/components/Page';
@@ -61,6 +67,7 @@
       CodepenCircleFilled,
       Icon,
       Alert,
+      IconPicker,
     },
     setup() {
       return {

+ 5 - 1
windi.config.ts

@@ -2,13 +2,17 @@ import lineClamp from 'windicss/plugin/line-clamp';
 import colors from 'windicss/colors';
 
 import { defineConfig } from 'vite-plugin-windicss';
+import { primaryColor } from './build/config/themeConfig';
 
 export default defineConfig({
   darkMode: 'class',
   plugins: [lineClamp, createEnterPlugin()],
   theme: {
     extend: {
-      colors,
+      colors: {
+        ...colors,
+        primary: primaryColor,
+      },
       screens: {
         sm: '576px',
         md: '768px',

+ 63 - 7
yarn.lock

@@ -1307,10 +1307,10 @@
   resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
   integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
 
-"@types/fs-extra@^9.0.7":
-  version "9.0.7"
-  resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.7.tgz#a9ef2ffdab043def080c5bec94c03402f793577f"
-  integrity sha512-YGq2A6Yc3bldrLUlm17VNWOnUbnEzJ9CMgOeLFtQF3HOCN5lQBO8VyjG00a5acA5NNSM30kHVGp1trZgnVgi1Q==
+"@types/fs-extra@^9.0.8":
+  version "9.0.8"
+  resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.8.tgz#32c3c07ddf8caa5020f84b5f65a48470519f78ba"
+  integrity sha512-bnlTVTwq03Na7DpWxFJ1dvnORob+Otb8xHyUqUWhqvz/Ksg8+JXPlR52oeMSZ37YEOa5PyccbgUNutiQdi13TA==
   dependencies:
     "@types/node" "*"
 
@@ -1379,6 +1379,14 @@
   dependencies:
     "@types/node" "*"
 
+"@types/inquirer@^7.3.1":
+  version "7.3.1"
+  resolved "https://registry.npmjs.org/@types/inquirer/-/inquirer-7.3.1.tgz#1f231224e7df11ccfaf4cf9acbcc3b935fea292d"
+  integrity sha512-osD38QVIfcdgsPCT0V3lD7eH0OFurX71Jft18bZrsVQWVRt6TuxRzlr0GJLrxoHZR2V5ph7/qP8se/dcnI7o0g==
+  dependencies:
+    "@types/through" "*"
+    rxjs "^6.4.0"
+
 "@types/json-schema@^7.0.3":
   version "7.0.7"
   resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
@@ -1480,6 +1488,13 @@
   resolved "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.3.tgz#4684af265b4e1125c738f5aaafb302c723f4efe0"
   integrity sha512-eDLVUvvTn+mol3NpP211DTH9JzSS6YKssRIhHNmXk5BiCl+gc4s+xQQjRFTSsGBohmka5qBsHX6qhL4x88Wkvg==
 
+"@types/through@*":
+  version "0.0.30"
+  resolved "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895"
+  integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==
+  dependencies:
+    "@types/node" "*"
+
 "@types/tinycolor2@^1.4.2":
   version "1.4.2"
   resolved "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz#721ca5c5d1a2988b4a886e35c2ffc5735b6afbdf"
@@ -1802,7 +1817,7 @@ ansi-escapes@^3.2.0:
   resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
 
-ansi-escapes@^4.3.0:
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
   version "4.3.1"
   resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
   integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
@@ -2537,6 +2552,11 @@ cli-width@^2.0.0:
   resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
   integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
 
+cli-width@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
+  integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+
 cliui@^5.0.0:
   version "5.0.0"
   resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@@ -4015,7 +4035,7 @@ figures@^2.0.0:
   dependencies:
     escape-string-regexp "^1.0.5"
 
-figures@^3.2.0:
+figures@^3.0.0, figures@^3.2.0:
   version "3.2.0"
   resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
   integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
@@ -5000,6 +5020,25 @@ inquirer@6.5.2:
     strip-ansi "^5.1.0"
     through "^2.3.6"
 
+inquirer@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.0.0.tgz#957a46db1abcf0fdd2ab82deb7470e90afc7d0ac"
+  integrity sha512-ON8pEJPPCdyjxj+cxsYRe6XfCJepTxANdNnTebsTuQgXpRyZRRT9t4dJwjRubgmvn20CLSEnozRUayXyM9VTXA==
+  dependencies:
+    ansi-escapes "^4.2.1"
+    chalk "^4.1.0"
+    cli-cursor "^3.1.0"
+    cli-width "^3.0.0"
+    external-editor "^3.0.3"
+    figures "^3.0.0"
+    lodash "^4.17.21"
+    mute-stream "0.0.8"
+    run-async "^2.4.0"
+    rxjs "^6.6.6"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+    through "^2.3.6"
+
 interpret@^1.0.0:
   version "1.4.0"
   resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
@@ -5720,6 +5759,11 @@ lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17
   resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
   integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
 
+lodash@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
 log-symbols@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
@@ -6176,6 +6220,11 @@ mute-stream@0.0.7:
   resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
   integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
 
+mute-stream@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
 nanoid@^3.0.1, nanoid@^3.1.20:
   version "3.1.20"
   resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
@@ -7536,7 +7585,7 @@ rollup@^2.39.0:
   optionalDependencies:
     fsevents "~2.3.1"
 
-run-async@^2.2.0:
+run-async@^2.2.0, run-async@^2.4.0:
   version "2.4.1"
   resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
   integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
@@ -7553,6 +7602,13 @@ rxjs@^6.4.0, rxjs@^6.6.3:
   dependencies:
     tslib "^1.9.0"
 
+rxjs@^6.6.6:
+  version "6.6.6"
+  resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70"
+  integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==
+  dependencies:
+    tslib "^1.9.0"
+
 safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"